カラクリサイクル

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

document.writeをDOM仕様にする

概要: Javascriptのdocument.writeをDOM仕様にする。


追記:2006-12-16T18:11:00+09:00

document.writedocument.writelnをDOM仕様にし、 document.writedocument.writelnを使ったコードをMIME-Typeapplication/xhtml+xml なページでほぼそのまま動かせるスクリプトを書きました。

詳しくはapplication/xhtml+xmlなページでdocument.writeを動作させるを閲覧してください。

追記終了

IT戦記id:amachangさんのエントリ、 とてもシンプルに自分自身が属する script 要素を取得をみて、 document.writeの代用になる関数作れそうだと思い、実際やってみたらできたので、メモ。

こんな感じ。

var currentScript = (function (e) {
    if(e.nodeName.toLowerCase() == 'script') return e;
    return arguments.callee(e.lastChild)
})(document);
document.write = function ( node, referenceNode ) {
    if ( typeof(referenceNode) == 'undefined' ) {
        referenceNode = currentScript;
    }
    referenceNode.parentNode.insertBefore( node, referenceNode.nextSibling );
}

currentScriptの取得はid:amachangさんのコードそのまま。 document.write書き換えてるけど、別にそうしなくても動く。

document.writeは大体、挿入されたscript要素の後ろに内容を書き出すので、 それをDOMで完全に再現しようとすると、どうしても基準となるscript要素を取得する必要が出てくる。

で、今までは取得の仕方が分からなくてできないと思っていたんだけど、 id:amachangさんのコードで、script要素が取得できたので、 代用品ができたというわけ。

使い道としては、Blogパーツなんかを追加するJavascriptをMIME-Typeapplication/xhtml+xml なページにおいてdocument.writeと同じような感じで要素を追加したいときに使える。ような気がする。 (application/xhtml+xmlな環境で実際に動かしてはないので、きちんと動くかどうか不明)

ただ上記のコードだと、まったく問題がないとは言い切れないので、実際に利用する場合は、 何らかの工夫が必要だと思う。

にしても、こんなコードを思いつくid:amachangさんはすごいです。