问题描述
|
我无法使用委托为$ .each等效项编写语法。
我读过的所有示例都只显示了单击或悬停,但是如何使用委托语法编写它呢?
$(\"ul li a\").each(function(){
$(this).addClass(\"foo\");
});
干杯!!
编辑:遵循大量评论(顺便说一句),我认为最好发布一个更明确的示例。对于先前问题中缺少详细信息,我深表歉意。
举例来说,我想将工具提示绑定到页面上的锚点。我将设置很多项目作为提示,并且希望通过使用委派来减少内存开销。
据我了解,这就是开始的方式:
$(document).delegate(\"a.tooltip\",\"click\",function(event){
// run click event
}).delegate(\"a.tooltip\",\"hover\",function(event){
// run mousenter,mouseleave events.
});
但是,对于每个锚点,我都想删除title属性,这样当我将鼠标悬停时,它不会显示在浏览器中。我会想象(尽管我在这里猜),类似的任何本机事件都将在悬停事件之前运行,因此我想在悬停之前将其删除。
通常我会使用这样的东西:
$(\"a.tooltip\").each(function () {
// Store our title attribute and remove it so we don\'t get browser
//tooltips showing up.
$.prop(this,\"data-old-title\",$.attr(this,\"title\"));
}).removeAttr(\"title\");
可以做一个更好的方法吗?
根据我在评论和回答中的理解,代表仅涵盖事件,而我仍然必须将类似的内容分开。
解决方法
您可能对ѭ3是什么或它是如何工作有误解。它不是某种魔术功能,可以拦截所有DOM操作,它只是利用DOM的事件冒泡功能,因此只能用于事件。
基本上,如果您有一个
<div>
元素,以后打算向其中添加<button>
,则可以使用.delegate()
将click事件绑定到<div>
本身。
将来,当您添加按钮时,单击它会触发按钮的click事件,并且它将继续冒泡DOM,连续调用每个父元素的click事件,直到到达文档根目录为止或其中一个处理程序呼叫event.stopPropagation()
。某一时刻,它将到达您的<div>
,您已绑定了代表事件。委托事件将检查最初触发事件的元素是否与原始选择器(您首先要将事件绑定到该选择器)相匹配,如果匹配,则在按钮的上下文中触发附加的事件处理程序,因此在事件处理程序中,它看起来就像按钮引发了事件。
如您所见,这没有魔力,它与监视DOM的更改或类似内容无关。如果要在向DOM中添加元素时添加特殊类,则必须确保在发生这种情况时自行调用函数。
, $(\"ul\").delegate(\"a\",\"hover\",function(){
$(this).addClass(\"hover\");
});
, 没有适用于.delegate()
的jQuery相当于.each()
委托允许您将事件处理程序附加到现在或将来存在的对象上。
每个都允许您遍历对象的集合
如果您想基于某个事件将类foo
添加到锚标记中,则可以执行以下操作:
$(\'ul li\').delegate(\'a\',\'click\',function(){
$(this).addClass(\"foo\");
});