Превращение 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 загружен и работает и т. д. Нет ошибки в журнале ошибок.
что я делаю не так? Спасибо!
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.сноска.продлить)
Comments