2011-12-16 21 views
2

私はボタンがクリックされたときにプロセスを起動するために、次のプロトタイプのコードを持っている:jQuery.attr()メソッドが「クリック」イベント内で動作しないのはなぜですか?

jQuery("#queue-process").click(function() { 
    jQuery("#queue-process").attr("disabled", "disabled"); 
    try { 
     processQueue(); 
    } catch (e) { 
     console.log(e.message); 
    } finally { 
     jQuery("#queue-process").removeAttr("disabled"); 
    } 
}); 

processQueue関数が常に呼び出されますが、私はクロームのJavaScriptコンソールに匿名関数をデバッグする場合にのみ、attr("disabled", "disabled")が呼び出され、つまり、私はその行にブレークポイントを置いて、それをシングルステップ実行すれば動作しますが、デバッガの外側ではprocessQueue()しか実行されません。

なぜこのようなことが起こる可能性がありますか?

+2

あなたは 'processQueue()'はボタンが1秒間だけ無効になるほど速くないのですか?デバッガを使用する場合の唯一の違いは、実行速度です。 – Interrobang

+1

補足として、ハンドラの中で 'jQuery(this)'を使うことができます。 – pimvdb

答えて

5

デバッグしていないときに実行されている可能性があります。

私は、processQueue()が即座に戻り、すぐにコードがfinallyブロックに移動し、コンポーネントがすぐに再有効化されるため、実際には表示されないようです。デバッグすると実行がブロックされ、コンポーネントが無効になっていることがわかります。

processQueueは正確に何をしていますか? Ajaxのいくつかの作業を行っている場合、デフォルトではAjaxリクエストは非同期で実行されることに注意してください。たぶんあなたはprocessQueueにコールバック関数を渡す必要があるかもしれないので、作業の完了時に#queue-processだけを再び有効にしますか?

関連する問題