模拟JavaScript中的“alert”阻塞特性

20

是否可以创建一个自定义的模态消息,以阻止脚本的执行,直到用户输入?

例如,如何在不使用本机窗口警报/提示功能的情况下实现此目的?

setInterval(function(){ 
     alert('Click OK to Continue');  // timing stops until user hits ok
},4000);

我知道你可以让你的自定义对话框在用户输入时调用回调函数,但我想要能够强制实现这种阻塞行为。


7
很遗憾,不行。出于安全考虑,无法添加自己的阻止方法。 - Eli Gassert
2
@EliGassert "不幸"?词语选择有点奇怪;-) - user166390
@lostsource 这是一个好事情,将顺序代码转换为贫民续延变得微不足道(再次欢呼,感谢没有线程)。 - user166390
3
不,漂亮的阻塞式对话框不存在。使用异步时,根据定义,它不会阻塞。它可能在视觉上会阻塞,但它并不是真正的阻塞。执行将继续在后台进行。 - Eli Gassert
3
@pst 显然这是针对你的。他的问题与“阻止用户交互”无关,而是涉及真正的阻止。 - Eli Gassert
显示剩余8条评论
3个回答

11
有没有可能创建一个自定义模态消息,它可以“阻止”脚本的执行直到用户输入?
不行。无论如何,都没有办法像本机弹出窗口一样有效地阻止执行或用户交互(因为对于自定义弹出窗口,用户总是可以使用开发者工具来摆脱它)。
但是,正如pst在问题的评论中所说,异步灯箱并不繁琐,并且几乎可以像弹出窗口一样有效地阻止用户交互,因此我建议找到一个提供您喜欢的灯箱的库并使用它。
例如,如果不使用原生的window alert / prompt函数,该如何实现此功能?
即使使用了本机窗口警报/提示功能(请参见这个fiddle-等待4秒钟才关闭弹出窗口),也不能使用该代码做你说的事情。你需要以下内容:
function timeoutFunction() {
    alert('Click OK to Continue');  // timing ACTUALLY stops until user hits ok
    setTimeout(timeoutFunction, 4000);
}
setTimeout(timeoutFunction,4000);

这是一些内容,你无法精确实现(请参见上文中的灯箱),除非使用本地弹出窗口。

即使是while(true)循环也通常不会像弹出窗口一样阻塞 - 至少火狐浏览器会在脚本运行时间过长后弹出“停止脚本”消息,我相信其他主要浏览器也会有类似的提示。


那么,如果需要覆盖JavaScript异步函数怎么办?(例如用户脚本) - Tomáš Zato
想象一下,你必须用自定义的阻塞函数覆盖 alert,例如一个 ajax 调用或类似疯狂的东西。如果你的生命取决于此,你会如何做到? - Tomáš Zato
@TomášZato 我不会这样做 - alert 是语言的一部分,内置于浏览器中,所以... 不行。游戏结束。 - Jeff
你可以覆盖它,但是你无法复制阻塞行为。至少我不知道如何做到 - 这就是我的问题。 - Tomáš Zato

-1

不行,在浏览器中至少不能这样做。JavaScript API 大多数都是异步的。alert/prompt 是例外。然而,使用异步提示和回调并不是很难。


1
这是误导性的。它暗示了“除了alert之外的所有内容”都是异步的,这是错误的。当然,while(true) { 1; } 只是这样(即不太)有趣,并且会导致页面无响应.. - user166390
4
while(true) 不是 API,而是语言结构! - Emil Ivanov
2
选择你的“Javascript API”。比如,getElementById。它不是异步的。 - user166390
我没有点踩,但这个回答可以更好地与原问题联系起来。 - user166390

-3
有点老了,但如果有帮助的话,我已经找到了解决方案:
var answer = confirm("你确定吗?"); if(!answer) return;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接