Превращение live () в on () в jQuery



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



Я традиционно использовал jQuery live() метод для обнаружения, когда один из этих выпадающих списков был 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 загружен и работает и т. д. Нет ошибки в журнале ошибок.



что я делаю не так? Спасибо!

462   5  

5 ответов:

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

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

порт 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

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

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

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

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

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

Если вы используете Visual Studio можно использовать Регулярное Выражение Заменить.
В меню Правка > найти и заменить > заменить в файлах
Или Ctrl + Shift + H

во всплывающем окне найти и заменить установите эти поля

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

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.сноска.продлить)

пример изображения view

Comments

    Ничего не найдено.