CSS切替スクリプトを書いてみる(徒書)で、なるべくDOM標準に沿った感じのCSS切替スクリプト
が模索されているようです。一度徹底的なものを書いてみたかったので、私も考えてみようと思います。「標準」ふぇちではなくて単に「CSS切り替えスクリプト」に興味があるという方は、ある意味読まないほうが無難です。
拠り所としてはこれらを参考にすればよかろうと思われます:
さてここで、document.writeメソッドはDOM Level 2 HTMLに規定されていますから、これはHTML、XHTML1.0文書においてはきちんと「標準」に準拠していることになります。しかしこの仕様の対象外である、XHTML1.1文書等のXMLブラウザで表示させるような文書については駄目です。私のサイトの文書はXHTML1.0準拠ですからdocument.writeに頼りまくっていますが、ここではこのメソッドを、言い換えるとDOM Level (1|2) HTML を考えないことにします。
まず、「叩き台」の意味を誤解しないでください。ほぼ無意味な注意書きですが一応。
今回は、addEvent関数を見てみます。
function addEvent(obj, eventType, func) { if (obj.addEventListener) { obj.addEventListener(eventType, func, false); } else if (obj.attachEvent) { /* WinIE5-6用 */ obj.attachEvent('on' + eventType, func); } else { /* MacIE5用 */ if (eventType == 'load') { obj.onload = func; } else if (eventType == 'change') { obj.onchange = func; } } }
これは主にwindow.onload
の代替に使用されるものだと思われました。疑問に思うのは、window.addEventListener
は「可能」か、言い換えるとwindowオブジェクトがEventTargetインターフェイスを持っていることを何が保障してくれているのかということです。
The
EventTarget
interface is implemented by allNodes
in an implementation which supports the DOM Event Model. Therefore, this interface can be obtained by using binding-specific casting methods on an instance of theNode
interface. The interface allows registration and removal ofEventListeners
on anEventTarget
and dispatch of events to thatEventTarget
.
Document Object Model Events より
window
オブジェクトはall
に含まれるのでしょうか。DOMツリーとしてはNodes
HTML
の上に最上位ノードの#document
があって終わりです。
同じ疑問を持っている人が誰もいないようなので不安なのですが、Mozillaが実装しているwindow.addEventListener
というのは、ひょっとして、DOM Level 2 Eventとは何の関係も無いのではないでしょうか?
if (obj.addEventListener)
という書き方は推奨されますが、同名異質のメソッドである可能性があります。各メソッドごとにその危険性を生じるよりは、if (document.implementation)
でただ一回だけその危険性をあえて甘受し、if (document.implementation.hasFeature('HTMLEvents', '2.0'))
で判別した方が良かろうと私は考えます。
これは標準とは何の関係もありませんが、この分岐は必要ありません:
if (eventType == 'load') {
obj.onload = func;
} else if (eventType == 'change') {
obj.onchange = func;
}
次のように書けます。
obj["on"+eventType] = func;