神奇!!!!有趣的jquery绑定事件~~~~~

wangxiaolin528 2012-11-05 10:53:45
现在我有相同的li如下
<ul>
<li>
<div class="a"></div>
</li>
<li>
<div class="a"></div>
</li>
<li>
<div class="a"></div>
</li>
</ul>
用jquery给他们绑定事件,并测试如下
var x = 0;
function doTest(){
$(".a").bind("click",function(){
x = x + 1;
alert("times="+x);
})
}
这样下来,我点击第一个li的a时候,它打印一次,x为1,可是当我点击第二个li的a时候,它要连续打印两次,x也分别为2,3 我就想不清楚了,这是不是说这个绑定的click方法在我点击第二个a的时候执行了两次??第三个。。。更多的次数会一次递增。这是什么原理啊?
我本来想实现计算每个a的点击次数,来实现相应li的CSS效果,可是现在在偶数a的时候就自动执行偶数次,偶数个li就没办法有效果了。。。比如说,第一个a,我想的是点击一次,它显示,点击第二次影藏,可以,但是到第二个a的时候,点击一下,它自动把x的值加了两次,再点一次,它又自动加了两次。就没法搞了啊。真真就不知道怎么办了。
大神们。怎么办呢?
...全文
277 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rayaspnet 2012-11-06
  • 打赏
  • 举报
回复
为什么把事件放在doTest里面? 你可能没有把全部代码给出来。楼上的toggle建议挺好的
泡泡鱼_ 2012-11-06
  • 打赏
  • 举报
回复
引用 4 楼 wangxiaolin528 的回复:
哦。。不是不是,我单独在本地写了一个这样的不是,我的li都是在后台读出来动态添加到页面的,这样的。所以才会有自动打印很多次的现象,在本地单独写一个不会那样。 我一直怀疑是js的自动计数问题。 这样,本来我的页面加载完成后,有3个li,然后点击第一个li的a,它打印一次x的值,当我动态添加一个li进去,加在第一个li前面,新加的li里面的a点击时,打印一次,原来那个li,也就是现在这个li的a,……
你每动态添加一个li就执行一次doTest()??? 我前面第一条就说了,你要确定只绑定了一次,你这哪里是绑定一次呀,你这每加多少li进去就重复的绑定了多少次事件,你说的什么"打印的次数"就是你执行了doTest()的次数 将doTest中的$(".a").bind改为$(".a").live。只在初始化时调用一次即可,后面动态添加进去的li不要再去调用doTest
KK3K2005 2012-11-06
  • 打赏
  • 举报
回复
这种 情况 一般断点调试下 就搞定了 dotest()这个方法 设置断点 调试的时候 查看 调用栈看看到底从哪里开始调用了 dotest法 和click 给你10分钟去试下
wangxiaolin528 2012-11-06
  • 打赏
  • 举报
回复
哦。。不是不是,我单独在本地写了一个这样的不是,我的li都是在后台读出来动态添加到页面的,这样的。所以才会有自动打印很多次的现象,在本地单独写一个不会那样。 我一直怀疑是js的自动计数问题。 这样,本来我的页面加载完成后,有3个li,然后点击第一个li的a,它打印一次x的值,当我动态添加一个li进去,加在第一个li前面,新加的li里面的a点击时,打印一次,原来那个li,也就是现在这个li的a,点击它就自动打印两次,它自动打印,x的值也会相应增加。也就是说,不管我点击的次数是几次,它打印次数和x的值,却是根据li在当前页面所有li的排序的数来计算的。。。。。。这是什么原因呢? 我在动态向页面添加li的时候,用了这样一句:$(".list li").eq(0).before($(oLi)); 用来插入li。具体是什么问题,我就真真不知道了。
wangxiaolin528 2012-11-06
  • 打赏
  • 举报
回复
不是执行两次。是当我点击第几个a的时候,它就会打印几次,同时x的值是递增的。比如,我点击第三个a的时候,它就会打印3次,x的值依次为1,2,3,但是我才点击一次。真的,不信你们试试。我把它写在dotest里面是为了加载调用的,这个没影响撒?在里面放$(this).toggle(),照样执行a的个数次,奇数还好,偶数就会抵消掉方法效果。大家听懂了么?我也不知道怎么描述啊。但是是真的。不信你们试试。
泡泡鱼_ 2012-11-06
  • 打赏
  • 举报
回复
引用 7 楼 wangxiaolin528 的回复:
大神,对不起,我的学术不精惹您生气了,我错了,真心的没学好bind和live的区别。请您原谅我。
我不是啥大神呀。而且我也么有生气呀。。。碉堡了。。。。 jQuery中使用bind或者直接事件[click,blur,change.....等等]进行的事件绑定,都是可追加形式的。绑定几次执行几次,后面的并不会覆盖前面的 使用live和delegate绑定的事件,可以给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效
wangxiaolin528 2012-11-06
  • 打赏
  • 举报
回复
大神,对不起,我的学术不精惹您生气了,我错了,真心的没学好bind和live的区别。请您原谅我。
泡泡鱼_ 2012-11-05
  • 打赏
  • 举报
回复
不明白你说的执行了两次是什么意思 1:如果你确实绑定事件只绑了这么一次,那么每个事件必定只被执行一次 2:x为全局变量,每点击一次x将递增1 3:如果你想控制它在显示/隐藏之间切换。使用jQuery没你搞得那么复杂 $(this).toggle()即可

87,991

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧