1

如果我这样做会发生什么:

$('#elementID').delegate('.findclick a', 'click', function()
{
   alert("test");
}

首先:

#elementID文档中不存在

或者

#elementID存在但.findclick a不存在。

真的很糟糕吗?还是根本不重要?

4

4 回答 4

0

它不会触发...所以没关系。

如果您动态添加这些元素(使用.on()),它将触发并工作。


例子:

$(document).on('click', 'a.delegatedElementThatDoNotExistYet', function() {
    alert("Welcome");
});

没有任何反应,因为委托的元素不存在,但是:

setTimeout(function() {
   $('body').html('<a class="delegatedElementThatDoNotExistYet">Hello!</a>');
},5000);

如果几秒钟后(在我的示例中为 5)我们添加委托的元素,它将触发警报。

这是JsFiddle上的示例

于 2013-01-24T16:51:50.580 回答
0
  • 第一种情况并不是很糟糕,因为您不会将侦听器附加到不存在的节点。
  • 如果在某个时候你有你的.findclick a 孩子,第二个可能会变得很糟糕#elementID

function(){
   alert("test");
}

每次单击这些锚点时都会触发。

关键是您将侦听器绑定到父级,它会照顾孩子

于 2013-01-24T16:51:58.983 回答
0

如果#elementID不存在,则什么也不会发生;该元素不存在,因此无法将事件处理程序绑定到它。

如果#elementID确实存在,那么恭喜您,您刚刚设置了事件委托。简而言之,事件委托是一种技术,通过它您可以在尚不存在的元素上设置事件处理程序,但会在页面加载后的某个时间点出现。

.delegate()第二种情况正是打算如何使用。

于 2013-01-24T16:52:24.320 回答
0

#elementID文档中不存在

它创建一个函数,然后将其作为委托(为空)应用于结果集;所以什么也没有发生(创建的函数最终会被垃圾收集)。

#elementID存在但.findclick a不存在。

同样,它创建了一个函数,然后将其作为委托应用于结果集(应该只包含一个元素)。

现在,无论何时#elementID点击其中的任何元素,jQuery 都会遍历已注册的委托(应该只有一个)以找到匹配的选择器 ( '.findclick a')。

当您稍后.findclick a在下面创建#elementID时,单击它时它将开始运行您的功能。

于 2013-01-24T17:00:46.553 回答