蒼い海に溺れて2nd season

なんとなく作ってみたけど、しばらく様子見

setAttributeとonclick

Wikipediaにてユーザースクリプトを色々と作っては試している。というのは前にも触れた話。その課程で知ったこと。


クリックしたときスクリプトが実行される画像を設置しようと思ったのだが、onclick属性をセットしようとしたときこのスクリプトIEで動作しない。

element.setAttribute("onclick", "eventHandler(event);");

IE の getAttribute / setAttribute: Days on the Moonによれば、こういう処理を行うそうな。

element.setAttribute("onclick", new Function("eventHandler(event);"));

んで最初、振り分けはdocument.allを使えば大丈夫だろうと考えた。IEとそれ以外で対応を分ければ大丈夫だろう、と。

if(document.all) {
	element.setAttribute("onclick", new Function("eventHandler(event);"));
}
else {
	element.setAttribute("onclick", "eventHandler(event);");
}

ところがどっこい。IE8の標準モードは他のブラウザと同じ挙動だそうな。このコードは互換モードにしないとエラーが出る。

element.setAttribute("onclick", new Function("eventHandler(event);"));

んでIE8の振り分けを調べたところ、ariyasacca - IE8 Standards modeはsetAttributeの動きが他のブラウザと揃ってたに対処法が載っていた。document.documentModeを判別するんだと。

if(document.documentMode && document.documentMode >= 8) {
	element.setAttribute("onclick", "eventHandler(event);");
}
else {
	element.setAttribute("onclick", new Function("eventHandler(event);"));
}

だから非IE系でも動かす場合、document.documentModedocument.allを判別すればいいんだと思う。
えーっと、多分こうかな?丁寧な検証はやってないけど。

if(document.documentMode && document.documentMode >= 8 || !document.all) {
	element.setAttribute("onclick", "eventHandler(event);");
}
else {
	element.setAttribute("onclick", new Function("eventHandler(event);"));
}

IE系の特定ブラウザに特化したスクリプトを書くのが如何に楽だということか、この一件でよく分かりました。IEは糞ですね。