Включение live() в on() в jQuery

Мое приложение динамически добавляет Dropdowns. Пользователь может добавить столько, сколько им нужно.

Я традиционно использовал метод jQuery live() для обнаружения, когда один из этих раскрывающихся списков был change() ed:

$('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 и т.д. В журнале ошибок нет ошибок.

Что я делаю неправильно? Спасибо!

Ответ 1

В 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+

Ответ 2

В дополнение к выбранному ответу,

Порт jQuery.live для jQuery 1. 9+, пока вы ждете перехода приложения. Добавьте это в свой файл JavaScript.

// Borrowed from jQuery 1.8.3 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;
        }
});

Примечание. this.selector функция не будет работать из jQuery v3, поскольку this.selector удален.

Или вы можете использовать https://github.com/jquery/jquery-migrate

Ответ 3

Просто найдено лучшее решение, которое не требует редактирования стороннего кода:

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

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

Поскольку jQuery Migrate поддерживается jQuery Foundation, я думаю, что это не только лучший подход для сторонних библиотек, но также и получение предупреждающих сообщений для ваших собственных библиотек, в которых подробно описывается их обновление.

Ответ 4

В дополнение к выбранным ответам,

Если вы используете Visual Studio, вы можете использовать Regex Replace.
В меню "Редактирование" > "Найти и заменить" > "Заменить в файлах"
Или Ctrl + Shift + H

В поле "Найти и заменить" установите эти поля.

Найти что: \$\((.*)\)\.live\((.*),
Заменить на: $(document.body).on($2,$1,
В опции опций поиска "Использовать регулярные выражения"

Ответ 5

jquery verision x.x.x.js открыть редактор, найти jQuery.fn.extend

добавить код

live: function( types, data, fn ) {
        jQuery( this.context ).on( types, this.selector, data, fn );
        return this;
    },

Пример: jquery-2.1.1.js → строка 7469 (jQuery.fn.extend)

Пример просмотра изображений