2

以下 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

4 回答 4

0

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

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

于 2013-04-12T09:18:53.637 回答
0

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

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

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

于 2013-04-12T09:19:41.797 回答
0

在使用 on() 附加新元素之前,您必须使用 off() 删除以前的处理程序我希望这段代码可以帮助你..!!! $('body').off('click', '.collapsible').on("click", ".collapsible", function (e) { /* Do somthing */ });

于 2014-10-06T08:38:55.587 回答
0

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

 $(".rowclass").on('click',function(e){
        $(this).toggleClass('selectedForTotal');
        $(table).find('tbody').children('tr:last').remove();
        dialog.calcTotals(table);
        e.stopPropagation();
        return false;
 })
于 2013-04-12T09:17:13.847 回答