我想知道jquery’委托或on(代表)是如何工作的
有时我用来委托事件,
dom.addEventListener("click",function(e){ e.target for hander. } instead: dom.on("click",'a',function(){ $(this).handler.. }
所以,我想我可以用这种方式编写代码:
function delegate(dom,event,selector,handler){ target = event.target; while selector.dom.not_match event.target target = target.parentNode recheck until match the selector and do handler; end }
我之前写过:
function delegate(dom,event,selector,handler){ dom.addEvent event function(){ target_arr = dom.find(selector); if(event.target in_array target_arr){ do handler }else{ target = target.parentNode until dom. recheck in target_arr; } } }
有人知道jquery的’委托’或’代表’的工作方法如何代表?请告诉我代码简单描述’委托’..非常感谢。
看看on()
的jQuery文档 ,他们很好地解释了这个概念。
另外,您可以查看源代码 !
经验教训:
-
delegate
只是on
的包装器,具有不同的参数顺序 -
on
只做一些参数规范化并处理one
,但委托给jQuery.event.add( this, types, fn, data, selector );
-
event.add
做了很多validation,处理多种类型和特殊情况,在$.data("events")
上推送参数并调用elem.addEventListener(type, jQuery.event.dispatch, false)
- 然后,
event.dispatch
再次从$.data("events")
查询句柄,并从本机事件构建jqEvent
。 然后它开始搜索委托事件 – 代码很简单 – 然后将它们推handlerQueue
,之后是直接附加在元素上的普通处理程序。 最后,它只运行handlerQueue
,从委托处理程序开始。
随着jQuery 1.4.2的推出,引入了一种名为delegate()
的新方法。 此方法将处理程序附加到选定/指定元素的一个或多个事件。 我们来举个例子吧。 我创建了一个表并使用委托方法,我将click事件处理程序附加到每个td元素。
Item 1 Item 2 Item 3 Item 4
jQuery delegate()
方法代码。
$(document).ready(function(){ $("table").delegate("td","click",function(){ alert('I am' + $(this).text()); }); });
这需要3个参数。
- 选择
- 事件类型
- 事件处理程序
你会说使用bind()
方法很有可能。 下面的代码将用于此目的。
$(document).ready(function(){ $("table td").bind("click",function(){ alert('I am' + $(this).text()); }); });
那么delegate()
方法有什么新东西?
bind()方法将事件添加到调用它时页面上的元素。 例如,调用bind()时页面上只有4个td。 稍后,当您在表中动态添加更多td时,bind()将不会将click事件处理程序附加到那些td。 让我们扩展我们的演示并在页面上放置一个按钮,动态添加td。
$("#btnAdd").click(function(){ $("table").append("Item 5 Item 6 "); });
现在,当您运行此页面时,您将找不到新添加的td的click事件。
但是使用delegate()
,您会发现新添加的td的click事件。 delegate()方法添加页面上的事件,并且还侦听新元素并向其添加事件。 🙂
当你这样做时:
$(selector1).on(event, selector2, function);
jQuery将处理程序绑定到与selector1
匹配的DOM元素上的事件。 当此处理程序运行时,它将DOM层次结构从最特定的元素移动到元素匹配selector1
,并检查是否有任何元素与selector2
匹配。 如果找到匹配项,则使用适当的执行上下文调用function
。
这就是on()
能够处理创建委派后动态添加的DOM元素上的事件的方式。
单击一个段落以添加另一个。 请注意,.delegate()会将click事件处理程序附加到所有段落 – 甚至是新段落。
Click me!
另一个例子
Has an attached custom event.
添加版本的方法的工作:1.4.2
.delegate(selector,eventType,handler(eventObject))
selector-用于过滤触发事件的元素的选择器。
eventType-包含一个或多个以空格分隔的JavaScript事件类型的字符串,例如“click”或“keydown”或自定义事件名称。
handler(eventObject) – 触发事件时执行的函数。
对于版本添加:1.4.2
委托(selector,eventType,eventData,handler(eventObject))
selector-用于过滤触发事件的元素的选择器。
eventType-包含一个或多个以空格分隔的JavaScript事件类型的字符串,例如“click”或“keydown”或自定义事件名称。 eventData将传递给事件处理程序的数据映射。
handler(eventObject) – 触发事件时执行的函数。
对于版本添加:1.4.3
委托(选择器,事件)
selector-用于过滤触发事件的元素的选择器。
events-要为它们执行的一个或多个事件类型和函数的映射。
This is a paragraph inside a div element.
This is a paragraph.