2007-11-13

XPath/DOM : javascriptファイルの呼び出し元script要素を取得する

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 件のコメント: