我一直在组建一个用于跨浏览器事件处理的轻量级事件实用程序,但遇到了一个相当高的障碍,我无法完全跳过。这与IE9中的srcElement属性有关,这对我来说不起作用!
目前,我的实用程序看起来像这样(srcElement是第三个代码块):
var bonsallNS = new Object();
bonsallNS.events = {
addEvent: function (node, type, func) {
if (typeof attachEvent != "undefined") {
node.attachEvent("on" + type, func);
} else {
node.addEventListener(type, func, false);
}
},
removeEvent: function (node, type, func) {
if (typeof detachEvent != "undefined") {
node.detachEvent("on" + type, func);
} else {
node.removeEventListener(type, func, false);
}
},
target: function (e) {
if (typeof srcElement != "undefined") {
return window.event.srcElement;
} else {
return e.target;
}
},
preventD: function (e) {
if (typeof srcElement != "undefined") {
window.event.returnValue = false;
} else {
e.preventDefault();
}
}
}
现在,使用下面的测试脚本在Chrome和Firefox中运行良好,但是当我尝试提醒它时,返回evtTarget在IE中未定义。我不知道为什么,所以任何帮助将不胜感激!见下面的代码:
var gClick = document.getElementById("clickme");
var gCount = 0;
function mssg(e){
var evtTarget = bonsallNS.events.target(e);
alert("it worked, target: " + evtTarget);
gCount++
if (gCount > 2){
bonsallNS.events.removeEvent(gClick, "click", mssg);
}
}
function setUp(){
bonsallNS.events.addEvent(gClick, "click", mssg);
}
bonsallNS.events.addEvent(window, "load", setUp);
就像我说的,除了IE中的事件源之外,其他一切都有效!
答案 0 :(得分:1)
变量srcElement
将始终为undefined
,除非它在更高的范围内定义。但它永远不会引用event.srcElement
。
您可以通过两种方式解决此问题:检查是否未定义e
或e.srcElement
,或者是否定义了window.event
和window.event.srcElement
。
if (typeof e === "undefined" || typeof e.srcElement === "undefined") {
// or
if (typeof window.event !== "undefined" &&
typeof window.event.srcElement !== "undefined") {
您还可以将整个功能缩短为:
target: function (e) {
e = e || window.event;
return e.target || e.srcElement;
}