126 lines
2.7 KiB
JavaScript
126 lines
2.7 KiB
JavaScript
|
/*
|
||
|
** DOM module - base on https://github.com/kylebarrow/chibi with IE hacks removed
|
||
|
**
|
||
|
*/
|
||
|
var readyfn = [],
|
||
|
loadedfn = [],
|
||
|
domready = false,
|
||
|
pageloaded = false,
|
||
|
d = document,
|
||
|
w = window;
|
||
|
|
||
|
// Fire any function calls on ready event
|
||
|
function fireReady() {
|
||
|
var i;
|
||
|
domready = true;
|
||
|
for (i = 0; i < readyfn.length; i += 1) {
|
||
|
readyfn[i]();
|
||
|
}
|
||
|
readyfn = [];
|
||
|
}
|
||
|
|
||
|
// Fire any function calls on loaded event
|
||
|
function fireLoaded() {
|
||
|
var i;
|
||
|
pageloaded = true;
|
||
|
for (i = 0; i < loadedfn.length; i += 1) {
|
||
|
loadedfn[i]();
|
||
|
}
|
||
|
loadedfn = [];
|
||
|
}
|
||
|
|
||
|
// Check DOM ready, page loaded
|
||
|
if (d.addEventListener) {
|
||
|
// Standards
|
||
|
d.addEventListener('DOMContentLoaded', fireReady, false);
|
||
|
w.addEventListener('load', fireLoaded, false);
|
||
|
}
|
||
|
|
||
|
// Loop through node array
|
||
|
function nodeLoop(fn, nodes) {
|
||
|
var i;
|
||
|
// Good idea to walk up the DOM
|
||
|
for (i = nodes.length - 1; i >= 0; i -= 1) {
|
||
|
fn(nodes[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function dom(selector) {
|
||
|
var self, nodes = [],
|
||
|
json = false,
|
||
|
nodelist;
|
||
|
|
||
|
if (selector) {
|
||
|
|
||
|
// Element node
|
||
|
if (selector instanceof HTMLElement) {
|
||
|
nodes = [selector]; // return element as node list
|
||
|
} else if (selector instanceof NodeList) {
|
||
|
// JSON, document object or node list
|
||
|
json = (typeof selector.length !== 'number');
|
||
|
nodes = selector;
|
||
|
} else if (typeof selector === 'string') {
|
||
|
nodelist = d.querySelectorAll(selector);
|
||
|
nodes = Array.from(nodelist);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Only attach nodes if not JSON
|
||
|
self = json ? {} : nodes;
|
||
|
|
||
|
// Public functions
|
||
|
|
||
|
// Fire on DOM ready
|
||
|
self.ready = function(fn) {
|
||
|
if (fn) {
|
||
|
if (domready) {
|
||
|
fn();
|
||
|
return self;
|
||
|
} else {
|
||
|
readyfn.push(fn);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
// Fire on page loaded
|
||
|
self.loaded = function(fn) {
|
||
|
if (fn) {
|
||
|
if (pageloaded) {
|
||
|
fn();
|
||
|
return self;
|
||
|
} else {
|
||
|
loadedfn.push(fn);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Executes a function on nodes
|
||
|
self.each = function(fn) {
|
||
|
if (typeof fn === 'function') {
|
||
|
nodeLoop(fn, nodes);
|
||
|
}
|
||
|
return self;
|
||
|
};
|
||
|
|
||
|
self.first = function() {
|
||
|
return dom(nodes.shift());
|
||
|
};
|
||
|
|
||
|
// Find last
|
||
|
self.last = function() {
|
||
|
return dom(nodes.pop());
|
||
|
};
|
||
|
|
||
|
// append html before end of the of the tag
|
||
|
self.append = function(value) {
|
||
|
if (value) {
|
||
|
nodeLoop(function(elm) {
|
||
|
elm.insertAdjacentHTML('beforeend', value);
|
||
|
}, nodes);
|
||
|
}
|
||
|
return self;
|
||
|
};
|
||
|
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
export default dom;
|