2011-11-21 50 views
1

有人能告訴我爲什麼下面的JavaScript代碼導致renewSession()在單擊後被調用7次嗎?JavaScript mouseup事件正在多次點擊單點擊

$(document).ready(function() { 
    $("*").mouseup(function() { 
     renewSession(); 
    }); 
}); 

function renewSession() { 
    $.ajax({ 
     url: "/Account/RenewSession", 
     type: "POST" 
    }); 
} 
+0

從性能和維護的角度來看,*選擇器並不好。 –

回答

6

也許這是因爲mouseup事件通過DOM樹向上傳播,而你在文檔中應用處理程序元素。所以它會觸發第一個元素,然後是父級,直到它到達html(或body,如果不經常檢查,我永遠都不會記得)。

你可以使用:

$(document).ready(function() { 
    $("*").mouseup(function (e) { 
     e.stopPropagation(); 
     renewSession(); 
    }); 
}); 

爲了防止多次調用。


編輯從thiag0地址評論:

感謝您的快速反應...什麼,我試圖做的是調用renewSession()每次在網站上的用戶點擊,以保持會議還活着。此解決方案可以防止一次點擊多次調用renewSession,但會阻止用戶點擊的實際意圖觸發。無論如何要解決這個問題?

您可以只瞄準body元素;只要允許事件通過DOM樹進行傳播(只要不在元素之間調用event.stopPropagation()點擊(或'mouseup'-ed)),那麼事件就會傳播到body。我建議使用:

$(document).ready(function() { 
    $("body").mouseup(function() { 
     renewSession(); 
    }); 
}); 
+0

感謝您的快速響應...我試圖做的是每次用戶點擊該網站時都會調用renewSession()以保持會話的活躍。此解決方案可以防止一次點擊多次調用renewSession,但會阻止用戶點擊的實際意圖觸發。任何方式來解決這個問題? – thiag0

+0

@ thiag0,請參閱已編輯/更新的答案。 –

+0

@DavidThomas很好的答案和快速更新! +1 –

1

的* selctor匹配7元......

在HTML冒泡DOM樹活動,除非明確告知停止,因此該事件將觸發對每個元素向上匹配選擇器的樹(在這種情況下,它們都是!)

如果這不是你想要的行爲我要麼使用更具體的選擇器,要麼調用stopPropagation方法。

+0

感謝您的快速響應...我試圖做的是每次用戶點擊該網站時都會調用renewSession()以保持會話的活躍。此解決方案可以防止一次點擊多次調用renewSession,但會阻止用戶點擊的實際意圖觸發。任何方式來解決這個問題? – thiag0