javascript - Chrome 弹出窗口 "blocker"加载隐藏页面和插件 - 有什么办法解决这个问题?

标签 javascript google-chrome popup chromium popup-blocker

如果我启动一个包含 Flash 游戏的窗口,而 Chrome 的弹出窗口拦截器抑制了它,用户会听到游戏中的音乐,但什么也看不到。这是因为 Chrome 不会挡住窗口;它只是隐藏它。

Chrome 加载页面以获取网站图标和页面标题,因此他们可以在弹出窗口阻止对话框中显示它(单击地址栏中的图标时会看到)。但随后他们不关闭窗口。插件运行,脚本可以回调打开器——它就像一个普通的窗口,但不可见。 (好吧,恶意软件开发者,请停止流口水。)

Chrome 可以解析 标签的内容来检索 <title> 和 favicon 标签,而无需实际加载页面。他们可以在检索到图标/标题后关闭隐藏窗口。他们可以只显示 URL 而不是图标/标题。相反,该错误自 2008 年以来继续恶化......

http://code.google.com/p/chromium/issues/detail?id=3477

http://code.google.com/p/chromium/issues/detail?id=38458

无论如何,问题是:我可以检测到这种情况何时发生吗? 也许 window.chrome JavaScript 对象中有一些东西指示窗口处于这种不可见状态,因此我可以关闭它或者移除闪光灯?

__

根据 Prusse 的回答,这就是我最终得到的...

function isPopupZombie(popWindow, delay) {
    /// <summary>Attempts to detect zombie window "blocked" (hidden) by Chrome (v.8-12, maybe more)</summary>
    /// <param name="popWindow">The popup window object</param>
    /// <param name="delay">Optional delay in ms; Not necessary when called via other delayed event/function</param>
    if (window.chrome && typeof(popWindow) == 'object') {
        if (delay && !isNaN(parseInt(delay)) && delay > 0) {
            window.setTimeout(function () {
                isPopupZombie(popWindow, 0);
            }, delay);
        } else if (typeof(popWindow.opener) == 'object') {
            var w = (popWindow.innerWidth && popWindow.innerWidth > 0) ? popWindow.innerWidth : popWindow.outerWidth;
            var h = (popWindow.innerHeight && popWindow.innerHeight > 0) ? popWindow.innerHeight : popWindow.outerHeight;
            //console.log('_isPopupZombie: ' + w + ' x ' + h);
            return (w === 0 && h === 0);
        }
    }
    return false;
}

function handlePopupZombie(zombieWindow, notify, callback) {
    /// <summary>Tries to close the zombie or alert about Chrome FAIL</summary>
    /// <param name="zombieWindow">Popup window object known to be a hidden but unblocked popup</param>
    /// <param name="notify">true to notify user of hidden window, false to close zombieWindow</param>
    /// <param name="callback">optional function to call, with single argument for zombieWindow</param>
    if (window.chrome && zombieWindow) {
        if (notify === true) {
            // callback or alert
            if (typeof(callback) == 'function') {
                callback(zombieWindow);
            } else if (zombieWindow.opener) {
                zombieWindow.opener.alert("Your popup blocker has hidden a popup window instead of blocking it.\n\nPlease use the icon in the address bar to open the hidden window.");
            }
        } else {
            // try to kill the zombie
            if (zombieWindow.opener && zombieWindow.opener.console) zombieWindow.opener.console.log('Closing zombie window');
            // after close, blocker icon is in address bar, but favicon/title are not in dialog
            zombieWindow.close();
            // optional callback
            if (typeof(callback) == 'function') callback(zombieWindow);
        }
    }
}

所以我可以做类似...

var popup = window.open(...);

if (typeof(popup) == 'undefined') {
    // handle it
} else if (popup && popup.closed) {
    // handle it
} else if (isPopupZombie(popup, 100)) {
    console.log('popup zombie!');
    handlePopupZombie(popup, true);
} else {
    console.log('no zombies, this is regular ordinary popup code time!');
}

最佳答案

您可以尝试检查 innerWidth、innerHeight、outerWidth 和/或 outerHeight。当被阻止的 chrome 看到让它们为 0 时。喜欢:

window.addEventListener('load', function(){
    var w = window.open('');
    setTimeout(function(){
        if ((w.outerWidth === 0) && (w.outerHeight === 0)){
            alert('blocked!');
        }
        w = null;
    }, 25);
}, false);

延迟 0 将不起作用,因为对于 chrome,所有新窗口都是使用 (0,0) 大小创建的,只有在一段时间后它才会为其提供适当的大小。

关于javascript - Chrome 弹出窗口 "blocker"加载隐藏页面和插件 - 有什么办法解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6540406/

相关文章:

javascript - 文档创建后可以立即获取 key 吗?

html - IE 和下拉菜单触发弹出窗口阻止程序

python - 如何阻止 wkhtmltopdf.exe 弹出?

javascript - 如何在脚本中使用 javascript 创建按钮和文本输入。 (篡改猴子)

html - CSS - 防止弹出窗口隐藏在页面上的其他元素后面

javascript - 使用 KnockoutJS 添加 Google map

javascript - 如何在云函数中访问 firebase 数据库中的另一个数据?

javascript - 在单选按钮上显示/隐藏字段

javascript - Chrome 中的高精度 FPS 测量

javascript - 模拟 Internet Explorer 的 JS 库?