Skip to content

Instantly share code, notes, and snippets.

@3rd-Eden
Forked from WebReflection/document.retrieveSelector.js
Created October 30, 2011 19:15
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 3rd-Eden/1326301 to your computer and use it in GitHub Desktop.
Save 3rd-Eden/1326301 to your computer and use it in GitHub Desktop.
retrieve a CSS selector out of a DOM node
(function () {
var all = document.getElementsByTagName('*')
, matches = 0
, misses = 0
, total = all.length
, i = all.length
, selector
, match;
while (i--) {
selector = document.retrieveSelector(all[i]);
match = document.querySelector(selector);
if (all[i] !== match) {
misses++;
console.log('Failed', selector, match, all[i]);
} else {
matches++;
}
}
console.log('Misses: %d, Matches: %d, Total: %d', misses, matches, total);
})();
document.retrieveSelector = (function (filter) {
// (C) WebReflection - Mit Style License
function elementsOnly(element) {
return element.nodeType == 1;
}
function createSelector(element, documentElement, path, first) {
var
nodeName = element.nodeName,
parentNode = element.parentNode
;
switch (true) {
case !!element.id:
path.push("#" + element.id);
break;
case first:
first = !first;
nodeName += ":nth-child(" + (
1 + filter.call(parentNode.childNodes, elementsOnly).indexOf(element)
) + ")";
case element != documentElement:
createSelector(parentNode, documentElement, path);
default:
path.push(nodeName);
break;
}
return path;
}
// partial polyfill for this code purpose only
filter || (filter = function () {
function indexOf(o) { // node always unique
for (var i = this.length; i-- && this[i] !== o;);
return i;
}
return function (fn) {
for (var r = [], i = 0, length = this.length; i < length; i++) {
fn(this[i]) && r.push(this[i]);
}
r.indexOf = indexOf;
return r;
};
}());
return function retrieveSelector(element) {
var ownerDocument = element.ownerDocument;
return ownerDocument ? createSelector(
element.nodeType != 1 ? element.parentNode : element,
ownerDocument.documentElement,
[],
true
).join(">") : "";
};
}([].filter));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment