Как работает метод jquery prom?

Я действительно не понимаю, что такое delegate и promise.

Согласно документам -

  • delegate свяжет селектор и событие с каким-то контейнером-контейнером, который может быть использован снова в будущем для текущих и будущих элементов.
  • promise() будет переназначать все до того момента, когда он будет сначала ограничен, если все вновь загруженные совпадают. Возможно, я действительно не понимаю этот метод обещания.

Что делать, если оболочка все еще существует, но содержимое в контейнере-контейнере было изменено и/или перезагружено через Ajax? Почему события не запускаются или работают так, как это было бы в первый раз связано?

И да, я был на странице документов, я просто не понимаю их объяснений полностью.

Ответ 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.