Skip to content

Instantly share code, notes, and snippets.

@os0x
Created October 24, 2008 15:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save os0x/19461 to your computer and use it in GitHub Desktop.
Save os0x/19461 to your computer and use it in GitHub Desktop.
// $XA
//
// $XA(exp, context, resolver).forEach(function(node){});
function $XA (exp, context, resolver) {
context || (context = document);
var XPE = new XPathEvaluator();
var Doc = context.ownerDocument || context, expr = XPE.createExpression(exp, resolver ? resolver :
Doc.documentElement.namespaceURI ? function(prefix) {
return XPE.createNSResolver(Doc.documentElement).lookupNamespaceURI(prefix) ||
context.namespaceURI || document.documentElement.namespaceURI || "";
} : null);
var result = expr.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
result = expr.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, result);
var length = result.snapshotLength;
return {
toA:function(){
for (var i = 0, len = length, res = new Array(len); i < len; ++i)
res[i] = result.snapshotItem(i);
return res;
},
forEach:function(func, thisObject){
for (var i = 0, len = length; i < len; ++i)
func.call(thisObject,result.snapshotItem(i), i);
},
map:function(func, thisObject){
for (var i = 0, len = length, res = []; i < len; ++i)
res.push(func.call(thisObject,result.snapshotItem(i)));
return res;
},
filter:function(func, thisObject){
for (var i = 0, len = length, res = [], node; i < len; ++i)
if (func.call(thisObject,node = result.snapshotItem(i))) res.push(node);
return res;
},
mapfilter:function(func, thisObject){
for (var i = 0, len = length, res = [], node; i < len; ++i)
if (node = func.call(thisObject,result.snapshotItem(i))) res.push(node);
return res;
}
};
}
return null;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment