只注册一次事件

时间:2016-06-14 15:04:59

标签: javascript ajax javascript-events event-handling

我写了一个小脚本来加载带有ajax的页面。应选择具有ajax-pls - 类的所有链接。

在我添加eventlistener之后,我删除了类,因为我需要每次解析包含的html ......对吗?

(function() {
    function addEvent(element, evnt, funct){
    if (element.attachEvent)
        return element.attachEvent('on'+evnt, funct);
    else
        return element.addEventListener(evnt, funct, false);
    }

  var link_click = function (e) {
      e.preventDefault();
      if (this.getAttribute("href") == 'test1.html') {
        var content = document.getElementById('content');
        content.innerHTML = "<a href='test3.html' class='ajax-pls'>Test3</a>";
        register_listeners();
      } else {
        alert(this);
      }
    };

  function register_listeners() {

    var atags = document.querySelectorAll('a.ajax-pls');
    for (i = 0; i < atags.length; i++) {
      addEvent(atags[i], 'click', link_click);
      atags[i].classList.remove("ajax-pls");
    }
  }

  register_listeners();
})(); 

这只是测试代码。但是,我是否需要使用类来完成这个技巧,或者我可以在每次包含之后调用register_listeners()吗?

1 个答案:

答案 0 :(得分:0)

是的,你需要删除类,否则addEvent会多次为每个链接添加相同的处理程序。

但是你可以通过使用事件冒泡来绕过这个问题。

如果您将处理程序添加到每个链接的最近共同祖先(在最坏的情况下,它将是document.body)。它将捕获其中每个元素的每个click事件。您需要选中event.target

来过滤它们