カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

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

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


の注意点。

とてもシンプルに自分自身が属する script 要素を取得docment.write相当のことをDOMで行うのに非常に便利なんですが、 他でもないdocument.writeと非常に相性が悪いみたいです。

どういう事かと言うと、自分自身が属する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化については、

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

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

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

発案者のid:amachang氏曰く、

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

との事。

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

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