【问题标题】:Javascript IE8 not passing 'this' in attachEventJavascript IE8 未在 attachEvent 中传递“this”
【发布时间】:2014-09-04 04:54:25
【问题描述】:

这是一个查看页面上存在的链接并将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 添加为函数的参数,但看起来这些函数不接受参数。任何人都知道我将如何让它工作?

【问题讨论】:

  • 大多数人确实会像 $("a").on("mousedown",c) 一样使用 JQuery,但您可能正在寻找原始 JavaScript 解决方案...closure 是否适合您的情况?

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


【解决方案1】:

试试这个:

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

【讨论】:

  • e.target/e.srcElement 不一定与侦听器中的 this 元素相同。
  • @Rob:抱歉不清楚,但目标会包含href,不是吗?
  • @coder——在监听器中,this 将是具有监听器的元素,event.targetevent.srcElement 是启动事件的元素。所以在带有监听器的元素有子元素的情况下,this 可能与event.target 不同。例如,如果监听器在 A 元素上并且它有一个子 span 元素,那么点击 span this 将引用 A 元素和 event.target / event.srcElement 将引用跨度。
【解决方案2】:

不幸的是,在 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”函数的例子,有很多可以解决这个问题的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2012-06-22
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多