NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
var DOM = {
create(tag, classes, attributes, content) {
let elem = document.createElement(tag);
elem.className = classes;
for (let attribute in attributes) {
elem.setAttribute(attribute, attributes[attribute]);
}
if (content) {
if (content instanceof HTMLElement) {
elem.appendChild(content);
} else {
elem.innerHTML = content;
}
}
return elem;
},
queryAll(selector, elem) {
elem = elem instanceof HTMLElement ? elem : document;
const toArray = function(coll, fromIndex) {
return Array.prototype.slice.call(coll, fromIndex);
};
return toArray(elem.querySelectorAll(selector));
},
query(selector, elem) {
let ret = DOM.queryAll(selector, elem);
return ret.length > 0 ? ret[0] : null;
},
//TODO: Refactor this -- it is way too slow; Element.matches(selector)
getClosest(elem, selector, inclusive = false) {
let firstChar = selector.charAt(0);
// Get closest match
for (; elem && elem !== document; elem = elem.parentNode) {
// If selector is a class
if (firstChar === '.') {
if (elem.classList.contains(selector.substr(1))) {
return elem;
}
}
// If selector is an ID
if (firstChar === '#') {
if (elem.id === selector.substr(1)) {
return elem;
}
}
// If selector is a data attribute
if (firstChar === '[') {
if (elem.hasAttribute(selector.substr(1, selector.length - 2))) {
return elem;
}
}
// If selector is a tag
if (elem.tagName.toLowerCase() === selector) {
return elem;
}
}
return false;
}
};