暂停JavaScript执行而不锁定浏览器

cll*_*pse 6 javascript execution

您是否能够在不锁定浏览器的情况下暂停JavaScript执行?通常停止执行的方式是执行无限while()循环,但在FireFox的情况下,它会锁定浏览器,直到循环结束.

你对此有何看法?


我试图覆盖window.confirm()使用HTML实现我自己的对话框.我这样做,所以我不必更改现有的代码(这是一个非常大的代码库).

我需要能够暂停执行以允许用户输入; 反过来返回一个像标准确认函数那样的布尔值:

if (confirm("..."))
{
    // user pressed "OK"
}
else
{
    // user pressed "Cancel"
}
Run Code Online (Sandbox Code Playgroud)



更新

据我所知; 这不能使用setTimeout()setInterval()因为这些函数执行异步给出的代码.

Ben*_*tto 9

confirm() prompt()并且alert()是特殊功能 - 它们将JavaScript沙箱调用到浏览器中,浏览器暂停JavaScript执行.你不能做同样的事情,因为你需要在JavaScript中构建你的功能.

我不认为有一个很好的方法可以放弃替换,而不进行一些重组:

myconfirmfunction(function() {
   /* OK callback */
}, function() {
   /* cancel callback */
});
Run Code Online (Sandbox Code Playgroud)


Mar*_*ius 7

您无法在JavaScript中停止事件线程,因此您必须解决此问题,通常是使用回调函数.这些函数稍后运行,但可以像JavaScript中的任何其他对象一样传递.您可能从AJAX编程中熟悉它们.所以,例如:

doSomeThing();
var result = confirm("some importart question");
doSomeThingElse(result);
Run Code Online (Sandbox Code Playgroud)

将被转换为:

doSomeThing();
customConfirm("some importart question", function(result){
  doSomeThingElse(result);
});
Run Code Online (Sandbox Code Playgroud)

customConfirm现在在哪里提出问题并将结果传递给它作为参数的函数.如果使用按钮实现DOM对话框,则将事件侦听器连接到OK和CANCEL按钮,并在用户单击其中一个时调用回调函数.


Eli*_*rey 7

要么使用回调,要么只使用Firefox代码.在支持JavaScript 1.7及更高版本的Firefox中,您可以使用yield语句来模拟所需的效果.我为此创建了一个名为async.js的库.async.js的标准库包含一个confirm方法,可以这样使用:

if (yield to.confirm("...")) {
  // user pressed OK
} else {
  // user pressed Cancel
}
Run Code Online (Sandbox Code Playgroud)