当前位置: 代码迷 >> Web前端 >> jquery的live绑定事件,不知道是否jquery的bug
  详细解决方案

jquery的live绑定事件,不知道是否jquery的bug

热度:161   发布时间:2012-10-09 10:21:45.0
jquery的live绑定事件,不知道是不是jquery的bug

今天无意中发现,级联菜单中,select的onchange事件在ie8下调用了两次,而且下拉框中的数据有重复,记得以前测试这个功能是没有问题的。由于项目已经正式运营,不由的就出冷汗,脸色发白了。呵呵。由于js太多,不好查。一开始以为是有两个地方掉了。发现里边只有这一个地方写了个onchange基本可以排除这种可能,后来怀疑是不是什么地方递归了,把代码读了一下。基本可以排除这种可能。后来在火狐下试了一下,居然是好的。后来怀疑是兼容性问题。计划写个延迟事件,屏蔽掉一次算了。可是总有些不甘啊。后来在网上查了下,(还是技术不行),知道可以查看是什么地方调用了这个方法alert(callerDemo.caller.toString());可以查看是什么地方调用了这个方法。其中callerDemo是方法名。这下就感觉希望来了。alert一下后发现两次调用的居然是一样的。不免有些失望。后来看caller返回的是个对象。于是想到看他的父级是什么东西alert(callerDemo.caller.caller.toString());,这下就发现问题。两次调用的根源是不一样的。于是把别的js都删掉,这下就好了。最后排除到$(".search").live("change", function(){?});去掉它就可以了。可是调用的地方的class并不是这个的。将live改为bind就可以了。可是bind是不能绑定ajax后加载出来的内容的。哎,耗费了我几个小时查出来的。呵呵,跟大家分享下。文采不行。大家将就看吧。呵呵?

?

?

?

下面补充一下,一开始没看jquery1.4中live是不支持绑定change。

jy1245626认为bind和live都能绑定后加载的dom,我又测试了一下。bind不能绑定后加载的。下面是主要的测试代码。

?

<script type="text/javascript">
	$(document).ready(function(){
		$(".bindtest").bind("click",function(){
			alert('bind点击');
		});
		$(".livetest").live("click",function(){
			alert('live点击');
		});
	});
	function test(){
		$("#test2").append($('<a class="bindtest">bindtest2</a>'));
		$("#test2").append('<br/>');
		$("#test2").append($('<a class="livetest">livetest2</a>'));
	}
	</script>

?

?

?

?

<div id="test2">
		<a class="bindtest">bindtest</a><br/>
		<a class="livetest">livetest</a>
		<br/>
		<br/>
		<input type="button" onclick="test();" value="添加"/> 
		<br/>
		<br/>
		
	</div>

?

1 楼 jy1245626 2011-09-05  
bind为什么不能给动态的dom绑定事件?你试过吗?

bind的跟live都是为动态dom而生的!
2 楼 xuedong 2011-09-06  
jy1245626 写道
bind为什么不能给动态的dom绑定事件?你试过吗?

bind的跟live都是为动态dom而生的!



呵呵,你这么一说我还真没底了,因为一直没试过。以前一直是看手册是那么写的。刚才测试了下。bind不能绑定后生成的。我把测试例子,放上去,不信你可以试下。
  相关解决方案