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

概要: とてもシンプルに自分自身が属する 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

nyarlaが大体

Scrapbox でコメントや意見を書く