polyfill-service
Version:
A polyfill combinator
55 lines (41 loc) • 1.35 kB
JavaScript
(function (global) {
var
head = document.getElementsByTagName('head')[0];
function getElementsByQuery(node, selector, one) {
var
generator = document.createElement(),
id = 'qsa' + String(Math.random()).slice(3),
style, elements;
generator.innerHTML = 'x<style>' + selector + '{qsa:' + id + ';}';
style = head.appendChild(generator.lastChild);
elements = getElements(node, selector, one, id);
head.removeChild(style);
return one ? elements[0] : elements;
}
function getElements(node, selector, one, id) {
var
validNode = /1|9/.test(node.nodeType),
childNodes = node.childNodes,
elements = [],
index = -1,
childNode;
if (validNode && node.currentStyle && node.currentStyle.qsa === id) {
if (elements.push(node) && one) {
return elements;
}
}
while (childNode = childNodes[++index]) {
elements = elements.concat(getElements(childNode, selector, one, id));
if (one && elements.length) {
return elements;
}
}
return elements;
}
Document.prototype.querySelector = Element.prototype.querySelector = function querySelectorAll(selector) {
return getElementsByQuery(this, selector, true);
};
Document.prototype.querySelectorAll = Element.prototype.querySelectorAll = function querySelectorAll(selector) {
return getElementsByQuery(this, selector, false);
};
})(this);