这个问题我有点困惑。我认为这是因为you感到困惑promise
and delegate
。它们实际上是 jQuery 完全不相关的功能。我将分别解释一下:
delegate
delegate http://api.jquery.com/delegate是 jQuery 1.4.2 中引入的 jQuery 功能。 (这是一种更好的方法live http://api.jquery.com/livejQuery 1.3 中添加的功能)。它解决了修改 DOM 带来的特定问题,特别是 AJAX 调用。
当您绑定事件处理程序时,您将其绑定到选择。所以你可能会这样做$('.special').click(fn)
将事件处理程序绑定到所有成员special
班级。您绑定到这些元素,因此如果您随后从这些元素之一中删除该类,该事件仍然会被触发。相反,如果将类添加到元素(或将新元素添加到 DOM 中),则它不会绑定事件。
Javascript 有一个功能可以缓解这种情况,称为“事件冒泡”。当事件被触发时,浏览器首先通知事件起源的元素。然后它沿着 DOM 树向上查找,并通知每个祖先元素。这意味着您可以将事件处理程序绑定到 DOM 树上方的元素上,并在任何子元素上触发事件(甚至是那些在绑定处理程序时不存在的元素)。
delegate
是 jQuery 的实现。首先,选择一个父元素。然后指定一个选择器 - 仅当原始元素与该选择器匹配时才会运行处理程序。然后指定事件类型,例如click
, submit
, keydown
,就像bind http://api.jquery.com/bind。最后指定事件处理程序。
$('#containingElement').delegate('a.special', 'click', function() {
alert('This will happen on all links with the special class');
});
promise
promise http://api.jquery.com/promise是 jQuery 功能集中另一个相对较新的新增内容。它是Deferred http://api.jquery.com/category/deferred-object/jQuery 1.5 中引入的概念。 (我认为“延迟”和“委托”之间的声音相似性可能是混淆的根源。)这是一种抽象出异步代码复杂性的方法。最好的例子是 AJAX 调用,因为返回的对象$.ajax
is a 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 http://api.jquery.com/promise是此实现的一部分。你打电话promise
在 jQuery 选择上,当对象中的所有动画完成时,您将获得一个可以将事件处理程序绑定到的对象。
例如:
$('div.special').fadeIn(5000).promise().then(function() {
// run when the animation succeeds
}).then(function() {
// also run when the animation succeeds
});
同样,这与传统方法的效果相似,但增加了灵活性。您可以稍后绑定处理程序,并且可以绑定多个。
Summary
基本上,之间没有显着的关系delegate
and promise
,但它们都是现代 jQuery 中有用的功能。