jquery的promise方法是如何工作的?

我真的不明白delegatepromise是什么。

根据文件 –

  • delegate会将一个select器和事件绑定到某种包装容器上,这个容器可以在以后再次用于当前和将来的项目。
  • 如果新加载的所有内容匹配,那么promise()会将事物重新映射回第一次有界。 也许我不太了解这个承诺的方法。

如果包装仍然存在,但包装容器中的内容已经更改,和/或通过Ajax重新加载? 为什么这些事件不会像第一次受到约束那样触发或工作?

是的,我去过文档页面,我完全不理解他们的解释。

我对这个问题有点困惑。 我想这是因为promisedelegate所迷惑。 他们实际上完全不相关的jQuery特性。 我会分别解释

delegate

delegate是在jQuery 1.4.2中引入的jQuery的一个特性。 (这是在jQuery 1.3中添加的livefunction的更好的方法)。 它解决了修改DOM所带来的特殊问题,特别是AJAX调用。

绑定事件处理程序时,将其绑定到select。 所以你可以做$('.special').click(fn)把事件处理程序绑定到special类的所有成员。 你绑定到这些元素,所以如果你从这些元素中删除了这个类,这个事件仍然会被触发。 相反,如果将该类添加到元素(或将新元素添加到DOM中),则不会绑定事件。

Javascript的一个特性就是减轻了这种称为“事件冒泡”的风险。 当事件被触发时,首先浏览器通知事件发生的元素。 然后它到达DOM树,并通知每个祖先元素。 这意味着您可以绑定DOM树上的元素上的事件处理程序,以及在任何子元素(即使处理程序绑定时不存在的事件)上触发的事件。

delegate是jQuery的这个实现。 首先,你select一个父元素。 然后你指定一个select器 – 处理程序将只在原始元素匹配这个select器时运行。 然后你可以像bind一样指定一个事件types,比如clicksubmitkeydown 。 最后你指定事件处理程序。

 $('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class'); }); 

promise

promise是另一个相对较新的jQueryfunction集。 它是jQuery 1.5中引入的Deferred概念的一部分。 (我认为“延迟”和“委托”之间声音的相似性可能是混淆的根源)。这是一种抽象化asynchronous代码复杂性的方法。 最好的例子就是使用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调用中绑定成功处理程序的方式相同,除了可以绑定多个处理程序,并且可以在初始调用之后绑定它们。

另一次asynchronous处理是有用的animation。 你可以给函数提供callback函数,但是用类似于上面提供的AJAX例子的语法来做这个更好。

在jQuery 1.6中,这个function成为可能,并且promise是这个实现的一部分。 您可以在jQueryselect中调用promise ,并且在对象中的所有animation完成时,您将获得一个可以绑定事件处理函数的对象。

例如:

 $('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds }).then(function() { // also run when the animation succeeds }); 

再一次,这与传统方法类似,但它增加了灵活性。 您可以稍后绑定处理程序,并且可以绑定多个处理程序。

概要

基本上, delegatepromise之间没有明显的关系,但是它们在现代jQuery中都是有用的特性。