【问题标题】:Emulate Javascript 'alert' blocking nature模拟 Javascript 的“警报”阻止性质
【发布时间】:2012-11-29 21:44:03
【问题描述】:

是否可以创建一个自定义模式消息,在用户输入之前“阻止”脚本的执行?

例如,如果不使用本机窗口警报/提示功能,如何实现?

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

我知道您可以让您的自定义对话框在用户输入时调用回调函数,但我有兴趣能够强制执行这种阻塞行为

【问题讨论】:

  • 不幸的是,没有。出于安全原因,无法添加您自己的阻止方法。
  • @EliGassert“很遗憾”?奇怪的单词选择;-)
  • @pst 不幸的是,因为它会让 webdevs 更轻松地制作“漂亮”的阻塞对话框。但我想这是幸运的,因为它很容易被误用:)
  • @pst 不,不存在漂亮的阻塞对话框。通过使用异步,根据定义,它不是阻塞的。它可能会在视觉上阻塞,但它不是阻塞。在 BG 中继续执行。
  • @pst 显然是给你的。他的问题与“阻止用户交互”无关,因为它与真正的阻止有关。

标签: javascript alert


【解决方案1】:

是否可以创建一个自定义模式消息,在用户输入之前“阻止”脚本的执行?

没有。没有办法像原生弹出窗口那样有效地阻止执行或用户交互(因为使用自定义弹出窗口,用户在技术上总是能够使用开发人员工具摆脱它)。

但是,正如 pst 在有关问题的 cmets 中所说,异步灯箱并不繁重,并且几乎在阻止用户交互方面与弹出窗口一样有效,因此我建议您找到一个为您提供灯箱的库喜欢并与它一起运行。

例如,如果不使用本机窗口警报/提示功能,如何实现?

您不能使用该代码执行您所说的操作,即使 带有本机窗口警报/提示功能(请参阅this fiddle - 在关闭弹出窗口前等待 4 秒)。您需要以下内容:

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

如果没有原生弹出窗口,这是您无法实现的(确切地说 - 参见上面的灯箱)。

即使while(true) 循环通常也不会像弹出窗口那样阻塞 - Firefox 至少有一个“停止脚本”消息,它在运行时间过长后会弹出,我相当确定其他主要浏览器也会这样做.

【讨论】:

  • 好吧,如果需要重写 javascript 异步函数怎么办? (例如用户脚本)
  • 想象一下,您必须使用自定义阻止功能覆盖 alert,例如。 ajax 调用或类似的疯狂的东西。如果你的生活依赖它,你会怎么做?
  • @TomášZato 我不会 - alert 是语言的一部分,它内置在浏览器中,所以...不。游戏结束了。
  • 好吧,你可以覆盖它,但是你不能复制阻塞行为。至少我不知道怎么做 - 这是我的问题。
【解决方案2】:

不,你不能(至少不能在浏览器中)。 Javascript API 大多是异步的。 alert/prompt 是例外。但是,使用异步提示和回调并不难。

【讨论】:

  • 这是误导。这意味着“除了警报之外的所有内容”都是异步的,这是错误的。当然,while(true) { 1; } 只是如此(即不是很)有趣并且会产生一个无响应的页面..
  • while(true) 不是 API,而是一种语言结构!
  • 所以选择你的“Javascript API”。说,getElementById。它不是异步的。
  • (我没有投反对票,但这个答案可以更好地与原始问题联系起来。)
【解决方案3】:

有点旧,但如果它有帮助,我已经找到了我的解决方案:

var answer = confirm("are you sure?"); if(!answer)return;

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多