Ответ 1
Я немного смущен этим вопросом. Я думаю, это связано с тем, что вы смущены promise
и delegate
. На самом деле это абсолютно несвязанные черты jQuery. Я объясню каждый отдельно:
delegate
delegate
- это функция jQuery, которая была введена в jQuery 1.4.2. (Это более удобный подход к live
, который был добавлен в jQuery 1.3). Он решает определенную проблему, связанную с модификацией DOM и, в частности, с вызовами AJAX.
Когда вы привязываете обработчик событий, вы привязываете его к выбору. Таким образом, вы можете сделать $('.special').click(fn)
, чтобы связать обработчик событий со всеми членами класса special
. Вы привязываетесь к этим элементам, поэтому, если вы удалите класс из одного из этих элементов, событие все равно будет запущено. И наоборот, если вы добавите класс в элемент (или добавите новый элемент в DOM), он не будет связан с событием.
Есть функция Javascript, которая смягчает это, называемое "пузырьковое событие". Когда событие запускается, сначала браузер уведомляет элемент, в котором произошло событие. Затем он поднимается вверх по дереву DOM и уведомляет каждый элемент предка. Это означает, что вы можете связать обработчик событий с элементом, расположенным вверх по дереву DOM, и события, инициированные на любых дочерних элементах (даже те, которые не существуют, когда обработчик связан).
delegate
является реализацией jQuery. Сначала вы выбираете родительский элемент. Затем вы указываете селектор – обработчик будет запускаться только в том случае, если исходный элемент соответствует этому селектору. Затем вы указываете тип события, например click
, submit
, keydown
, так же как bind
. Затем, наконец, вы укажете обработчик событий.
$('#containingElement').delegate('a.special', 'click', function() {
alert('This will happen on all links with the special class');
});
promise
promise
- еще одно относительно недавнее дополнение к функции iQuery. Он является частью концепции Deferred
, которая была представлена в jQuery 1.5. (Я думаю, что сходство в звуке между "отложенным" и "делегатом", вероятно, является источником путаницы.) Это способ абстрагироваться от осложнений асинхронного кода. Лучший пример этого - с вызовами 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
является частью этой реализации. Вы вызываете promise
на выбор jQuery, и вы получите объект, с которым вы можете связать обработчики событий, когда все анимации в объекте завершены.
Например:
$('div.special').fadeIn(5000).promise().then(function() {
// run when the animation succeeds
}).then(function() {
// also run when the animation succeeds
});
Опять же, это похоже на традиционные методы, но это добавляет гибкости. Вы можете связать обработчики позже, и вы можете привязать более одного.
Резюме
В принципе, между delegate
и promise
нет существенной связи, но они являются полезными функциями в современном jQuery.