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

时间:2014-09-04 04:54:25

标签: javascript html javascript-events internet-explorer-8 event-handling

这是一个脚本,用于查看页面上存在的链接,并将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>

我已经尝试将this和this.href添加为函数的参数,但它看起来并不像那些函数接受参数。有谁知道如何让这个工作?

2 个答案:

答案 0 :(得分:3)

试试这个:

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使用全局事件对象,而不是在回调函数中发送参数。

答案 1 :(得分:1)

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

所以而不是:

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

您可以使用

确保将设置为元素
  a[b].attachEvent("onmousedown",(function(fn, el) {
    return function() {fn.call(el, event)};
  }(c, a[b]));

查看&#34; addEvent&#34;的示例功能,有很多可以解决这个问题。