Javascript IE8没有在attachEvent中传递'this'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript IE8没有在attachEvent中传递'this'相关的知识,希望对你有一定的参考价值。

这里是一个脚本,它查看页面上存在的链接并将mousedown事件侦听器绑定到每个链接。触发mousedown事件时,它将调用一个函数,该函数使用链接的href创建警报。在IE9 +中,这可以正常工作,但是在IE8中,这是未定义的。

<html>
<body>
<a href="http://www.example.com">test</a>
<script>
var c=function(){alert(this.href)};
var a=document.getElementsByTagName("a");
for(var b=0; b<a.length; b++) {
    if (a[b].addEventListener) {
        a[b].addEventListener("mousedown",c,false);
    } else {
        a[b].attachEvent("onmousedown",c);
    }
}
</script>
</body>
</html>

我已经尝试将thisthis.href添加为函数的参数,但是看起来这些函数并不接受参数。有人知道我将如何使其工作吗?

答案

尝试一下:

var c = function (e) {
    e = e || event; // if e is not available, use global event object
    var target = e.target || e.srcElement; // some browsers use target to refer to event target, and some srcElement
    alert(target.href);
};

我认为IE8使用全局事件对象,而不是在回调函数中发送参数。

另一答案

不幸的是,在IE事件模型中,使用attachEvent附加的侦听器没有将它们的[[this设置为调用元素,因此默认为window(即全局对象)。

所以代替:

a[b].attachEvent("onmousedown",c);

您可以确保使用以下元素将

this

设置为元素: a[b].attachEvent("onmousedown",(function(fn, el) { return function() {fn.call(el, event)}; }(c, a[b]));
查找“ addEvent”函数的示例,周围有很多方法可以解决此问题。    

以上是关于Javascript IE8没有在attachEvent中传递'this'的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript之元素绑定事件

attachEvent与addEventListener

addEventListener和attachEvent的区别(转载)

addEventListener在IE中不起作用(在IE8中测试)[重复]

用于 attachEvent 的 Polyfill 删除 dhtmlx attachEvent 函数

JavaScript中事件的绑定