前々からいちいちあのクソながったらしい evaluate を書くのがだるかったのでちゃんと関数はさむようにした。
大きなバグがあります。詳細はXPath, $X function, NSResolverに書きました。以下のコードは非推奨です。
$X = function (exp, context) { if (!context) context = document; var result = document.evaluate(exp, context, null, 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 = document.evaluate(exp, context, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var ret = []; for (var i = 0, len = result.snapshotLength; i < len ; i++) { ret.push(result.snapshotItem(i)); } return ret; } } return null; } alert($X("//p")); // Array of p elements alert($X("count(//node())")); // => node number alert($X("count(//body) = 1")); //=> must be true // Firefox が嫌いになる GM スクリプト if ($X("contains(string(/), 'Firefox')")) { alert("I LOVE FIREFOX!"); }
これでコピペ地獄から開放される。