2011-12-25 5 views
1

私は理論的には、私はいつも[{"some":"param"},{"minor":"data"}]を得なければならない、次の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"},{"some":"param"},{"minor":"data"}]があります。

このようなことが起こる可能性はありますか? 2倍のボタンを持つA4マウスはここで意味がありますか?

私は状況を再現できません。ログに記録されます。 User-Agentは特定のブラウザに限定されていません。

+4

A4マウス? 2倍のボタン?ハァッ?タイムアウトの目的は何ですか?これにより、追加のクリックが登録される1msのウィンドウが残されます。 –

+0

目的は、1つのクエリで複数のコマンドを収集することです。しかし、イベント生成ボタンを持つダイアログは、最初の 'push()'の直後に閉じられることになります。 –

+0

なぜ1msのタイムアウトが発生するのですか?複数のプッシュを登録したい場合、1msのウィンドウは非常に短いです。 –

答えて

1

ブラウザがクリックイベントを2回以上キューに入れている可能性があるため、ボタンがクリックされているかどうかにかかわらず、イベントはすでに動作していました。

は、たぶん私はブラウザはsetTimeoutをキューからアイテムを処理する上でイベントキューから項目を処理選ぶだろう想像あなた OK:機能

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

にフラグを設定します。

+0

ありがとうございます。もちろんこれは回避策です。しかし、それが可能であれば、その理由を見つけたいと思います。あなたの答えは、OSが別々のユーザークリックから2回のクリックイベントを送信している間に、ブラウザがハングアップする可能性があると私に思い出させます。 –

+1

クリックイベントのミリ秒を記録することは明らかであるかもしれません。うまくいけば、それはあなたの違いを見るのに十分な解像度です。 – goat

関連する問題