「とてもシンプルに自分自身が属する script 要素を取得」の注意点

読了まで:約2分


概要: とてもシンプルに自分自身が属する script 要素を取得


の注意点。

どういう事かと言うと、自分自身が属する script 要素の取得の前にdocument.write使うと、 自分自身が属する script 要素の取得が動かなくなります。

以下実証コード。要素の取得の部分は id:amachang さんのコードそのままです。

document.write('hoge');
// 動かない
var current = (function (e) {
if( e.nodeName.toLowerCase() == 'script' ) return e;
return arguments.callee(e.lastChild)
})(document);

あってるかどうか分からないんですが、document.write使うと、 どうも script 要素がnullになるらしく(それっぽい挙動はしている)、 それ故に script 要素の取得に失敗する、と言うことみたいです。

回避方法としては、document.writeを使わないか、document.writeを DOM 化する、 という事ぐらいしか思いつきません。

ちなみにdocument.writeでしか説明してませんが、document.writelnでも同じことが言えます。 あと、document.writeの DOM 化については、

  • [[application/xhtml+xml なページで document.write を動作させる /post/50791032719]]
  • [[application/xhtml+xml なページで document.write を動作させる #2 /post/50791064107]]

あたり参照してください。

にしても、document.writeと相性悪いとは。

追記:2007-01-21T09:50:00

発案者の id:amachang 氏曰く、

引用元: IT 戦ブクマ script タグが null になるのではなく、 TextNode が挿入されたため、 script タグが lastChild でなくなるのが原因です ^^;

との事。

alert使ってテストしていたときにnullが出てきたのは、 おそらくTextNode.lastChildを参照しているためっぽい。

なんとなく回避方法は見えてきたので、何とかなりそう。 な気がする、……ようなしないような。どっちだ。

#FIXME

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。