2

簡単にするために、UI をブロックする多目的関数が必要です (つまり、クリック イベントですが、ホバーなどではない可能性があります)。オプションで、完了時にコールバックを実行します。これまでのところ、私はこれを持っています:

blockedUI=false;
function blockUI(milliseconds,callback)
{
    blockedUI=true;
    if (callback===undefined)
        setTimeout(function(){blockedUI=false;},milliseconds);
    else
        setTimeout(function(callback){blockedUI=false;callback();},milliseconds);
}

function itemClicked(item)
{
   if(blockedUI)return;

   //handle click
}

blockUI(1000,function{alert("UI is now available");});

基本的に、何かを処理するたびに、UI が現在「ブロック」されているかどうかを確認します。ここでの私の具体的な問題は、setTimeout に渡す無名関数にコールバック関数を渡す方法がわからないことです。

本当の問題は、どのようにコールバック パラメータを渡し、それを setTimeout 匿名関数パラメータの本体で呼び出すことができるかということです。

4

2 に答える 2

3

に追加のパラメータを指定できます。これらは、関数が呼び出されたときに指定setTimeoutした関数に渡されます。したがって、setTimeout

setTimeout(function(foo) { alert(foo); }, 100, "green")

タイムアウトが経過すると、「緑色」でアラートが表示されます。そのようにコールバックを関数に渡すことができます。

そうは言っても、あなたの場合、コールバックを匿名関数に渡す必要はまったくありません.blockUI内で宣言されているため、匿名関数のスコープ内にある必要があります。これは、より明確であり、古いブラウザーでより適切にサポートされているため、より良い方法だと思います。

于 2013-11-05T23:22:42.727 に答える
2

コールバック パラメータをコールバックに渡す必要はありませんsetTimeout()setTimeout()親スコープにあり、インラインの子関数で使用できるため、渡されたとおりにコールバックで使用できます。

したがって、これを行うことができます:

blockedUI = false;
function blockUI(milliseconds, callback) {
    blockedUI = true;
    if (callback === undefined) {
        setTimeout(function() {
            blockedUI = false;
        }, milliseconds);
    } else {
        setTimeout(function() { 
            blockedUI = false; 
            // the callback argument from above is available here
            // without doing anything special
            // arguments from parent functions are automatically usable
            callback();
        }, milliseconds);
    }
}
于 2013-11-05T23:54:12.697 に答える