2012-05-19 57 views
0

我找不出我的代碼有什麼問題。 我有幾個全局變量,每次按某個按鈕時都會發生變化,還有一些自定義函數會執行ajax調用,它會返回大量帶有下面分頁的html代碼,其工作原理如下:Javascript:事件重複

$('#foot #pagination a.page').live('click', function(){ 
     window.mode = 'partial';   
     window.key = $('input#search').val();   
     window.page = $(this).parent().find('input').val(); 
     setTimeout('getData();', 0);   
    }); 

有時當移動到另一個頁面事件雙打,我得到了加倍的HTML。調用getData()時調用 ;從瀏覽器控制檯 - 一切工作正常,就像它必須工作。 什麼能導致這種情況?

+2

**永不**將字符串傳遞給'setInterval()'或'setTimeout()'。這樣做與使用'eval()'一樣糟糕,並且只要使用變量,就會導致不可讀和可能不安全的代碼,因爲您需要將它們插入到字符串中,而不是傳遞實際變量。正確的解決方案是'setInterval(function(){/ * your code *)},msecs);'。 'setTimeout()'同樣適用。如果你只想調用一個沒有任何參數的函數,你也可以直接傳遞函數名:'setInterval(someFunction,msecs);'(注意函數名後面有** no **'()') – ThiefMaster

+0

感謝您的注意 –

回答

0

的問題是,jQuery的.live()推動在文件準備一些數據jQuery的疊加,但是阿賈克斯後,響應來自服務器和文檔準備事件又被稱爲 - 在這種情況下.live()再次將相同的數據推送到一個jQuery堆棧,然後導致多個事件正文調用。

我用.die()之前.live()和一切現在正常工作。

+1

「ajax響應來自服務器並再次調用文檔就緒事件之後」 - ** no **,'document.ready'不會在ajax響應中再次調用。你碰巧是從'getData'再次調用'.live',還是從它調用的其他函數中調用'.live'? – bfavaretto

+0

是的,DOM.ready加載了一堆新的事件處理程序,其中.live再次加載,你是對的,實際上這是一個錯誤behavour。 –

0

您只能在document.ready後執行此功能一次。 或者做這樣的事情:

$('#foot').off('click', '#pagination a.page', navigation) // remove event 
      .on('click', '#pagination a.page', navigation); // add event 

function navigation(e) { 
    window.mode = 'partial';   
    window.key = $('input#search').val();   
    window.page = $(e.currentTarget).parent().find('input').val(); 
    setTimeout('getData();', 0);   
});