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.documentMode
とdocument.all
を判別すればいいんだと思う。
えーっと、多分こうかな?丁寧な検証はやってないけど。
if(document.documentMode && document.documentMode >= 8 || !document.all) { element.setAttribute("onclick", "eventHandler(event);"); } else { element.setAttribute("onclick", new Function("eventHandler(event);")); }
非IE系の特定ブラウザに特化したスクリプトを書くのが如何に楽だということか、この一件でよく分かりました。IEは糞ですね。