在jQuery中将live()转换为on()

Jac*_*ack 197 javascript jquery jquery-1.7

我的应用程序动态添加了Dropdown.用户可以根据需要添加任意数量的内容.

我传统上使用jQuery的live()方法来检测其中一个下拉列表是否被change()编辑:

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

从jQuery 1.7开始,我将其更新为:

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

看看Docs,这应该是完全有效的(对吗?) - 但事件处理程序永远不会触发.当然,我已经确认jQuery 1.7已加载并正在运行等.错误日志中没有错误.

我究竟做错了什么?谢谢!

Fel*_*ing 242

on文档的状态(粗体)):

事件处理程序仅绑定到当前选定的元素; 它们必须存在于您的代码调用时页面上.on().

相当于.live()将类似

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

尽管将事件处理程序尽可能地绑定到元素(即,更靠近层次结构中的元素)会更好.

更新:在回答另一个问题时,我发现.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+
Run Code Online (Sandbox Code Playgroud)

  • @Jack:不用担心,IMO这是一个很好的问题.我认为当他们试图将所有`bind`,`live`和`delegate`调用转换为`on`时,其他人也会偶然发现这一点. (5认同)
  • 啊,是的,当然我们只是在运行毯子查找并从`.live`>`.on`替换之后才看到这个答案 (4认同)
  • IMO,``.on``语法更符合逻辑,因为侦听器实际上连接到您提供的选择器.触发事件时,jQuery遍历DOM并执行指定的处理程序(简单事件委派).``.live``表示发生了一些"神奇"的东西,据说它附加了"未来元素"的事件处理程序,这并非完全正确. (3认同)
  • 对于搜索引擎:jQuery".live()"方法自v1.7起折旧并在v1.9中删除.使用".on()"方法修复脚本.令人惊讶的是,这也影响了当前的微软jquery.unobtrusive-ajax.js v2.0.20710.0(微软没有更新他们的脚本,所以现在它已经坏了). (2认同)

Vik*_*ary 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;
        }
});
Run Code Online (Sandbox Code Playgroud)

注意:上面的函数不能从jQuery v3 this.selector中删除.

或者,您可以使用https://github.com/jquery/jquery-migrate


Ton*_*all 7

刚刚找到一个更好的解决方案,不涉及编辑第三方代码:

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

在Visual Studio中安装jQuery Migrate NuGet包以使所有版本控制问题消失.下次微软更新他们不引人注目的AJAX和验证模块时,可能会在没有迁移脚本的情况下再次尝试它,看看他们是否解决了这个问题.

由于jQuery Migrate是由jQuery Foundation维护的,我认为这不仅是第三方库的最佳方法,也是为您自己的库获取详细说明如何更新它们的警告消息.