[Javascript] 外部スクリプトから呼び出されているjavascriptファイルのパスを取得する関数

どこかで似たようなエントリーを見かけたけど見つからないので自作してみた。問題が多く実用的じゃないので注意

IE7,Firefox2,Safari2,Opera9.20で確認して動いてたので実用で使っても大丈夫。

HTMLリード中にjavascriptが解釈されることを想定して

下記のコードをscriptタグで指定して開く

var getScriptPath = function(){
  var f=function(e){
    var name=e.tagName;
    if(!!name && name.toUpperCase()=='SCRIPT') return e;
    var c=e.lastChild;
    return (!!c)?f(c):null;
  };
  var es=f(document);
  if(!es) return window.location;
  return es.getAttribute('src') || window.location;
};
alert(getScriptPath());
<html>
<head>
<script type="text/javascript" src="lib/js/getscriptpath.js"></script>
</head>
<body>
</body>
</html>

実行するとアラートで「lib/js/getscriptpath.js」と表示されます。

前提
  • ブラウザのHTMLパーサがSAXっぽく要素(タグ)を解釈してDOMツリーを構築している
  • スクリプトが読み込まれ次第実行。
問題点
  • 動的にDOMを書き換えて読み込まれてるスクリプトには無効
    • 関数の仕組み的に読み込み中のDOMを参照して値を取得しているから
  • Operaじゃ取得できない。Operaでも取得できる!

そのた

Element.tagNameは念のため大文字に変換してるけど、必要ないかもXHTMLでも大文字が取れるし、