XPathを用いると、きめ細かく要素を指定できるようです。
たとえばamachangさんによるscript要素取得コードは以下のようなXPath式で表現可能です。
createElementで動的に生成されたscript要素を、その時点でのDOMツリーの末尾以外の任意の位置にappendChildしている場合には要素を取得できずにnullを返すか、ブラウザが解析中にたまたま末尾に存在する別のscript要素が返されます。
静的にHTMLで記述されたscript要素についてはその心配はありません。
var currentScript = !!(document.implementation && document.implementation.hasFeature && document.implementation.hasFeature('XPath', '3.0'))
? document.evaluate(
'//*[local-name()="SCRIPT" or local-name()="script"][not(ancestor-or-self::*[following-sibling::*])]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue
: (function(e){
return (!e) ? null
: (e.nodeName.toLowerCase() == 'script') ? e
: arguments.callee(e.lastChild);
})(document)
;
探索対象文書(XML, HTML)、ブラウザの種類によってXPath式で判定可能な要素名の大文字・小文字の種別に影響があるようです。
たとえば、このブログのアドレスバーで以下のブックマークレットを実行した場合、Firefox2とOpera9で挙動が異なります。IEは現時点でXPathをサポートしていないため両方ともエラーとなります。
XPathでscript要素を抽出し、成功したらnodeNameを表示します。
■大文字(SCRIPT)でXPathにより要素抽出
○ Firefox2
× Opera9
× IE
javascript: try{alert(document.evaluate('//*[local-name()="SCRIPT"]',document,null,9,null).singleNodeValue.nodeName);}catch(e){alert(e);};
■小文字(script)でXPathにより要素抽出
× Firefox2
○ Opera9
× IE
javascript: try{alert(document.evaluate('//*[local-name()="script"]',document,null,9,null).singleNodeValue.nodeName);}catch(e){alert(e);};
資料

0 件のコメント:
コメントを投稿