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 回答