我传统上是使用jQuery的
live()
方法来检测何时其中一个下拉菜单是change()
ed:$('select[name^="income_type_"]').live('change', function() {
alert($(this).val());
});
从jQuery 1.7开始,我ve已将其更新为:
$('select[name^="income_type_"]').on('change', function() {
alert($(this).val());
});
看文档,这应该是完全有效的(对吗?)-但是事件处理程序永远不会触发。当然,我已经确认jQuery 1.7已加载并正在运行,等等。错误日志中没有错误。
我在做什么错?谢谢!
#1 楼
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+
评论
@杰克:不用担心,海事组织是个好问题。我认为其他人在尝试将所有的绑定,实时和委托调用都转换为on时也会遇到麻烦。
–费利克斯·克林(Felix Kling)
2011年11月5日在16:30
嗯,是的,当然,我们只有在全面查找并从.live> .on替换后,才能看到此答案。
–ajajaven
2011年11月7日23:06
IMO,.on语法更具逻辑性,因为侦听器实际上已附加到您提供的选择器上。触发事件后,jQuery将遍历DOM并在指定的地方执行处理程序(简单事件委托)。 .live暗示发生了一些“魔术”事件,据说它为“未来元素”附加了事件处理程序,但这并不完全正确。
– David Hellsing
2011-12-12 17:15
@FelixKling是正确的-我也偶然发现了这个!谢谢
–willdanceforfun
2012年4月5日,下午3:41
对于搜索引擎:jQuery“ .live()”方法自v1.7起已弃用,并已从v1.9中删除。通过使用“ .on()”方法来修复脚本。令人惊讶的是,这也影响了当前的Microsoft jquery.unobtrusive-ajax.js v2.0.20710.0(Microsoft也不更新其脚本,因此现在它已损坏)。
–托尼·沃尔
13年1月30日在13:05
#2 楼
除了选择的答案之外,在等待应用程序迁移时,将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;
}
});
注意:由于删除了
this.selector
,上述功能在jQuery v3中不起作用。或者,您可以使用https://github.com/jquery/jquery-migrate
#3 楼
刚刚找到了一个不涉及编辑第三方代码的更好的解决方案:https://github.com/jquery/jquery-migrate/#readme
安装jQuery在Visual Studio中迁移NuGet程序包,以消除所有版本控制问题。下次Microsoft下一次更新他们的AJAX和验证模块时,也许会在没有迁移脚本的情况下再次尝试它,以查看它们是否解决了问题。
由于jQuery Migrate由jQuery Foundation维护,我认为这不仅是因为第三方库的最佳方法,还可以获取您自己的库的警告消息,详细说明如何更新它们。
#4 楼
除了选择的答案,如果使用Visual Studio,则可以使用Regex替换。
在“编辑”>“查找和替换”>“在文件中替换”
或Ctrl + Shift + H
在“查找和替换”弹出窗口中,设置以下字段
查找内容:
$\((.*)\)\.live\((.*),
替换为:$(document.body).on(,,
在查找选项中,选中“使用正则表达式”
#5 楼
jquery verision 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)
示例图片视图
评论
我知道这已经很晚了,但是无论如何似乎实际上都在使用jQuery live,因此直到删除live之后,才可能需要重新编写旧代码,我相信这是1.9。摘自1.7.1源:live:function(types,data,fn){jQuery(this.context).on(types,this.selector,data,fn);返回此;}因此,如果不升级到不再运行的版本,则可能不需要立即为旧版代码进行更新。对于新代码,建议不要使用on()。我只是认为这些信息可能会在某个阶段帮助其他人。有关如何实时更改的信息,请参见迁移示例。