2013-04-12 57 views
2

以下的onclick大火究竟雙重時間比以前的點擊。換句話說,當我第一次點擊它時,它按預期工作,並且只觸發一次。但是當我再次點擊(在同一行或另一行上)時,它會發生兩次。如果我第三次點擊,它會點燃8次,然後是16次,然後是32次。這是怎麼回事?的jQuery的onclick火災兩倍多以前的點擊

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

的問題是,你的calcTotals功能綁定click事件處理程序,但隨後你click事件處理程序調用calcTotals(結合另一click所有這些元素的事件處理程序)。

所以你打電話calcTotals一次,你每個元件具有一個click事件處理程序。你點擊其中一個,calcTotals再次被調用,並且你現在每個元素有兩個click事件處理程序。然後再次單擊,兩個事件處理程序都被觸發,綁定另外兩個事件處理程序(現在總共有四個)。下一次單擊會添加另外四個(總共八個)等。

您需要將click事件處理函數綁定一次,與calcTotals函數分開。

+0

謝謝。謎團已揭開。 –

0

你綁定事件each()反覆是事件的原因是重複觸發,分配一些類行上您要綁定的事件,並使用類選擇綁定事件。

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

您可以使用event.preventDefault()停止默認操作,然後註冊一個新操作。

這將導致勢必元素不執行以前的所有點擊....

1

你必須先使用off()去除之前的處理函數,然後再附加on() 我希望這段代碼可以幫助你。 。 $( '身體')關( '點擊', '.collapsible')上( 「點擊」, 「.collapsible」 功能(E){ /*做財產以後*/ });