什么应该是jQuery.live()的正确替代品。我知道jQuery.on()做同样的事情,但是在jQuery.on()的情况下,我们必须指定父进程才能使它工作。
假设我的页面上有500个直播,现在我想要将所有500个实时更改为on并通过选择每个元素的父级来完成它将不可行并且需要更多时间。
假设我有$(".item").live("click",function(){ alert("test"); });
如果我用jQuery.on()替换它,那么它应该是$("body").on("click",".item",function(){ alert("test"); });
但我想知道是否有一些快捷方式或其他任何方式来实现这个
$(".item").on("click",function(){ alert("test"); });
这样我就可以在几秒钟内完成所有操作。
答案 0 :(得分:4)
.live()
已经死了,很长时间.live()
:
https://github.com/jquery/jquery/commit/eed78cc321ed7e2b37fb34e32fbb528b24f61d6e
虽然很认真,但对于你寻求的单行,你可以把它添加回来:
jQuery.fn.live = function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }
将它添加到JS的顶部以有效地创建一个垫片,允许您根据需要使用.live()
,而不关心您正在使用的jQuery版本。
但实际上,就像其他人所说的那样,你应该使用你选择的文本编辑器或者像sed这样的命令行实用程序来执行find-replaceall。在我给你的垫片解决方案中,你正在调用一个函数来调用另一个函数,这会引入很多开销,并且可能会使用不必要的资源。 .on()
效率更高,尤其是直接调用它时。
更新:上述解决方案依赖于jQuery的内部.context
属性,自jQuery 1.10以来has been deprecated可能会在任何后续版本中消失。另一个应该满足您大部分时间需求的替代版本只是将this.context
替换为document
。这具有.context property's API中列出的限制:
此属性的值通常等于document,因为这是 jQuery对象的默认上下文(如果没有提供)。该 例如,如果对象是由对象创建的,则上下文可能不同 在
<iframe>
或XML文档中搜索。
所以它可能会失败。无论如何,到现在为止你绝对没有理由不直接使用.on()
。请随时查看my tips on upgrading to the most recent version of jQuery。
答案 1 :(得分:3)
您可以通过调用live
来定义一个小插件,为您提供旧的on
功能,但这只会让您使用更差的代码。您需要重构代码以正确使用on
。
帮助您更轻松地管理初始更改的解决方案是使用正则表达式进行替换。大多数文本编辑都可以让你这样做。
对于您提供的用例,您可以使用它(例如在JavaScript中,适应您的编辑器):
var output = input.replace(
/\$\(\"([^\"]+)\"\)\.live\(\"([^\"]+)\"/g,
'$(document.body).on("$2", "$1"'
);
输入:
$(".item").live("click",function(){ alert("test"); });
$(".item2").live("change",function(){ console.log("test"); });
输出
$(document.body).on("click", ".item",function(){ alert("test"); });
$(document.body).on("change", ".item2",function(){ window.top.console.log("test"); });
在初始转换之后,您必须寻找比document.body
更好的父元素。
答案 2 :(得分:2)
与@ destroy的答案类似 - 在备份文件后需要尝试的其他内容
我没有Komodo但是设法为Notepad ++开发了以下内容:
查找
\$\("(.+)"\).live\("(.+)",
替换为
$(document).on('\2', '\1',
正则表达式语法各不相同,因此您可能需要使用它。
您可能还需要调整或运行几种正则表达式的变体,例如,以满足单引号或双引号或空格。