JavaScript关闭警告框

45
我希望能够使用JavaScript在特定时间或特定事件(例如onkeypress)后自动关闭警报框。 通过我的研究,似乎使用内置的alert()函数无法实现这一点。 是否有办法覆盖它并控制它打开的对话框?
另外,我不希望覆盖显示隐藏的
作为警报。 我需要一个真正的对话框。
12个回答

24

如先前所述,你无法做到这一点。你可以使用UI框架在窗口内创建模态对话框,或者你可以使用一个弹出式窗口,在超时后自动关闭脚本...每种方法都有负面影响。浏览器内的模态窗口如果被最小化,将不会创建任何通知,并且基于编程(定时器)的弹出窗口很可能会被现代浏览器和弹出式阻止程序阻挡。


11

看起来你可以使用 Notification API 实现类似的功能。你无法控制它停留的时间(可能是某种操作系统偏好,除非你指定 requireInteraction 为 true,那么它会一直保持显示直到被关闭或直到你关闭它),并且需要用户首先点击“允许通知”(不幸的是),但是这就是方法:

如果你想让它在1秒后关闭(所有的操作系统至少会将其保持打开1秒):

var notification = new Notification("Hi there!", {body: "some text"});
setTimeout(function() {notification.close()}, 1000);

如果您想要显示比“默认”更长的时间,我想您可以绑定到onclose回调并显示另一个重复的通知来替换它。

参考:这个答案所启发,尽管该答案在现代Chrome中不再起作用,但通知API确实起作用。


requireinteraction标志也“应该”使其无限期地保持打开状态(直到他们关闭它或您使用#close方法关闭为止)。顺便说一下,在操作系统.X上,默认超时时间为5秒。 - rogerdpack

7

如果您对对话框没有控制权,那么您将无法编写侵入式的JavaScript代码。 (除了调试之外,使用警报(alert)来执行任何操作都不是一个好主意)


17
现在...我承认我偶尔还会这样做,但是...真的吗?为调试设置警报?你在提倡这么做吗? - eyelidlessness
7
“alert()”非常适用于调试。我最近在iPad @办公室编写用户脚本时使用了它。感谢上帝有“alert()”! :) - A.D.
5
在不同的情况下,我发现警报(alert)和控制台日志(console.log)都很有帮助。但是在循环内部千万不要使用alert();,否则会导致计算机崩溃。 :) - www139
只会调试,其他方面一无是处,!=支持哈哈 - undefined

4

我想使用javascript在特定时间或事件(例如onkeypress)后自动关闭警告框。

顺便说一句:如果您有一个Alert("data"),您将无法在后台保持代码运行(据我所知)......对话框是模态窗口,因此您不能失去焦点。因此,您将无法运行任何按键或计时器......


1
我的警告框将由异步事件触发,所以理论上这不应该是一个问题。 - Andrew Ensley
5
JavaScript 不是异步的。调用 alert/confirm/prompt 会冻结所有脚本处理(甚至通常会冻结整个网络浏览器),直到用户回答完毕。 - bobince
2
@bobince JavaScript确实允许异步行为;但它不是多线程的。如果线程在一段代码块中冻结——无论是异步还是同步——所有代码都将在那一点上被冻结。 - jpaugh

3

尝试使用boot box插件。

var alert = bootbox.alert('Massage')
alert.show();
setTimeout(function(){alert.modal('hide'); }, 4000);

2

我猜你可以打开一个弹出窗口,并将其称为对话框。虽然我不确定细节,但我相当确信你可以从JavaScript中程序化地关闭你打开的窗口。这个方案可行吗?


1
不错的解决方案,但是OP只想要警告对话框。但是对于那些想要控制对话框的人来说,这应该是可以的。+1 - GoodSp33d

2
这里唯一真正的替代方案是使用带有模态选项的自定义小部件。看一下jQuery UI,了解具有这些功能的对话框示例。几乎每个JS框架中都存在类似的东西。

1
我知道,但不幸的是,在JavaScript中这确实是处理这些东西的唯一方法。 - Toby Hede
6
不必生气,你提出了一个问题,我回答说这是不能做到的,并提供了一个替代方案,但并没有改变原意。 - Toby Hede
2
哇...多年后,我简直不敢相信自己当时有多蠢。很抱歉当你尝试帮助我的时候,我表现得如此愚蠢。 - Andrew Ensley

0

如果你在JS中以编程方式实现它,那就像重新发明轮子一样。我建议使用一个名为jGrowljQuery插件。


1
jGrowl只是显示一个内联div。我需要一个对话框。谢谢。 - Andrew Ensley

0
也许可以使用HTML的对话框标签
我在寻找同样的问题/答案时找到了W3Schools上使用对话框的替代方案。我对他们的示例进行了相当大的修改,以实现自动打开和关闭。对话框标签的使用方法如下所示。在这里,我使用setTimeout来进行打开和关闭的操作。我计划用JavaScript函数替换setTimeout,在调用fetch之前打开对话框,并在完成时间较长的promise被实现时关闭对话框。
<!DOCTYPE html>
<html>
  <body>
    <h1>The HTML Dialog Object</h1>
        <dialog id="myDialog">This is a dialog window</dialog>
    <h2>The Dialog will open 3 seconds after window load and close, 5 seconds after first showing, on it's own</h2>

    <script>
      function showDialog(dialog) {
        dialog.show();
        closeDialog(dialog);
      }

      function closeDialog(dialog) {
        setTimeout(function () {
          dialog.close();
        }, 5000);
      }

      function init() {
        setTimeout(function () {
          const dialog = document.getElementById("myDialog");
          showDialog(dialog);
        }, 3000);
      }

      init();
    </script>
  </body>
</html>

希望我能展示一个视频,但是这段代码将会在你的VS Code Live Server上正常运行。

-2

你实际上可以做到这一点,你可以基本上监听这个弹出窗口的发生,然后在它“弹出”之前确认为真。

if(window.alert){
  return true
}

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