0

你好 StackOverflow 社区!

我遇到了一个非常奇怪的问题,找不到任何有用的信息来解决它。

不知何故,只有在谷歌浏览器中打开开发工具窗口(停靠或作为单独的窗口)时,一段 javascript 代码才有效。

原始问题:由于我们的应用程序结构,我们需要在提供页面时自动打开多个弹出窗口。由于弹出窗口不是通过直接的用户交互(如 onclick)打开的,现代浏览器会自动阻止这些弹出窗口。由于需要重构大量代码以避免这种情况,我们的解决方案是:

  • 检查浏览器是否阻止了某些弹出窗口。
  • 如果是这样:通知用户并建议关闭他们浏览器对我们网站的弹出窗口阻止功能(例如将其添加到例外列表中)。

我知道这不是一个非常优雅的解决方案,但没有其他方法,所以请不要评论如何以不同的方式做到这一点。

javascript代码:

let popupBlockingErrorShown = false;

this.OpenWindow = function (url, name, args) {

        var i = Popups.length; //Popups is an array defined as a global variable that keeps track of all 
                               //opened popup windows

        Popups[i] = window.open(url, name, args);

        try {

            Popups[i].focus();

        } catch (e) {

            if (!popupBlockingErrorShown) {

                alert("very user friendly message explaining to turn of popup blocking");

                popupBlockingErrorShown = true;
            }


        };
    }

窗口必须是弹出窗口。popupBlockingErrorShown变量是为了防止每个弹出窗口都有一条消息alert

在 Firefox 中运行良好。但是在谷歌浏览器中有这种行为:

  • 没有打开开发工具:第一个弹窗正常打开,其他弹窗被阻止,没有警报消息

  • 打开开发工具:第一个弹出窗口打开但在加载时“卡住”(这是一个空页面)。警报信息正常显示。

保持浏览器窗口打开并简单地在打开或关闭的开发工具之间切换会产生相同的行为。

任何人都可以帮助我吗?非常感激!

这是我的第一个 stackoverflow 问题,我对编程还是很陌生,我有一年多的经验。欢迎对我的“提问”技能发表评论。

4

1 回答 1

0

好的,感谢 wOxxOm 的评论,我找到了解决方法。所以问题与窗口关注的焦点有关。我在 中添加了一段代码,catch-block以在成功打开的弹出窗口上显示警报(如果有的话):

   try {

           Popups[i].focus();

        } catch (e) {

            if (!popupBlockingErrorShown) {
                if (Popups[i - 1]) { //there is a previous popup and it's been focused on.
                    Popups[i - 1].alert(UIMessages[33]); //show alert on opened popup.
                    popupBlockingErrorShown = true;
                }
                else {
                    alert(UIMessages[33]);
                    popupBlockingErrorShown = true;
                }
            }
        }

谢谢@wOxxOm!

于 2020-01-22T08:52:27.753 回答