Javascript 暂时阻止UI,并运行回调

Javascript 暂时阻止UI,并运行回调,javascript,function,anonymous-function,Javascript,Function,Anonymous Function,为了简单起见,我需要一个通用函数来阻止UI(即单击事件,但可能不是悬停等),并在完成后选择性地运行回调。到目前为止,我有: blockedUI=false; function blockUI(milliseconds,callback) { blockedUI=true; if (callback===undefined) setTimeout(function(){blockedUI=false;},milliseconds); else

为了简单起见,我需要一个通用函数来阻止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匿名函数参数的主体中调用它

您可以为
setTimeout
指定其他参数,这些参数将在调用函数时传递到您提供给
setTimeout
的函数中——因此

将在超时时间过后发出“绿色”警报。您可以这样将回调传递到函数中


话虽如此,在您的例子中,您根本不需要将回调传递到匿名函数中——它应该在匿名函数的作用域中,因为它是在blockUI中声明的。我认为这是一种更好的方法,因为它更清晰,更受旧浏览器的支持。

您不需要将回调参数传递到
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);
    }
}

只需在所有内容上附加一个不可见的div层,就可以很容易地完成您想要的操作。完成后删除它。好的,当然,但我仍然希望能够创建一个接受回调的blockUI函数。如果你使用JQuery,你可以使用名为BlockUI的插件。那么,您是否有在调用
setTimeout
时要发送到回调的参数?无论哪种方式,你都有一些选择。谢谢。你是对的。我的错误是,我最初将全局变量blockUI命名为与函数blockUI相同的名称,因此当我收到错误时,我假设您不能只调用原始范围内的回调。另外,关于额外参数的信息对我很有帮助,
setTimeout()
的这些额外参数在很多版本的IE(如IE9和以前的版本)中都不起作用。谢谢,我知道它在C#中是这样工作的,但我没有意识到javascript也会“捕获”外部变量。@AwokeKnowing-这在所有浏览器中都有效,与
setTimeout()
的额外参数不同。这似乎是一个更好更安全的选择。是的,这就是我现在正在做的@克里斯·W首先指出了这一点,所以我尝试了一下,结果成功了。谢谢。@AwokeKnowing-但我甚至没有得到至少一张赞成票,因为我向你展示了你可以使用的确切代码,并且只推荐了在所有浏览器中都能使用的东西。我通常不喜欢向上拉票,但我真的不喜欢Chris的答案,因为他的答案的要点似乎是推荐一些在IE9中不起作用的东西,这不是解决问题的最简单方法。你说得对,不是专注于“解决方案”,而是专注于我的实际问题,这是关于传递参数的。
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);
    }
}