现在我有相同的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的值加了两次,再点一次,它又自动加了两次。就没法搞了啊。真真就不知道怎么办了。
大神们。怎么办呢?

解决方案 »

  1.   

    不明白你说的执行了两次是什么意思1:如果你确实绑定事件只绑了这么一次,那么每个事件必定只被执行一次
    2:x为全局变量,每点击一次x将递增1
    3:如果你想控制它在显示/隐藏之间切换。使用jQuery没你搞得那么复杂
    $(this).toggle()即可
      

  2.   

    为什么把事件放在doTest里面?你可能没有把全部代码给出来。楼上的toggle建议挺好的
      

  3.   

    不是执行两次。是当我点击第几个a的时候,它就会打印几次,同时x的值是递增的。比如,我点击第三个a的时候,它就会打印3次,x的值依次为1,2,3,但是我才点击一次。真的,不信你们试试。我把它写在dotest里面是为了加载调用的,这个没影响撒?在里面放$(this).toggle(),照样执行a的个数次,奇数还好,偶数就会抵消掉方法效果。大家听懂了么?我也不知道怎么描述啊。但是是真的。不信你们试试。
      

  4.   

    哦。。不是不是,我单独在本地写了一个这样的不是,我的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。具体是什么问题,我就真真不知道了。
      

  5.   

    这种  情况 一般断点调试下 就搞定了
    dotest()这个方法 设置断点
    调试的时候 查看 调用栈看看到底从哪里开始调用了 dotest法 和click给你10分钟去试下
      

  6.   


    你每动态添加一个li就执行一次doTest()???我前面第一条就说了,你要确定只绑定了一次,你这哪里是绑定一次呀,你这每加多少li进去就重复的绑定了多少次事件,你说的什么"打印的次数"就是你执行了doTest()的次数将doTest中的$(".a").bind改为$(".a").live。只在初始化时调用一次即可,后面动态添加进去的li不要再去调用doTest
      

  7.   

    大神,对不起,我的学术不精惹您生气了,我错了,真心的没学好bind和live的区别。请您原谅我。
      

  8.   


    我不是啥大神呀。而且我也么有生气呀碉堡了。jQuery中使用bind或者直接事件[click,blur,change.....等等]进行的事件绑定,都是可追加形式的。绑定几次执行几次,后面的并不会覆盖前面的使用live和delegate绑定的事件,可以给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效