2011-12-25 74 views
1

我有以下JS代碼可能雙擊速度有多快?

$('#dialog').dialog({ 
    ... 
    buttons: { 
    OK: function() { 
     callAjax({"some":"param"}); 
     $('#dialog').dialog('close'); 
    } 
    } 
}); 

var ajaxBatch = []; 

function callAjax(cmd) { 
    ajaxBatch.push(cmd); 
    if (ajaxBatch.length == 1) 
    setTimeout(ajaxItself, 1); 
} 

function ajaxItself() { 
    ajaxBatch.push({"minor":"data"}); 
    $.post('url', { msg: JSON.stringify(ajaxBatch) }); 
    ajaxBatch = []; 
} 

理論上我應該總是得到[{"some":"param"},{"minor":"data"}]

但是,我經常在錯誤的請求中獲得錯誤日誌條目,其中有[{"some":"param"},{"some":"param"},{"minor":"data"}]

這樣的事情可能會發生嗎?用他們的2x按鈕做A4鼠標是否有意義,或者是什麼?

順便說一句,我不能再現這種情況,我只是在日誌中看到它。而且用戶代理不受限於特定的瀏覽器。

+4

A4鼠標? 2個按鈕?咦?超時的目的是什麼?這留下了1ms的窗口,以便註冊其他點擊。 – 2011-12-25 18:17:13

+0

目的是在一個查詢中收集多個命令。但是帶有事件生成按鈕的對話框將在第一個'push()'之後被關閉。 – 2011-12-25 18:21:48

+0

那麼爲什麼1ms超時?如果你想註冊多個按鈕,1ms的窗口非常短。 – 2011-12-25 18:22:36

回答

1

瀏覽器可能排隊多於1個點擊事件,因此無論按鈕是否可見以供他們繼續點擊,事件都已設置爲運動。

OK:功能

if (!dialogIsClosed) { 
     callAjax({"some":"param"}); 
     $('#dialog').dialog('close'); 
     dialogIsClosed = true; 
} 

也許設置一個標誌,我會想象一個瀏覽器會選擇處理從該事件隊列中的項目在從setTimeout的處理隊列中的一個項目。

+0

謝謝。當然,這是一種解決方法。但我想找到原因,如果可能的話。儘管如此,您的回答讓我覺得,當操作系統從單獨的用戶點擊發送兩個點擊事件時,瀏覽器可能會掛起。 – 2011-12-26 07:04:53

+1

它可能會或可能不會泄露記錄點擊事件的毫秒數。希望它的分辨率足以讓你看到不同之處。 – goat 2011-12-26 15:17:14