jquery中Live方法不可用,Jquery中Live方法失效
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
蕃薯耀 2016年1月27日 09:31:23 星期三
http://fanshuyao.iteye.com/
jquery中live方法在1.7版本之后就不推荐使用了,在1.11.X之后已经没有该函数了,推荐使用on方法绑定事件
一开始以为是直接使用
$("p").on("click", function(){ alert( $(this).text() ); });
但是动态添加的元素没有绑定事件,没有达到想要的效果。
后来发现原来是这样的:
$(document).on('click', selector, function(){/* some code */});
例子:
$(document).on('click', '.removeRow', function(){ });
Jquery升级之后,很多方法已经有所改变,更多请看:
常见坑
1. 使用了被废弃的jQuery.fn.live
方法
jQuery Migrate库对此错误也在控制台有相应的警告:
JQMIGRATE: jQuery.fn.live() is deprecated
live
方法原本的作用是设置事件代理,该方法在jQuery 1.7之后就不推荐使用了,取代之的是jQuery.fn.on
函数。他们的接口分别是:
$(selector).live('click', function(){/* some code */}); $(selector).on('click', [selector,] function(){/* some code */});
乍一看,中括号里面的参数可以省略掉,俩函数不是一模一样么?于是天真地把函数名live直接替换成on,大部分时候,这么做好像没有引起任何异常。但是如果在你调用on函数的时候,前面的$(selector)
在当前的网页上根本不匹配任何元素(该元素可能是后面的代码才加到DOM里的),那是不会绑定成功的。事实上,live函数将$(selector)
代理到了document
元素上,这个元素是肯定存在的,所以不会出现类似情况。正确的替换方法应该是:
$(selector).live('click', function(){/* some code */}); 替换为 $(document).on('click', selector, function(){/* some code */});
2. 使用了被废弃的jQuery.fn.die
方法
jQuery Migrate对此错误的警告是:
JQMIGRATE: jQuery.fn.die() is deprecated
这个方法和前面的live刚好反过来,取消事件处理函数的绑定。新版本中应该使用off函数代替之,替换方式类似。
3. 使用了被废弃的jQuery.fn.toggle
函数
jQuery Migrate对此错误的警告是:
JQMIGRATE: jQuery.fn.toggle(handler, handler...) is deprecated
早期jQuery中名字叫toggle的函数有两个,一个是用于控制元素的显示和隐藏,这个用途的函数目前jQuery中依旧存在;另一个就是上面提到的被废弃的toggle函数,它用于绑定至少两个函数到同一个元素,点击该元素的时候两个函数交替着执行。这两个同名函数功能相差甚远,为了不引起误导,在jQuery 1.8中就不再建议使用了。替换的方式是把两个函数合并成一个函数的if-else两个区段,然后自己设置一个boolean变量,控制每次点击时应该执行哪个区段即可。
4. 使用了被废弃的jQuery.browser
属性
jQuery Migrate对此错误的警告是
JQMIGRATE: jQuery.browser is deprecated
在前端开发中我们经常要根据不同的浏览器版本做出不同的处理,jQuery.browser
本来是通过浏览器的userAgent字段来提取浏览器相关信息的。新版本中已经将其废弃,而是建议使用特征检测的方法去判断,并且给了一个Modernizr库作为推荐。不过,改成这个库可能改动成本有点大,如果你还是想沿用jQuery.browser
的思路的话,可以自己去实现一下它。例如,判断是不是IE浏览器,可以用
/msie/.test(navigator.userAgent.toLowerCase());
即自己手动获取userAgent字段,并且做一个正则表达式匹配。其他浏览器思路类似,都是对navigator.userAgent
做一个正则匹配。
5. $(html)
格式书写错误
在jQuery Migrate中,出现以下三种警告中的任何一种,都是属于这个错误:
1. JQMIGRATE: $(html) HTML strings must start with '<' character 2. JQMIGRATE: $(html) HTML text after last tag is ignored 3. JQMIGRATE: HTML string cannot start with a '#' character
这个错误还是蛮值得注意的,因为我们文章开头所说的jQuery低版本有XSS漏洞,其实就是和这个错误有关系。在javascript中我们经常会直接将一段html格式的字符串写在jQuery引用里面,比如$('<div></div>')
。按照新版本的jQuery要求,这段html格式的字符串必须是以左尖括号(小于号)开头,其他字符都不可以。以下几种写法,都是错误的:
1. $(" <div></div>"); //错误,字符串最开头有一个空格,不是以小于号'<'开头的 2. $("<div></div>test"); //不标准,html标签结束后后面还有多余的"test",它会被忽略 3. $("#<div></div>); //错误,以井号开头并且后面并不是一个css选择器
这一点在书写的时候注意一下就可以了,其实还是很容易避免的。其中第三种错误其实就不仅仅是警告了,jQuery会直接抛出一个错误,停止javascript代码的继续执行。一般情况以井号开头,例如$("#test")
,其实就是一个普通的选择器,但是上面例子中后面又夹杂着html字符串,这会被jQuery判断为潜在的XSS攻击。
6. jQuery.fn.attr
方法的错误使用(这是个非常易犯的错误!)
jQuery Migrate中,关于attr方法的警告有以下这些:
1. JQMIGRATE: jQuery.fn.attr('value', val) no longer sets properties 2. JQMIGRATE: jQuery.fn.attr('value') no longer gets properties 3. JQMIGRATE: jQuery.fn.attr('checked') may use property instead of attribute 4. JQMIGRATE: jQuery.fn.attr( props, pass ) is deprecated
实践中我发现,早期写的代码里面,获取一个input输入表单的值时,是怎么获取的呢?$('input').attr('value')
;又是怎么设置的呢?$('input').attr('value', 'helloworld')
。这在新版本中都是不正确的!正确的做法应该是
$('input').val(); //获取input表单现在所输入的值 $('input').val('helloworld'); //设置input表单输入的值
到底是获取还是设置,只取决于调用val方法时有没有带着参数。
如果你想手动设置单选框(例如<input type="radio" >
)被选中,应该怎么设置呢?老的代码里面可能会看到这样 $('input').attr('checked', true)
或者$('input').attr('checked', 'checked')
。这些现在也都是不正确的!正确的做法应该是
$('input').prop('checked', true); //把单选框设为选中状态 $('input').prop('checked'); //获取单选框是不是被选中了,返回true或false
这是从jQuery 1.6版本开始使用的写法。如果设置disabled和selected属性,也是使用prop方法。那到底什么时候使用attr方法呢?两者的区别是:prop设置的是某元素固有的属性,而attr设置的是写在html标签上的自定义属性。举个例子:
<input type="checkbox" checked="checked" haha="hello" > var v1 = $('input').prop("checked"); //返回true/false,是否被选中,随状态改变而改变 var v2 = $('input').attr("checked"); //返回"checked",这是你设置在标签上的,不会变 var v3 = $('input').attr("haha"); //返回"hello",自定义属性 var v4 = $('input').prop("haha"); //返回undefined,根本没有这个固有属性
上面提到的第四个错误,jQuery.fn.attr(props, pass) is deprecated
这个警告在真实项目中从未见到过,看了一下源码,触发该警告的jQuery写法很少见,可忽略。
7. 向$.parseJSON
传入了非法的参数
在jQuery Migrate中,该错误产生如下警告
JQMIGRATE: jQuery.parseJSON requires a valid JSON string
jQuery之所以改这个接口,是为了和浏览器自带的JSON.parse接口对齐,从jQuery 1.9开始生效。这个问题常见于AJAX接收服务端返回值的时候。服务端可能返回一个空字符串,这时候调用该接口会产生错误。必须向$.parseJSON
传入合法的JSON字符串。修正方法如下:
var v1 = $.parseJSON(str); 替换为 var v1 = $.parseJSON( str ? str : "null" );
8. 使用了被废弃的’hover’事件字符串
在jQuery Migrate中该错误产生如下警告
JQMIGRATE: 'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'
在注册事件处理函数时,’hover’以前可以看作是’mouseenter mouseleave’两个事件的别称。目前已经将该别称去掉了,所以代码中请用’mouseenter mouseleave’替换之。
9. jQuery.fn.andSelf
已经被替换,不能再使用
jQuery Migrate中是这样的警告:
JQMIGRATE: jQuery.fn.andSelf() replaced by jQuery.fn.addBack()
两个函数功能是完全一样的,可以直接替换。
以上,就是在jQuery升级中常见的问题。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
蕃薯耀 2016年1月27日 09:31:23 星期三
http://fanshuyao.iteye.com/
相关推荐
2. live 方法在处理动态添加的元素时效果良好,但仅限于直接在事件处理器中使用,不能用在其他 jQuery 方法中,如 .data() 或者 .val()。 3. 使用 live 方法时,不能为特定的元素绑定多个事件处理器,因为后来绑定的...
今天在写JQUERY时遇到个问题:当使用脚本动态添加元素xxx时,但... 但是由于1.8版本后live这种方法不再支持,所以需要用下述jquery中on方法解决脚本动态添加元素: 代码如下: $(“.y”).on(‘click’,’.x’,function);
在旧版本的jQuery中,`live`方法是解决动态添加元素事件绑定的理想选择,因为它能够监听到当前及将来可能添加到DOM中的元素。然而,由于性能原因,jQuery 1.7之后的版本不再推荐使用`live`,并最终在版本1.9中将其...
近来做项目,用的jquery1.6.2库,当动态增加div 及select时,事件却不起作用。 查了一些资料,发现bind事件:向匹配元素附加一个或更多事件处理器。而live事件:为当前或未来的匹配元素添加一个或多个事件处理器。 ...
jQuery 事件处理方法是 jQuery 中的核心函数。 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法。术语由事件“触发”(或“激发”)经常会被使用。 通常会把 jQuery 代码放到 部分的事件处理方法中: 实例 ...
3. live()方法的使用:在jQuery 1.7之前的版本中,.live()方法用于为当前以及将来动态添加的元素绑定事件处理器,这使得无论元素何时被添加到DOM中,事件处理器都能被触发。根据本文描述,原本在动态添加元素后使用....
不过需要指出的是,live方法已在jQuery 1.7之后的版本中被废弃,取而代之的是on方法。示例如下: ```javascript jQuery(document).ready(function(){ jQuery(".brandliimg").live('click', function(){ jQuery...
在jQuery中,`append`方法是用来向DOM树中动态添加元素的,这在构建动态页面时非常常见。然而,一个常见的问题是在使用`append`添加的元素上绑定的事件经常无法正常工作,即所谓的“事件无效”。这是因为这些新添加...
在传统的JavaScript事件绑定方法中,如果直接使用jquery的bind方法绑定事件,这种方法只对当前已经存在的DOM元素有效,对于后来动态生成的DOM元素则无法实现事件绑定。原因在于bind方法在执行时,只将事件处理程序...
例如,`.on()`方法是jQuery 1.7版本引入的,它综合了`.bind()`, `.live()`, 和 `.delegate()`的功能,允许在动态生成的元素上绑定事件,同时也支持事件代理。 总的来说,jQuery的事件处理机制大大简化了JavaScript...
首先,讨论了绑定`oninput`和`onpropertychange`事件的方法,然后指出了该方法的局限性,并提出了使用`live`方法作为替代方案来解决对动态添加的输入元素监听失效的问题。 知识点详细解析如下: 1. **实时监听...
当页面中存在多个具有相同类名的子集和父级元素时,可以利用jQuery的live()方法来绑定事件。此方法能够处理动态添加到DOM中的元素的事件。然后通过PHP动态生成的类名来区分不同的父级元素,使得每一个父级子集能够...
- **事件处理**:由于UpdatePanel的异步更新,普通的JavaScript或jQuery绑定的事件可能在更新后失效。为确保事件处理程序在每次更新后仍然有效,可以使用`$(document).ready()`和`$(document).ajaxComplete()`。`...
在 jQuery Mobile 中,由于它使用 AJAX 进行页面导航,页面不会完全刷新,导致页面上的 JavaScript 事件绑定在页面跳转后失效。这是因为默认情况下,jQuery Mobile 只会初始化加载时可见的页面元素。为了解决这个...
因此,代码使用了live方法来动态地为所有具有相同name属性的元素绑定事件监听,确保即使是动态添加的元素也能绑定事件。 e. 提供独立行选中和取消选中的功能 在每行的多选按钮上,代码同样提供单击事件监听器来处理...