jquery 事件失效以及解决方法

主要区分于:bind ()与live()方法。
.live() 就提供了对应这种情况的方法。如果我们是这样绑定click事件的:

$('.clickme').live('click', function() {
  alert("Live handler called."); 
});

然后再添加一个新元素:

$('body').append('<div class="clickme">Another target</div>');

然后再点击新增的元素,他依然能够触发事件处理函数。

事件委托

.live() 方法能对一个还没有添加进DOM的元素有效,是由于使用了事件委托:绑定在祖先元素上的事件处理函数可以对在后代上触发的事件作出回应。传递给 .live() 的事件处理函数不会绑定在元素上,而是把他作为一个特殊的事件处理函数,绑定在 DOM 树的根节点上。在我们的例子中,当点击新的元素后,会依次发生下列步骤:

  1. 生成一个click事件传递给 <div> 来处理
  2. 由于没有事件处理函数直接绑定在 <div> 上,所以事件冒泡到DOM树上
  3. 事件不断冒泡一直到DOM树的根节点,默认情况下上面绑定了这个特殊的事件处理函数。
  4. 执行由 .live() 绑定的特殊的 click 事件处理函数。
  5. 这个事件处理函数首先检测事件对象的 target 来确定是不是需要继续。这个测试是通过检测 $(event.target).closest('.clickme') 能否找到匹配的元素来实现的。
  6. 如果找到了匹配的元素,那么调用原始的事件处理函数。

由于只有在事件发生时才会在上面的第五步里做测试,因此在任何时候添加的元素都能够响应这个事件。

 

0 0

jquery 事件失效问题10

       问题如下:

我今天做一个联动下拉框的时候,遇到了一个奇怪的问题,在ready方法里面注册的事件失效了!比如:$("#province").change(function(){........})当我改变id为province下拉框的值的时候,这个方法并没有执行!原因如下:

1.html部分代码

Html代码  
  1. <select id="province">    
  2. <option value="default">请选择</option>  
  3. </select>  
  4. <select id="section">  
  5. <option value="default">请选择</option>  
  6. </select>  
  7. <select id="estate" name="id_area">  
  8. <option value="default">请选择</option>  
  9. </select>  
<select id="province"> 
<option value="default">请选择</option>
</select>
<select id="section">
<option value="default">请选择</option>
</select>
<select id="estate" name="id_area">
<option value="default">请选择</option>
</select>

 2.部分js代码

Js代码 
  1. $(document).ready(function(){   
  2.     //发送一个AJAX请求 (获得全国省份信息)   
  3.     $.ajax({   
  4.         type:"post",   
  5.         dataType:"xml",   
  6.         url:"areaAction.do",   
  7.         data:"action=getProvince",   
  8.                 success:function(data){   
  9.         //需要追加的字符串   
  10.         var appendHtml="";   
  11.         //循环加载   
  12.         $(data).find("node").each(function(i){   
  13.         appendHtml+="<option value='"+$(data).find("node id").eq(i).text()+"'>"  
  14.         +$(data).find("node name").eq(i).text()+"</option>";   
  15.         }   
  16.         )   
  17.         //追加HTML代码   
  18.         $("#province").append(appendHtml);   
  19.         },   
  20.         error:function(XMLResponse){   
  21.             alert("获取省份信息失败");   
  22.             }   
  23.         });  
$(document).ready(function(){
  	//发送一个AJAX请求 (获得全国省份信息)
	$.ajax({
		type:"post",
		dataType:"xml",
		url:"areaAction.do",
		data:"action=getProvince",
                success:function(data){
		//需要追加的字符串
		var appendHtml="";
		//循环加载
		$(data).find("node").each(function(i){
		appendHtml+="<option value='"+$(data).find("node id").eq(i).text()+"'>"
		+$(data).find("node name").eq(i).text()+"</option>";
		}
		)
		//追加HTML代码
		$("#province").append(appendHtml);
		},
		error:function(XMLResponse){
			alert("获取省份信息失败");
			}
		});

 当加载html页面的时候,我发送了一个AJAX请求,请求获得全国的省份信息。在

Html代码  
  1. <select id="province">    
  2. <option value="default">请选择</option>  
  3. </select>  
<select id="province"> 
<option value="default">请选择</option>
</select>

之间追加了一些选项。如果不发送这个请求,$("#province").change(function(){........})函数就会被触发,但是你一但发送,相当于就改变了id为province的下拉框,以前注册的change事件就失效了!至于原因,我也不是很清楚。不过如果这样写就可以:

Js代码  
  1. $("#province").live("change",function(){.....});  
$("#province").live("change",function(){.....});

 live事件API文档解释如下

live( type, fn )

jQuery 1.3中新增的方法。给所有当前以及将来会匹配的元素绑定一个事件处理函数(比如click事件)。也能绑定自定义事件。

目前支持 click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup。
还不支持 blur, focus, mouseenter, mouseleave, change, submit
与bind()不同的是,live()一次只能绑定一个事件。

这个方法跟传统的bind很像,区别在于用live来绑定事件会给所有当前以及将来在页面上的元素绑定事件(使用委派的方式)。比如说,如果你给页面上所有的li用live绑定了click事件。那么当在以后增加一个li到这个页面时,对于这个新增加的li,其click事件依然可用。而无需重新给这种新增加的元素绑定事件。

 

转载于:https://my.oschina.net/u/615191/blog/124525

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于你的问题,我可以为你提供一些可能的解决方法。首先,您可以尝试将jQuery库链接到您的页面。如果您已经这样做了,请检查控制台是否存在任何错误消息。另外,请确保您的jQuery代码与您的HTML代码正确匹配,并且没有任何语法错误。最后,您可能需要检查jQuery插件是否与您使用的jQuery版本兼容。希望这些提示能够帮助您解决问题。 ### 回答2: jQuery有时会失效的原因有很多,下面列举几个常见的情况。 1. jQuery库未正确引入:在使用jQuery之前,需要在HTML页面中正确引入jQuery库文件。如果没有正确引入,或者引入的文件路径错误,就会导致jQuery无法使用。 2. jQuery版本不兼容:有些jQuery方法或特性只在特定版本中有效,如果使用的是不兼容的jQuery版本,就会导致部分功能失效。 3. 语法错误:使用jQuery时,需要遵循正确的语法和规范。如果在编写代码过程中存在语法错误,就会导致jQuery部分或全部功能失效。 4. 元素未正确选中:在使用jQuery对页面元素进行操作时,需要确保正确选中目标元素。如果选择器选择的元素不存在、或者选择器写法错误,就会导致jQuery失效。 5. 代码执行时机不正确:有时候,需要在DOM加载完成后再执行jQuery代码。如果在DOM尚未加载完成时执行jQuery代码,就会导致部分功能失效。 6. 与其他库的冲突:如果同时使用了多个库,可能会出现冲突的情况。例如,与Prototype库或其他JavaScript库同时使用时,可能会导致jQuery失效解决这些问题的方法包括:检查库文件是否正确引入、确认选择器是否正确、验证代码的语法是否正确、确保代码执行时机正确、排查与其他库的冲突等。 总而言之,jQuery有时失效可能是由于引入问题、版本不兼容、语法错误、元素选择错误、代码执行时机不正确或与其他库冲突等原因导致的,解决方法是仔细检查代码,确保上述问题都得到正确处理。 ### 回答3: jQuery有时会失效的原因有很多,下面列举几个可能的情况。 首先,可能是由于jQuery版本问题。如果使用的是旧版本的jQuery,那么可能会有一些新功能无法正常使用或存在一些已知的bug。解决方法是更新到最新版本的jQuery。 其次,可能是由于代码编写错误。在使用jQuery时,需要确保语法和方法的使用都是正确的。比如,可能漏写了括号、分号或双引号,或者方法名写错了等。可以通过仔细检查代码并参考jQuery的官方文档来解决这些问题。 再次,可能是由于DOM元素未加载完全。如果在页面加载完成之前就执行了jQuery代码,那么可能会导致无法找到相关的DOM元素,从而导致jQuery失效解决方法是将jQuery代码放在文档就绪事件(document.ready)里面,确保页面加载完全后再执行jQuery操作。 另外,可能是由于与其他插件或库的冲突。如果页面同时使用了多个jQuery插件或其他JavaScript库,可能会出现命名冲突或方法重复定义的问题,导致jQuery失效解决方法是排查冲突,并确保各个插件或库之间的兼容性。 最后,可能是由于浏览器的兼容性问题。不同的浏览器对JavaScriptjQuery的支持程度不同,可能会导致一些代码在某些浏览器中失效解决方法是查阅浏览器的兼容性文档,并根据需要进行相应的调整或使用兼容性更好的解决方案。 综上所述,jQuery有时失效的原因包括版本问题、代码错误、DOM加载顺序、与其他插件冲突以及浏览器兼容性问题等。要解决这些问题,需要仔细检查代码、更新版本、确保DOM加载完全、排查冲突并考虑浏览器兼容性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值