如何检测“阻止此页面创建其他对话框”

时间:2012-07-19 23:57:05

标签: javascript firefox google-chrome

问题

如何检测用户是否选中了该框,“阻止此页面创建其他对话框”?

为什么这是一个问题

如果用户阻止了确认框的出现,则函数confirm('foobar')将始终返回false。

如果用户看不到我的确认对话框confirm('Are you sure?'),则用户永远无法执行操作。

CONTEXT

所以,我使用像if(confirm('are you sure?')){ //stuff... }这样的代码。因此,来自浏览器的false自动回复将阻止用户执行stuff。但是,如果有一种方法可以检测到用户已经选中了该框,那么我可以自动执行该操作。

我认为如果用户禁用了对话,那么该函数应该抛出错误,或者返回true。该功能用于确认用户请求的操作。

2 个答案:

答案 0 :(得分:14)

据我所知,这是不可能以任何干净的方式进行,因为它是一个浏览器功能,如果浏览器不让你知道,那么你无法知道。

但是,你可以做的是在confirm()周围写一个响应时间的包装器。如果它太快而不能成为人类,则提示很可能被抑制,它将返回true而不是false。只要返回false,就可以通过运行confirm()几次来使其更加健壮,因此它成为超快用户的可能性非常低。

包装器将是这样的:

function myConfirm(message){
    var start = new Date().getTime();
    var result = confirm(message);
    var dt = new Date().getTime() - start;
    // dt < 50ms means probable computer
    // the quickest I could get while expecting the popup was 100ms
    // slowest I got from computer suppression was 20ms
    for(var i=0; i < 10 && !result && dt < 50; i++){
        start = new Date().getTime();
        result = confirm(message);
        dt = new Date().getTime() - start;
    }
    if(dt < 50)
       return true;
    return result;
}

PS:如果你想要一个实用的解决方案而不是这个黑客,Jerzy Zawadzki建议使用库来做确认对话可能是最好的方法。

答案 1 :(得分:3)

我认为你无法改变它 - 它是浏览器功能。

如果您需要解决方法,我的第一个想法是将代码从使用系统confirm更改为某些js库警报(来自例如jQuery UI)