XPathサポート判定コード
!!document.evaluate以外での判定方法。
var hasXPath = (function(){ try{ return document.implementation.hasFeature('XPath','3.0') }catch(e){ return !1 } })();
あるいは、
var hasXPath = (function(i,f){return f in i&&i[f]('XPath','3.0')})(document.implementation||{},'hasFeature');
ただし、もしもObject.prototype.hasFeatureが操作されていたら誤判定はありうる。
別の方法。WindowsXPのIE6,IE7,IE8β,Firefox3,Opera9.6,Chrome1.0で動作確認しました。
Linux、Macなどの別環境を考慮したとき正規表現を変えるべきか、未確認です。
var hasXPath = !!document.evaluate && typeof(document.evaluate)=='function' && /^function\s(evaluate)?\(\)\s\{\n?\s*\[native\scode\]\s?\n?\}$/.test(document.evaluate);
もし、下記のように書き換えられたらXPath機能ないのに誤作動してしまう。
document.evaluate = function(){}; document.evaluate.toString = function(){ return 'function () { [native code] }'; };
たとえ上記に対処しても、今度は、Object.prototype.toString、Function.prototype.toStringといった組み込み関数も書き換えることができるので、それらが変更されているか検知できない限り厳密な判定はできない、ということになりそう。そんな方法がクロスブラウザなjavascriptであるのだろうか。ごくまれな例外的な事態にも対応できる厳密な方法がないのなら、簡便なやりかたが現実的で結局、良さそう。!!document.evaluateだけでは、name属性がevaluateなimgタグがあるときにうまく動作しないそうだけれども、XPathを使うライブラリを導入するサイト管理者はその事態を避けることがおそらく可能だから。
もしかして、充分多くの場合、正しく動作する現実的な対策はあるけれども、あらゆる事態に対して厳密に判定できる方法はない、つまりjavascriptのライブラリが厳密に判定できないjavascriptに関する事柄があるといえるのかな。javascriptで記述される世界での真偽判定不能な命題ってあるとしたらどんな性質をもつんだろう。
組み込みオブジェクトにたいして安易に書き換えをしない、という暗黙の前提が利用者や開発者にあって、それが安定した秩序を支えているという構図なのかな。厳密さを論じるのが難しくても実用的な解が存在するケースって多そう。自然にも人の社会にも。そういう構造って理解が困難だったり到達不可能だったり精緻だったり複雑だったりするのかな。