hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

[]addEventListener

モダンなJavaScriptコードでは、

はもちろん、
document.getElementById("result").onclick = func;
もあまりクールとは言えないようで、「addEventListener」を使うのがクールなようです。
但し、FirefoxとIEで実装が微妙にちがうようです。

ということで、クロスブラウザ対応のaddEventListenerを考えてみました。
パターン1は普通に考えるとこんな感じになりがちかなと思いますが、
毎回判定が実行されてしまうので、あまりよろしくないと思います。

JavaScript的に実装するのであれば、パターン2かパターン3が良いかと思います。

//パターン1
//普通にやるとこんな感じ。
// これだと毎回判定が必要になる。
var addListener = function(elm, type, func){
if(window.addEventListener) {
elm.addEventListener(type, func, false); //W3C
} else {
elm.attachEvent('on' + type, func); //IE
}
}

//パターン2
//処理結果として、関数を戻す。
// この場合、window.addEventListenerの判定は1回のみで、
// 後は戻された関数が実行される。
var addListener = function(){
if (window.addEventListener) {
return function(elm, type, func){
elm.addEventListener(type, func, false); //W3C
}
} else {
return function(elm, type, func){
elm.attachEvent('on' + type, func); //IE
}
}
}();

//パターン3
//上記のパターン2の三項演算子
var addListener = ( window.addEventListener ?
function(elm, type, func){
elm.addEventListener(type, func, false); //W3C
} :
function(elm, type, func){
elm.attachEvent('on' + type, func); //IE
}
);