jquery onclick对前一次点击的触发次数是原来的两倍

时间:2013-04-12 09:15:56

标签: jquery events

以下onclick会比之前的点击次数快两倍。换句话说,当我第一次点击它时它按预期工作并且仅触发一次。但当我再次点击(在同一行或另一行)时,它会发射两次。如果我第三次点击它会发射8次然后发射16次然后发射32次。怎么了?

calcTotals: function (table){
        var totals=[];
        $(table).find('tbody').children('tr').each(function(r,row){

            $(row).on('click',function(e){
                $(this).toggleClass('selectedForTotal');
                $(table).find('tbody').children('tr:last').remove();
                dialog.calcTotals(table);
                e.stopPropagation();
                return false;
            })

             if($(row).hasClass('selectedForTotal')){
                $(this).children('td').each(function(c,cell){
                    if($(cell).hasClass('realNumber')){

                        cell.style.textAlign='right';
                        cell=$(cell).html().replace(/,/g,'').replace('(','-').replace(')','');
                        if (!totals[c]) totals[c]=0;
                        totals[c]+=parseFloat(cell);
                        $(cell).val(formatNumber(cell,2,false,true,true));

                    }else {cell.style.textAlign='left';}
                })
            }
        })

        var newRow=$('<tr>').appendTo($(table).find('tbody'))
            .attr({'id':'totals','class':'highlightRow','tabIndex':'1'})
            .on('click',function(i,item){
                $(this).toggleClass('highlightRow');
        }).css('cursor','pointer');

        console.log('total : '+totals);

        $(totals).each(function(i,item){
            $('<td>').html(item?   formatNumber(totals[i],2,false,true,true):'').appendTo(newRow);
        })

        $(newRow).focus();
    }

4 个答案:

答案 0 :(得分:1)

在使用on()附加新元素之前,必须先使用off()删除前一个处理程序 我希望这段代码可以帮到你.. !!! $(&#39; body&#39;)。off(&#39;点击&#39;,&#39; .collapsible&#39;)。on(&#34;点击&#34;,&#34;。可折叠&#34;,功能(e){    / *做某事* / });

答案 1 :(得分:0)

您在each()中重复绑定事件重复,这是重复触发事件的原因,将一些类分配给要绑定事件的行并使用类选择器绑定事件

 $(".rowclass").on('click',function(e){
        $(this).toggleClass('selectedForTotal');
        $(table).find('tbody').children('tr:last').remove();
        dialog.calcTotals(table);
        e.stopPropagation();
        return false;
 })

答案 2 :(得分:0)

您可以使用event.preventDefault()停止默认操作,然后注册一个新操作。

这将导致绑定到元素的所有先前点击不执行....

答案 3 :(得分:0)

问题是,您的calcTotals函数会绑定click事件处理程序,但您的click事件处理程序会调用calcTotals(绑定另一个click事件所有这些元素的处理程序)。

因此,您只需调用calcTotals一次,每个元素就有一个click个事件处理程序。您单击其中一个,calcTotals再次被调用,现在每个元素有两个click事件处理程序。然后再次单击,两个事件处理程序都被触发,绑定另外两个click事件处理程序(现在总共有四个)。下一次单击添加另外四个(总共八个),等等。

您需要一次绑定click事件处理程序,与calcTotals函数分开。