以下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();
}
答案 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
函数分开。