如果我这样做会发生什么:
$('#elementID').delegate('.findclick a', 'click', function()
{
alert("test");
}
首先:
#elementID
文档中不存在
或者
#elementID
存在但.findclick a
不存在。
真的很糟糕吗?还是根本不重要?
它不会触发...所以没关系。
如果您动态添加这些元素(使用.on()
),它将触发并工作。
例子:
$(document).on('click', 'a.delegatedElementThatDoNotExistYet', function() {
alert("Welcome");
});
没有任何反应,因为委托的元素不存在,但是:
setTimeout(function() {
$('body').html('<a class="delegatedElementThatDoNotExistYet">Hello!</a>');
},5000);
如果几秒钟后(在我的示例中为 5)我们添加委托的元素,它将触发警报。
.findclick a
孩子,第二个可能会变得很糟糕#elementID
。function(){
alert("test");
}
每次单击这些锚点时都会触发。
关键是您将侦听器绑定到父级,它会照顾孩子
如果#elementID
不存在,则什么也不会发生;该元素不存在,因此无法将事件处理程序绑定到它。
如果#elementID
确实存在,那么恭喜您,您刚刚设置了事件委托。简而言之,事件委托是一种技术,通过它您可以在尚不存在的元素上设置事件处理程序,但会在页面加载后的某个时间点出现。
.delegate()
第二种情况正是打算如何使用。
#elementID
文档中不存在
它创建一个函数,然后将其作为委托(为空)应用于结果集;所以什么也没有发生(创建的函数最终会被垃圾收集)。
#elementID
存在但.findclick a
不存在。
同样,它创建了一个函数,然后将其作为委托应用于结果集(应该只包含一个元素)。
现在,无论何时#elementID
点击其中的任何元素,jQuery 都会遍历已注册的委托(应该只有一个)以找到匹配的选择器 ( '.findclick a'
)。
当您稍后.findclick a
在下面创建#elementID
时,单击它时它将开始运行您的功能。