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

IT技术 javascript jquery jquery-1.7
2021-01-21 07:32:03

我的应用程序动态添加了下拉菜单。用户可以根据需要添加任意数量。

我传统上使用 jQuery 的live()方法来检测这些 Dropdowns 之一何时被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个回答

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+
啊,是的,当然,我们只有在从.live> 中进行全面查找和替换后才能看到此答案.on
2021-03-25 07:32:03
@FelixKling 是正确的 - 我也偶然发现了这个!谢谢
2021-03-25 07:32:03
IMO,.on语法更合乎逻辑,因为侦听器实际上附加到您提供的选择器。当事件被触发时,jQuery 遍历 DOM 并在指定的地方执行处理程序(简单的事件委托)。.live暗示发生了一些“神奇”的事情,据说为“未来元素”附加了事件处理程序,这并不完全正确。
2021-03-28 07:32:03
对于搜索引擎:jQuery“.live()”方法自 v1.7 起已弃用,并在 v1.9 中移除。改用“.on()”方法来修复您的脚本。令人惊讶的是,这也影响了当前的 Microsoft jquery.unobtrusive-ajax.js v2.0.20710.0(Microsoft 也没有更新他们的脚本,所以现在它已损坏)。
2021-04-03 07:32:03
@Jack:不用担心,IMO 这是个好问题。我相信其他人会绊倒这个问题,以及当他们尝试转换所有bindlivedelegate以电话on
2021-04-08 07:32:03

除了选择的答案,

端口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

在 Visual Studio 中安装 jQuery Migrate NuGet 包以消除所有版本控制问题。下次 Microsoft 更新他们不显眼的 AJAX 和验证module时,可能会在没有迁移脚本的情况下再次尝试,看看他们是否解决了问题。

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

除了选定的答案,

如果您使用Visual Studio,则可以使用Regex Replace
在编辑 > 查找和替换 > 在文件中替换
或 Ctrl + Shift + H

在查找和替换弹出窗口中,设置这些字段

查找内容: \$\((.*)\)\.live\((.*),
替换为: $(document.body).on($2,$1,
在查找选项中选中“使用正则表达式”

jquery 版本 xxxjs 打开编辑器,找到 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)

示例图像视图