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()因为这些函数执行异步给出的代码.
confirm() prompt()并且alert()是特殊功能 - 它们将JavaScript沙箱调用到浏览器中,浏览器暂停JavaScript执行.你不能做同样的事情,因为你需要在JavaScript中构建你的功能.
我不认为有一个很好的方法可以放弃替换,而不进行一些重组:
myconfirmfunction(function() {
/* OK callback */
}, function() {
/* cancel callback */
});
Run Code Online (Sandbox Code Playgroud)
您无法在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按钮,并在用户单击其中一个时调用回调函数.
要么使用回调,要么只使用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)