【问题标题】:Don't allow users to stop javascript alert()不允许用户停止 javascript alert()
【发布时间】:2013-07-31 03:34:56
【问题描述】:

我正在开发一个 MVC4 网络应用程序。

我使用 javascript 和 jquery 做很多事情。但是对于这样的信息:

我使用 alert() 函数向用户显示各种消息。 问题是,用户可以阻止此警报出现。如果用户这样做,很多重要的消息和信息将不会显示给他。

我怎样才能让用户无法阻止警报出现?

对不起,我的英语不好。谢谢

【问题讨论】:

  • 你不能——谢天谢地。
  • 您必须创建自己的类似警报的功能(人造模态窗口)。我提醒(呵呵)你:它必须是异步的,所以你当前调用警报的方式可能必须改变。
  • 回答:不要使用警报。
  • 我认为可以通过使用setTimeoutsetInterval 来做到这一点。我仍然认为这是一个糟糕的主意,但这个小提琴说明了我的意思:jsfiddle.net/jEpTF 禁用警报消息的复选框永远不会出现。

标签: javascript jquery


【解决方案1】:

没有。

您无法阻止用户停止显示警报。

警报很烦人:

  • 他们无论如何都会流行并窃取焦点
  • 它们会阻止您在页面上执行的任何操作

警报属于浏览器,而不是网站。同样,避免prompts 和confirms(确认有一个合法用例)。

此外,为了证明这一点 - 从用户态 JavaScript 是不可能的。为了证明这一点,让我们检查一下负责人the source code

内部void WebContentsImpl::RunJavaScriptMessage

if (suppress_this_message) {
    // If we are suppressing messages, just reply as if the user immediately
    // pressed "Cancel".
    OnDialogClosed(rvh, reply_msg, false, string16());
}

当您单击复选框时,suppress_this_message 又被设置为“真”。

可以做什么?

考虑改用modals。它们在设计方面更出色。

模态是:

  • 页面内
  • 不要阻止执行
  • 让您控制他们如何看待浏览器的完整性和跨浏览器、关闭的方式以及与页面交互的方式。

但是怎么做呢?

  • 创建具有固定位置的元素(css position:fixed,或使用 JavaScript 和 position:absolute
  • 将其显示设置为隐藏,并将其设置为类似于“警报”窗口的样式,仅使用适合网站的样式。
  • 单击按钮时显示它,您可能还希望使部分屏幕变暗。
  • 当用户单击关闭时,将其显示 css 属性设置为隐藏。

很多流行的框架,比如 jQueryUI come with modals

【讨论】:

  • “不阻止执行”部分是一把双刃剑。它解决了原生模态的烦恼,但它也是从alert(特别是从confirmprompt)过渡的障碍。
  • @bfavaretto 绝对正确,但是正确的 JavaScript 应该_几乎从不_阻止执行。 JavaScript 确实在非阻塞 I/O 上蓬勃发展。我能想到的警报/提示/确认的唯一合法用例是:1)用户离开页面但不保存(在您开始在 SO 中输入问题后尝试离开页面)。 2) 断言用户启动手势的可信事件(例如内联安装扩展) 3) 调试。
【解决方案2】:

你不能--感谢上帝

这是由许多不同的浏览器实现的,因为网页会向用户发出警报(或数百个),迫使他们关闭每一个,直到您可以关闭窗口(或者您 ctrl+alt+del 并关闭浏览器)--参见which you decide

作为使用咆哮/吐司消息或某种形式的对话框(如 jQuery-UI 对话框)的替代外观。此外,按照今天的标准,使用alert() 是一种过时的提示用户的方式(考虑到可用的其他选项过多)。

【讨论】:

  • 那是过去的美好时光...按住 Enter 并希望他们很快就会停下来。 +1
  • @tymeJV:哦,是的;并伪装链接并将其发送给朋友,以便他们从您新发现的快乐中受益(然后在他们诅咒您时坐下来对 AIM/ICQ 大笑)。
  • @tymeJV 特别是当我们使用警报进行调试并陷入无限循环时......
【解决方案3】:

您不应该使用警报来向您的用户显示重要消息。而是在网页本身内显示消息。有许多插件、库等可以帮助您解决这个问题。一个例子是 Bootstrap http://getbootstrap.com/components/#alerts-default

【讨论】:

    【解决方案4】:

    你不能阻止用户禁用它,而是考虑使用类似http://jqueryui.com/dialog/#modal-message的东西

    jQueryUI 包含在 .net MVC4 模板中:D

    【讨论】:

      【解决方案5】:

      您不能禁用此行为。如果用户看到您的所有通知至关重要,请不要使用 alert(),而是使用模式窗口。

      【讨论】:

        【解决方案6】:

        您无法阻止该复选框出现。这是浏览器中实现的一项功能,用户可以在站点过度使用警报时选择阻止警报。您也无法阻止用户选中该框,但如果您的消息对他们足够重要,他们肯定不会。

        您应该考虑使用模态窗口,因为您可以随意设置它们的样式,并且它们不会阻止脚本/锁定该选项卡上的浏览器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-21
          • 2019-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-19
          相关资源
          最近更新 更多