1

这应该很容易:)

我只想添加一个单击事件侦听器,以防它之前尚未添加,并防止它运行两次。我想像这样完成这个:

HTML

<a href="http://www.google.com"> Google is your friend </a>
<a href="http://www.Bing.com"> Bing's alright as well </a>

JS

var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++)
{
    if (*Default has been prevented for links[i]*){ //how do I implement this check?
        return; //do nothing, we're all done.
    } else {
        links[i].addEventListener("click",function(event){
            event.preventDefault();
            alert("Showing you this instead of opening this link!"); 
        });
    }
}

在我的真实世界案例中,添加的事件侦听器正在阻止默认行为。那么如何检查它是否以前被阻止过呢?我想确保不会添加两次侦听器。如何实施此检查?
非常感谢您的任何想法。

4

1 回答 1

0

您可以使用对象标识来实现您的目标。引用MDN

多个相同的事件监听器

如果多个相同的 EventListener 在同一个 EventTarget 上注册了相同的参数,则重复的实例将被丢弃。它们不会导致 EventListener 被调用两次,并且由于重复项被丢弃,因此不需要使用 removeEventListener 方法手动删除它们。

例子:

// the "one" handler function instance
var theEventPreventDefaultHandler = function (event) {
    event.preventDefault();
};

var links = document.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
    links[i].addEventListener("click", theEventPreventDefaultHandler);
}

观看小提琴

addEventListener我没有检查出来,但是当它没有添加“重复”时,该函数可能会返回 false 来捕捉这种情况。它没有,只返回undefined.

原生不支持“检查事件是否有处理程序”。这在 jQuery 中是可能的,因为它管理.data("events")数组中的处理程序,也支持 IE 在this和中的旧怪癖行为window.event。也就是说,重新实现 ejohn 所做的事情会很痛苦。关于stackoverflow有很多问题:

于 2013-08-13T16:08:43.447 回答