概要: Javascript のdocument.writeを DOM 仕様にする。
追記:2006-12-16T18:11:00+09:00
document.writeやdocument.writelnを DOM 仕様にし、
document.writeやdocument.writelnを使ったコードをMIME-Typeがapplication/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-Typeがapplication/xhtml+xmlなページにおいてdocument.writeと同じような感じで要素を追加したいときに使える。ような気がする。(application/xhtml+xmlな環境で実際に動かしてはないので、きちんと動くかどうか不明)
ただ上記のコードだと、まったく問題がないとは言い切れないので、実際に利用する場合は、何らかの工夫が必要だと思う。
にしても、こんなコードを思いつく id:amachang さんはすごいです。