2

我在Karl Swedberg 的博客上阅读了关于绑定和解除绑定事件的精彩文章(因为我是一个使用 jQuery 的 js 初学者),我对这部分代码完全感到困惑(为简洁起见):

    function addItemUnbind() {
      $Add a button but it won't have it's event added;
      addItemUnbind();
  });

为什么通过将相同的函数放在自身内部,它不会继续执行无限循环?但是,它用于将事件重新绑定到元素......!?

4

4 回答 4

9

据我所知,你的例子会。但是,您的示例与您引用的网站上的示例不同。

function addItemUnbind() {
  $('#list6 li.special button')
    .unbind('click')
    .bind('click', function() {
      var $newLi = $('<li class="special">special and new <button>I am new</button></li>');
      $(this).parent().after($newLi);
      addItemUnbind();
  });
}

在此示例中,当用户单击按钮时会调用“addItemUnbind”。

于 2008-12-11T03:22:26.330 回答
3

因为调用在内部函数中。

例如,他在 addItemUnbind() 中做了一些事情,其中​​之一是将函数绑定到按钮单击。

然后声明这个函数,例如在 addItemUnbind() 中有:

.bind('click', function() {
  var $newLi = $('<li class="special">special and new <button>I am new</button></li>');
  $(this).parent().after($newLi);
  addItemUnbind();
  }

此处大括号内的代码不会在调用 addItemUnbind() 时进行评估,而是在单击发生时进行评估。

于 2008-12-11T03:23:07.483 回答
0

答案隐藏在您取出的部分代码中。您发布的内容确实是一个无限循环。但是,这是一个更完整(但仍然简化)的示例,从链接的博客文章中修改:

function addItemUnbind() {
  bind('click', function() {
    addItemUnbind();
  });
}

对 addItemUnbind 的调用在一个闭包内——一个新的匿名函数,它与创建它的 addItemUnbind 函数是分开的。不是立即调用,而是将新函数的引用传递给绑定函数。所以如果绑定函数看起来像这样:

function bind(eventName, eventHandler) {
  eventHandler();
}

那么你将有一个无限循环,因为对 eventHandler 的调用会导致返回到 addItemUnblind。但如果它看起来像这样:

function bind(eventName, eventHandler) {
  this.events[eventName] = eventHandler; // save the event handler to call when an event happens
}

那么就没有问题了。它不调用 addItemUnbind,它只是保存对稍后将调用它的函数的引用。

于 2008-12-11T03:31:23.600 回答
0

啊......就像在很多事情......“观察丹尼尔!”。诚然,我认为事件处理工作的方式也存在异常,这导致我浏览了我认为我已经知道的文章。由于您的仔细解释,我现在看清楚了。

于 2008-12-11T04:27:33.953 回答