Увімкнення live () увімкнення () у jQuery


202

У моєму додатку динамічно додаються спадні файли. Користувач може додати стільки, скільки потрібно.

Я традиційно використовував live()метод jQuery, щоб виявити, коли одна з цих спадних файлів була change()відредагована:

$('select[name^="income_type_"]').live('change', function() {
    alert($(this).val());
});

Станом на jQuery 1.7, я оновив це до:

$('select[name^="income_type_"]').on('change', function() {
    alert($(this).val());
});

Дивлячись на Документи, це повинно бути абсолютно дійсним (правда?) - але обробник подій ніколи не запускає. Звичайно, я підтвердив, що jQuery 1.7 завантажується і працює тощо. У журналі помилок немає помилок.

Що я роблю неправильно? Дякую!


2
Я знаю, що це пізно, але здається, що jQuery liveнасправді використовується on, тому перезапис застарілого коду може знадобитися лише до тих пір, поки liveне буде видалено, що, на мою думку, становить 1.9. Витяг з 1.7.1 джерела: live: function( types, data, fn ) {jQuery( this.context ).on( types, this.selector, data, fn ); return this;}Отже, якщо не liveпереходить до версії, в якій немає, оновлення може не знадобитися відразу для застарілого коду. Для нового курсу відключення курсу on()замість цього рекомендується. Я просто думав, що ця інформація може допомогти комусь іншому на якомусь етапі.
Нема

1
Див міграції приклади про те , як змінити liveдо on.
Samuel Liew

Відповіді:


246

У onдокументації зазначено (напівжирним шрифтом)):

Обробники подій прив'язані лише до обраних на даний момент елементів; вони повинні існувати на сторінці в той момент, коли ваш код робить дзвінок .on().

Еквівалентним .live()було б щось подібне

$(document.body).on('change', 'select[name^="income_type_"]', function() {
    alert($(this).val());
});

Хоча краще, якщо ви прив’яжете обробник подій якомога ближче до елементів, тобто до елемента, який знаходиться ближче в ієрархії.

Оновлення: відповідаючи на інше питання, я виявив, що це також зазначено в .liveдокументації :

Переписання .live()методу з точки зору його наступників є простим; це шаблони для еквівалентних викликів для всіх трьох методів вкладення подій:

$(selector).live(events, data, handler);                // jQuery 1.3+
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+

5
@Jack: Не хвилюйтесь, IMO це гарне питання. Я припускаю , що інші будуть спотикатися це, а коли вони намагаються перетворити все bind, liveі delegateдзвінки на on.
Фелікс Клінг

4
Ага так, і звичайно, ми бачимо цю відповідь лише після запуску ковдри з пошуку та заміни з .live>.on
ajbeaven

3
IMO, .onсинтаксис є більш логічним, оскільки слухач насправді приєднаний до вибраного вами селектора. Коли подія запускається, jQuery обходить DOM та виконує обробники, де зазначено (просте делегування події). .liveприпустив, що трапилося щось "магічне", і було сказано, що додаються обробники подій для "майбутніх елементів", що було не зовсім правдою.
Девід Гелсінг

1
@FelixKling це правильно - я також натрапив на це! Дякуємо
willdanceforfun

2
Для пошукової системи: метод jQuery ".live ()" амортизується з v1.7 та видаляється в v1.9. Виправте свої сценарії, скориставшись методом ".on ()". Дивно, але це впливає і на поточний Microsoft jquery.unobtrusive-ajax.js v2.0.20710.0 (Microsoft також не оновлював свої сценарії, тому тепер він порушений).
Тоні Уолл

25

Окрім вибраної відповіді,

Порт jQuery.liveна jQuery 1.9+, поки ви чекаєте перенесення вашої програми. Додайте це у свій файл JavaScript.

// Borrowed from jQuery 1.8.3's source code
jQuery.fn.extend({
  live: function( types, data, fn ) {
          if( window.console && console.warn ) {
           console.warn( "jQuery.live is deprecated. Use jQuery.on instead." );
          }

          jQuery( this.context ).on( types, this.selector, data, fn );
          return this;
        }
});

Примітка: Вищевикладена функція не працюватиме з jQuery v3, як this.selectorвидалено.

Або ви можете скористатися https://github.com/jquery/jquery-migrate


7

Щойно знайшли краще рішення, яке не передбачає редагування коду сторонньої сторони:

https://github.com/jquery/jquery-migrate/#readme

Встановіть пакет jQuery Migrate NuGet у Visual Studio, щоб усунути всі проблеми з версіями. Наступного разу Microsoft оновлює свої ненав’язливі модулі AJAX та валідацію, можливо, спробуйте її без сценарію міграції ще раз, щоб побачити, чи вирішили вони проблему.

Оскільки jQuery Migrate підтримує jQuery Foundation, я думаю, що це не лише найкращий підхід для сторонніх бібліотек, а також отримання попереджувальних повідомлень для власних бібліотек із деталізацією способів їх оновлення.


3

Окрім вибраних відповідей,

Якщо ви використовуєте Visual Studio , ви можете використовувати Regex Replace .
У меню Правка> Знайти та замінити> Замінити у файлах
або Ctrl + Shift + H

У спливаючому вікні Знайти та замінити встановіть ці поля

Знайдіть що: \$\((.*)\)\.live\((.*),
Замініть на: $(document.body).on($2,$1,
У параметрах пошуку поставте прапорець "Використовувати регулярні вирази"


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.