谷歌浏览器无法显示某个网站的alert()弹窗

27

我正在处理一个JavaScript循环,它会在循环进行时作为弹出窗口显示每个键值。

为了加快进程,我勾选了“阻止此页面创建其他对话框”的框。通常这只是抑制一个例程的弹出窗口,但它们没有回来。

在Google Chrome中,来自该站点的alert()消息不再弹出。其他网站可以,但该站点不能。

有人遇到过这种情况吗?

问:如何重置该站点的alert()消息?


7
也许Chrome是在帮你忙:放弃使用alert,开始使用控制台! - bfavaretto
3
这是一个超级用户类型的问题,但请看一下弹出式管理器 https://support.google.com/chrome/answer/95472?hl=en-GB - epascarello
@Adam 你可能是对的。我打开了很多标签页,试图避免这种情况。请将这个想法发布为答案,如果它有效,我会接受的。 - cssyphus
我推荐下面 chharvey 的解决方案,因为它是最优雅的解决方案(关闭标签页然后重新打开它)。 - aequalsb
8个回答

52
你不需要重启浏览器,只需关闭该选项卡并再次打开即可。不必使用隐身模式。

我确认这个方案可行,并认为它是最优雅的解决方案,谢谢。 - aequalsb

25

未经测试,但如果您再次遇到这个问题,我认为在隐身窗口中打开该网站将会重置对话框。

编辑:我添加了这个答案,它适用于当前的Chrome版本。更新可能已经使此步骤不必要(请不要标记为负面答案!)


你说得完全正确!比让浏览器弹回来要好得多。谢谢。 - cssyphus
1
从Chrome 39开始,对我来说打开一个新的标签页或窗口是有效的 - 不必是隐身模式。 - Rocco
@Rocco - 同意。请看我的回答。 - chharvey
@KjetilNordin: 我觉得这与cookie/session有关。隐身模式不会保留你的cookie。当然,Google的一个员工看到了这个答案并解决了这个问题。 - Hoàng Long

8
重新启动浏览器,这将重置该选项并显示新的对话框。

3

来自OP的留言:

解决方法是重新启动浏览器。失去所有标签?不!

然而,有一种方法可以重新启动浏览器而不会失去所有标签。

安装Session Manager插件。Session Manager有适用于Chrome和Firefox的版本。

Session Manager维护一个正在运行的打开标签列表,并在意外重启或系统崩溃后自动询问您是否要重新打开它们(“恢复会话”)。

此外,Session Manager还允许您按需保存标签并在以后的时间或重新启动后重新加载它们。您可以随时保存您的“会话”(所有打开的标签),并为该会话指定任何名称。

最后,在重新加载以前的会话时,您还可以选择重新打开哪些标签以及忽略哪些标签。

无论是在Chrome还是Firefox中,都不能没有它。

Chrome扩展程序

Firefox扩展程序

如果您使用IE……好吧,您还有其他问题。


我认为你不需要扩展程序来实现这个功能,因为浏览器本身就有相应的属性可以设置。例如,在启动时你可以选择“继续上次的浏览”,你可以在浏览器设置中找到这个选项。 - Guruprasad J Rao

2

如果你想检测它们是否被阻止,你需要自己处理显示的消息,但要覆盖原生的警告/确认框。

window.nativeAlert = window.alert;
window.alert = function (message) {
var timeBefore = new Date();
var confirmBool = nativeAlert(message);
var timeAfter = new Date();
if ((timeAfter - timeBefore) < 350) {
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!");
  }
}

window.nativeConfirm = window.confirm;
window.confirm = function (message) {
var timeBefore = new Date();
var confirmBool = nativeConfirm(message);
var timeAfter = new Date();
if ((timeAfter - timeBefore) < 350) {
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!");
}
 return confirmBool;
}

显然我已将时间设置为3.5毫秒。但经过一些测试,我们只能在大约5毫秒左右点击或关闭对话框。


这背后的逻辑是什么?我知道每行代码的作用,但为什么它会“发现”警报是否被抑制? - Sean Kendle
我们正在使用框架(呸),用户能够在一个页面上关闭它们,然后在其他任何地方都看不到它们。这是一个问题,因为某些验证依赖于确认回调(再次呸)。当确认被阻止时,返回值为false。更糟糕的是,确认框不会显示。所以用户提交后,不知道为什么页面没有任何反应。解决办法是为了弥补糟糕的设计,相信我,我也讨厌它,但这是一个庞大的遗留应用程序。这个解决办法节省了我们大量的时间。 - DeadlyChambers
谢谢您的解释,但我的问题不是关于检查警报抑制的必要性,而是为什么那段代码可以告诉您它已被抑制。我不明白为什么3.5毫秒后就清楚地知道警报已被抑制。谁能在3.5毫秒内点击警报?我感到困惑。 - Sean Kendle
还有,"or die"这个短语——这是PHP内部的一个玩笑吗?哈哈! - Sean Kendle
哦,好吧,它之所以有效是因为没有人可能在3.5毫秒内点击确定/取消按钮。除非他们通过按回车键获得它并且没有从键上移开手指。我从Firefox中得到了这个想法,它检查是否在一秒钟内打开了两个警报,然后显示复选框。无论如何,当浏览器中打开本地弹出窗口时,操作会停止,直到对话框解决(关闭或按下按钮)。由于浏览器不显示对话框,因此它几乎立即运行这些函数。我希望这更加有意义。 - DeadlyChambers
2
@SeanKendle 我喜欢让用户心生畏惧,我发现死亡威胁相当有效。 - DeadlyChambers

1
将此行放在的末尾,当编译器读取此行时,可能DOM尚未准备好。
<script type="text/javascript" src="script.js"></script>"

0

关于脚本命令放置在 body 结束前的问题,Roberto 的回答对我很有帮助。我已经花了几个小时来尝试弄清楚为什么我的控制台命令无法正常工作。


欢迎来到SO。请避免在答案部分添加评论。 - Karthick Ramesh

0

你所需要做的就是重新启动你的浏览器。尝试在另一个浏览器上操作,看看它是否可以用(例如,你能否看到弹出框),如果可以,那么你只需要重新启动你的浏览器来解决它。

这种情况曾经发生在我的 Google Chrome 上,我通过退出并重新打开浏览器来解决了它。


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