281

我最近将 jQuery 从 1.8 更新到 2.1。我突然发现.live()停止工作了。
我得到错误TypeError: $(...).live is not a function

有什么方法可以代替.live()吗?

4

10 回答 10

594

jQuery.live()从 1.9 版开始被移除。

这意味着,如果您从 1.8 及更早版本升级,如果您不遵循下面的迁移指南,您会发现出现问题。您不能简单地替换.live().on()!


在开始搜索和替换之前阅读:

对于实时站点上的快速/热修复不要只用 替换关键字live,因为参数不同on

.live(events, function)

应映射到:

.on(eventType, selector, function)

(子)选择器非常重要!如果您出于任何原因不需要使用它,请将其设置为null.


迁移示例 1:

前:

$('#mainmenu a').live('click', function)

之后,将子元素 ( a) 移动到.on()选择器:

$('#mainmenu').on('click', 'a', function)

迁移示例 2:

前:

$('.myButton').live('click', function)

之后,将元素 ( .myButton) 移动到.on()选择器,并找到最近的父元素(最好带有 ID):

$('#parentElement').on('click', '.myButton', function)

如果你不知道作为父母应该放什么,body总是有效的:

$('body').on('click', '.myButton', function)

也可以看看:

于 2013-01-16T08:30:51.077 回答
90

您可以通过包含以下 JavaScript 代码来避免重构代码

jQuery.fn.extend({
    live: function (event, callback) {
       if (this.selector) {
            jQuery(document).on(event, this.selector, callback);
        }
        return this;
    }
});
于 2015-07-30T17:51:13.880 回答
20

jQuery >= 1.9的转发端口.live()避免重构 JS 依赖于.live() 使用优化的 DOM 选择器上下文

/** 
 * Forward port jQuery.live()
 * Wrapper for newer jQuery.on()
 * Uses optimized selector context 
 * Only add if live() not already existing.
*/
if (typeof jQuery.fn.live == 'undefined' || !(jQuery.isFunction(jQuery.fn.live))) {
  jQuery.fn.extend({
      live: function (event, callback) {
         if (this.selector) {
              jQuery(document).on(event, this.selector, callback);
          }
      }
  });
}
于 2015-08-05T08:13:48.877 回答
17

jQuery API 文档列出live()了自 1.7 版起已弃用并自 1.9 版起已删除:link

不推荐使用的版本:1.7,已删除:1.9

此外,它指出:

从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用.on()附加事件处理程序。旧版本 jQuery 的用户应该使用.delegate()而不是 .live()

于 2013-01-16T08:27:15.073 回答
7

.live() 已被弃用,现在已从 jQuery 1.9 中删除 你应该使用.on()

于 2013-01-16T08:27:22.583 回答
6

.live 在 1.9 中被删除,请参阅升级指南:http: //jquery.com/upgrade-guide/1.9/#live-removed

于 2013-01-16T08:27:29.527 回答
6

一个非常简单的修复,不需要更改代码,只需添加 jquery 迁移脚本,在此处下载 https://github.com/jquery/jquery-migrate/

它提供了 jquery 已弃用但需要的功能,如“live”、“browser”等

于 2015-05-07T07:20:29.207 回答
5

如果没有必要,我倾向于不使用 .on() 语法。例如,您可以像这样更轻松地迁移:

老的:

$('.myButton').live('click', function);

新的:

$('.myButton').click(function)

以下是有效事件处理程序的列表:https ://api.jquery.com/category/forms/

于 2017-04-08T17:25:00.393 回答
3

当我在我的网站上收到此错误时。它将停止我网站上的某些功能,经过研究,我找到了解决此问题的方法,

$colorpicker_inputs.live('focus', function(e) {
    jQuery(this).next('.farb-popup').show();
    jQuery(this).parents('li').css( {
        position : 'relative',
        zIndex : '9999'
    })
    jQuery('#tabber').css( {
        overflow : 'visible'
    });
});

$colorpicker_inputs.live('blur', function(e) {
    jQuery(this).next('.farb-popup').hide();
    jQuery(this).parents('li').css( {
        zIndex : '0'
    })
});

应该将“ live ”替换为“ on ”检查下面

    $colorpicker_inputs.on('focus', function(e) {
    jQuery(this).next('.farb-popup').show();
    jQuery(this).parents('li').css( {
        position : 'relative',
        zIndex : '9999'
    })
    jQuery('#tabber').css( {
        overflow : 'visible'
    });
});

$colorpicker_inputs.on('blur', function(e) {
    jQuery(this).next('.farb-popup').hide();
    jQuery(this).parents('li').css( {
        zIndex : '0'
    })
});

下面还有一个基本示例:

.live(event, selector, function) 

将其更改为:

.on(event, selector, function)
于 2020-10-13T07:19:15.793 回答
2

如果您碰巧使用的是 Ruby on Rails 的 jQuery gem jquery-rails,并且由于某种原因您无法重构您的遗留代码,那么仍然支持的最后一个版本是2.1.3,您可以通过在 上使用以下语法来锁定它Gemfile

gem 'jquery-rails', '~> 2.1', '= 2.1.3'

那么您可以使用以下命令进行更新:

bundle update jquery-rails

我希望能帮助其他面临类似问题的人。

于 2017-07-05T19:47:16.657 回答