【发布时间】:2012-12-30 12:20:12
【问题描述】:
我最近将 jQuery 从 1.8 更新到 2.1。我突然发现.live() 停止工作了。
我收到错误TypeError: $(...).live is not a function。
有什么方法可以代替.live()吗?
【问题讨论】:
标签: javascript jquery function live deprecated
我最近将 jQuery 从 1.8 更新到 2.1。我突然发现.live() 停止工作了。
我收到错误TypeError: $(...).live is not a function。
有什么方法可以代替.live()吗?
【问题讨论】:
标签: javascript jquery function live deprecated
.live() 已从 1.9 版开始删除。这意味着,如果您从 1.8 及更早版本升级,如果您不遵循以下迁移指南,您会发现出现问题。您不能简单地将.live() 替换为.on()!
对于实时站点上的快速/热修复,不要只需将关键字 live 替换为 on,
作为 参数不同!
.live(events, function)
应该映射到:
.on(eventType, selector, function)
(子)选择器非常重要!如果您出于任何原因不需要使用它,请将其设置为null。
之前:
$('#mainmenu a').live('click', function)
之后,您将子元素 (a) 移动到 .on() 选择器:
$('#mainmenu').on('click', 'a', function)
之前:
$('.myButton').live('click', function)
之后,将元素 (.myButton) 移动到 .on() 选择器,并找到最近的父元素(最好带有 ID):
$('#parentElement').on('click', '.myButton', function)
如果你不知道作为父母应该放什么,body 总是有效的:
$('body').on('click', '.myButton', function)
【讨论】:
jQuery('.upload_image_button').live('click', function) 之类的代码替换为 jQuery('body').on('click', '.upload_image_button', function) 之类的代码,它就像一个魅力(当然是在缓存清理之后!)
您可以通过包含以下 JavaScript 代码来避免重构代码
jQuery.fn.extend({
live: function (event, callback) {
if (this.selector) {
jQuery(document).on(event, this.selector, callback);
}
return this;
}
});
【讨论】:
return this; 以保持链接能力
.live() 的 jQuery 转发端口 >= 1.9
避免重构 .live() 上的 JS 依赖项
使用优化的 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);
}
}
});
}
【讨论】:
jQuery API 文档将live() 列为自 1.7 版起已弃用并自 1.9 版起已删除:link。
不推荐使用的版本:1.7,已删除:1.9
它还指出:
从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用.on() 附加事件处理程序。旧版本 jQuery 的用户应该使用 .delegate() 而不是 .live()
【讨论】:
.live() 已被弃用,现在已从 jQuery 1.9 中删除 你应该使用.on()
【讨论】:
.live 在 1.9 中被移除,请查看升级指南:http://jquery.com/upgrade-guide/1.9/#live-removed
【讨论】:
一个非常简单的修复,不需要改变你的代码,只需添加jquery迁移脚本,在这里下载 https://github.com/jquery/jquery-migrate/
它提供了 jquery 已弃用但需要的功能,例如“live”、“browser”等
【讨论】:
如果没有必要,我倾向于不使用 .on() 语法。例如,您可以像这样更轻松地迁移:
旧:
$('.myButton').live('click', function);
新:
$('.myButton').click(function)
以下是有效事件处理程序的列表:https://api.jquery.com/category/forms/
【讨论】:
当我在我的网站上收到此错误时。它将停止某些功能 在我的网站上,经过研究,我找到了解决这个问题的方法,
$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)
【讨论】:
如果你碰巧在使用 Ruby on Rails 的 jQuery gem jquery-rails 并且由于某种原因你不能重构你的遗留代码,最后一个仍然支持的版本是 2.1.3 并且你可以通过使用锁定它Gemfile 上的以下语法:
gem 'jquery-rails', '~> 2.1', '= 2.1.3'
那么您可以使用以下命令进行更新:
bundle update jquery-rails
我希望能帮助其他面临类似问题的人。
【讨论】: