最近、クロスブラウザー イベント処理に関するチュートリアルを読みました...クロスブラウザー イベント処理...
チュートリアルのいくつかのプラクティスを、そのように浮かんでいる一般化された関数に適応させました...
function isHostMethod(object, property) {
var type = typeof object[property];
return type === "function" || (type === "object" && !! object[property]) || type === "unknown";
}
var events = {
add: (function() {
if (isHostMethod(this, 'addEventListener')) {
return function(element, type, handler) {
element.addEventListener(type, handler, false);
};
} else if (isHostMethod(this, 'attachEvent')) {
return function(element, type, handler) {
element.attachEvent('on' + type, function() {
handler.call(element, window.event);
});
};
} else {
return function(element, type, handler) {
element['on' + type] = handler;
};
}
}()),
remove: (function() {
if (isHostMethod(this, 'removeEventListener')) {
return function(element, type, handler) {
element.removeEventListener(type, handler, false);
};
} else if (isHostMethod(this, 'detachEvent')) {
return function(element, type, handler) {
element.detachEvent('on' + type, function() {
handler.call(element, window.event);
});
};
} else {
return function(element, type, handler) {
element['on' + type] = null;
};
}
}())
};
利用方法:
var img_wrap = document.getElementById('img_wrap'),
img = img_wrap.getElementsByTagName('img'),
img_amount = img.length;
function do_stuff() {
//
//do stuff - update preloaded percentage, etc.
//
events.remove(this, 'load', do_stuff);
}
for (var i = 0; i < img_amount; i += 1) {
events.add(img[i], 'load', do_stuff);
}
これが気になる…
1.「isHostMethod」機能は必要か?
2.チュートリアルでは、メモリリークについて警告し、「一意のID」を各要素への参照として使用してそれらを回避するための追加機能の概要を説明しています...これは含まれていません...多分私は何かを監督していますが、私はしません私の場合は必要だと思います...または心配する必要がありますか?
jsfiddle here の警告: 画像が大きい、ダウンロードに時間がかかる、帯域幅が大きいなど。