promise()会将事情重新映射到第一次绑定时,如果新加载的所有内容都匹配?也许我真的不明白这个承诺的方法。
如果包装器仍然存在,但包装器容器中的内容已经更改,或者通过ajax重新加载,该怎么办?为什么破坏事件不触发或工作,因为它是第一次绑定?
是的,我一直到docs页面,我只是不理解他们的解释完全
代表
delegate
是在jQuery 1.4.2中引入的jQuery的一个特性。 (这是一个更好的方法,live
功能,在jQuery 1.3中添加)。它解决了一个特定的问题,修改DOM,特别是与AJAX调用。
绑定事件处理程序时,将其绑定到选择。所以你可以做$(‘。special’)。点击(fn)绑定一个事件处理器到特殊类的所有成员。你绑定到那些元素,所以如果你然后从这些元素之一删除类,事件仍然会被触发。相反,如果你将类添加到一个元素(或添加一个新的元素到DOM),它不会有事件绑定。
有一个Javascript的功能,减轻这个称为“事件冒泡”。当事件被触发时,首先浏览器通知事件发生的元素。然后它向上移动DOM树,并通知每个祖先元素。这意味着您可以在DOM树上的元素上绑定事件处理程序,以及在任何子元素(即在处理程序绑定时不存在的那些)上触发的事件。
委托是jQuery的这个实现。首先,选择一个父元素。然后你指定一个选择器 – 处理程序将只运行,如果始发元素匹配这个选择器。然后指定一个事件类型,如点击,提交,键下,就像bind
.然后最后指定事件处理程序。
$('#containingElement').delegate('a.special','click',function() { alert('This will happen on all links with the special class'); });
诺言
promise
是jQuery功能集的另一个相对较近的增加。它是在jQuery 1.5中引入的Deferred
概念的一部分。 (我认为“deferred”和“delegate”之间的声音的相似性可能是混淆的原因。)这是一种抽象异步代码复杂性的方法。最好的例子是使用AJAX调用,因为$ .ajax返回的对象是Deferred对象。例如:
$.ajax({ url: 'somepage.cgi',data: {foo: 'bar'} }).done(function() { // this will be run when the AJAX request succeeds }).fail(function() { // this will be run when the AJAX request fails }).always(function() { // this will be run when the AJAX request is complete,whether it fails or succeeds }).done(function() { // this will also be run when the AJAX request succeeds });
所以它在许多方面与$ .ajax调用中的绑定成功处理程序相同,只是您可以绑定多个处理程序,并且可以在初始调用后绑定它们。
另一个时候,异步处理是有用的是动画。你可以提供回调函数,但更好的做法是类似于上面提供的AJAX示例的语法。
在jQuery 1.6中,这个功能是可能的,promise
是这个实现的一部分。在jQuery选择上调用promise,当对象中的所有动画都完成时,你将得到一个可以绑定事件处理程序的对象。
例如:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds }).then(function() { // also run when the animation succeeds });
再次,这在效果上类似于传统方法,但它增加了灵活性。您可以稍后绑定处理程序,并且您可以绑定多个。
概要
基本上,delegate和promise之间没有显着的关系,但它们都是现代jQuery中的有用特性。