【问题标题】:How to disable "prevent this page from creating additional dialogs"?如何禁用“防止此页面创建其他对话框”?
【发布时间】:2012-07-28 14:42:46
【问题描述】:

我正在开发一个使用 JavaScript alert()confirm() 对话框的网络应用程序。

如何阻止 Chrome 显示此复选框?

有可以修改的设置吗?

我知道我可以修改源代码,但我希望 Chrome 仍然可以自动更新。

我不需要担心其他浏览器,因为该应用只在 Chrome 中运行。

我对运行应用程序的 (Windows) 计算机具有管理员访问权限。

【问题讨论】:

    标签: javascript google-chrome


    【解决方案1】:

    你不能。这是一项浏览器功能,可防止网站显示数百条阻止您离开的警报。

    但是,您可以查看 jQuery UI Dialog 之类的模态弹出窗口。这些是显示自定义对话框的 javascript 警报框。他们不使用默认的alert() 函数,因此完全绕过了您遇到的问题。

    我发现,如果您使用自定义对话框而不是默认的警报和确认,则具有大量消息框和确认的应用会有大大更好的用户体验。

    【讨论】:

    • 我不想添加像 jQuery 这样的框架。此外,整个代码中有很多 alert()confirm() 框。我不想重新发明轮子,只是为了禁用该复选框。
    • @DannyBeckett 也有纯 JS 模态。 JS 可以非常小,它只是显示/隐藏一个 div。剩下的就是 CSS。你可以用你自己的覆盖默认的警报/确认函数,这样你就不必更改你的代码。
    • 顺便说一句,您可以轻松地覆盖现有的警报功能,因此对alert() 的所有调用都将使用您的自定义模式弹出窗口而不是本机。 stackoverflow.com/questions/1729501/javascript-overriding-alert
    • @DannyBeckett 那么你是说作为一名网络开发人员我可以修改我的用户使用的 Chrome 的源代码吗?因为如果我不能......那么“你不能”
    • @DeadlyChambers 仔细阅读问题。
    【解决方案2】:

    这就是我最终要做的,因为我们有一个网络应用程序,其中有多个不受我们控制的用户......(@DannyBeckett 我知道这不是你问题的确切答案,但是那些正在查看您的问题可能会有所帮助。)您至少可以检测他们是否没有看到对话框。您最可能希望更改的内容很少,例如显示时间或实际显示的内容。请记住,这只会通知用户他们已成功点击了那个小复选框。

    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");
        }
    }
    
    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 confirms turned off");
        }
        return confirmBool;
    }
    

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

    【讨论】:

    • @locateganesh 它的工作原理是高举本地确认和警报。 350 是毫秒,它正在检查确认/警报打开多长时间。如果它打开的时间长于该时间,则假定警报/确认未被阻止。 “MySpecialDialog”是您创建的一个对话框,它不使用浏览器的本机警报/确认。因此,如果您有引导模式或类似的东西,它将打开并通知用户。
    【解决方案3】:

    我知道每个人都在道德上反对这一点,但我知道在需要这样做的地方有实际开玩笑的原因。我认为 Chrome 对此采取了坚定的立场,在警报消息之间强制执行一秒钟的间隔时间。如果访问者被困在烦人的恶作剧网站上,这可以让访问者有足够的时间关闭页面或刷新。

    所以要回答你的问题,一切都是时间问题。如果您每秒发出多次警报,Chrome 将创建该复选框。下面是一个解决方法的简单示例:

    var countdown = 99;
    function annoy(){
        if(countdown>0){
            alert(countdown+" bottles of beer on the wall, "+countdown+" bottles of beer! Take one down, pass it around, "+(countdown-1)+" bottles of beer on the wall!");
            countdown--;
    
            // Time must always be 1000 milliseconds, 999 or less causes the checkbox to appear
            setTimeout(function(){
                annoy();
            }, 1000);
        }
    }
    
    // Don't alert right away or Chrome will catch you
    setTimeout(function(){
        annoy();
    }, 1000);
    

    【讨论】:

    • 你在哪里发现它是一秒还是你只是在猜测?
    • 看来 Mozilla 正在使用 3 秒的跨度。 bugzilla.mozilla.org/show_bug.cgi?id=61098#c209
    • 感谢您的信息,很高兴知道 FF 是 3 秒,我只在 Chrome 中测试过这段代码。我通过一些简短的测试发现了 Chrome 的 1 秒规则,你可以自己测试一下,任何低于 1000 毫秒的间隔都会导致复选框出现,所以这不仅仅是我编造的。他们将来很可能会改变这一点,但现在正好是 1 秒。
    【解决方案4】:

    您最好使用jquery-confirm,而不是尝试删除该复选框。

    $.confirm({
        title: 'Confirm!',
        content: 'Are you sure you want to refund invoice ?',
        confirm: function(){
           //do something 
        },
        cancel: function(){
           //do something
        }
    }); 
    

    【讨论】:

      【解决方案5】:

      如果用户愿意,您应该让他们这样做(无论如何您都无法阻止他们)。

      你的问题是你需要知道他们有,然后假设他们的意思是好的,而不是取消。将confirm(x) 替换为myConfirm(x)

      function myConfirm(message) {
          var start = Number(new Date());
          var result = confirm(message);
          var end = Number(new Date());
          return (end<(start+10)||result==true);
      }
      

      【讨论】:

      【解决方案6】:
      function alertWithoutNotice(message){
          setTimeout(function(){
              alert(message);
          }, 1000);
      }
      

      【讨论】:

      • 任何理由或想法为什么这可能会有所帮助,或者任何解释,或者至少是一个证明它确实有效的小提琴?
      • @DannyBeckett 老实说,不知道你为什么将这个标记为已回答......没有任何解释,代码甚至不起作用。第二个警报让我可以选择阻止更多对话。
      • 这是错误的......因为它根本不起作用。你用的是什么浏览器?
      • 根据记忆,当时,如果您使用机器的超时值 (1000) 玩游戏,您可以让 Chrome 停止显示该复选框。
      • 这是一个小提琴,表明(出于神秘原因)答案中的功能有效:jsfiddle.net/em2hbavp
      猜你喜欢
      • 2012-06-30
      • 2011-08-16
      • 1970-01-01
      • 2021-09-26
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多