Javascript Функция 'alert' внутри блока catch работает только при открытых инструментах разработчика в chrome - PullRequest
0 голосов
/ 20 января 2020

Здравствуйте, сообщество StackOverflow!

Я столкнулся с очень странной проблемой и не смог найти никакой полезной информации о том, как ее решить.

Каким-то образом часть * Код 1060 * работает только в том случае, если в google chrome.

открыто окно инструментов разработчика (закреплено или как отдельное окно). Исходная проблема : из-за структуры нашего приложения нам нужно автоматически открывать несколько всплывающих окон при обслуживании страницы. Поскольку всплывающие окна НЕ открываются посредством прямого взаимодействия с пользователем (например, при нажатии), современные браузеры автоматически блокируют эти всплывающие окна. Из-за большого количества кода, который необходимо было бы реорганизовать, чтобы избежать этого, наше решение было:

  • проверить, не блокирует ли браузер некоторые всплывающие окна.
  • если так: сообщите об этом пользователю и предложите отключить функцию блокировки всплывающих окон в нашем браузере (например, добавив его в список исключений).

Не очень элегантное решение, которое я знаю , но другого пути не было, поэтому, пожалуйста, не комментируйте, как это сделать по-другому.

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;
            }


        };
    }

windows должны быть всплывающими окнами. Переменная popupBlockingErrorShown предназначена для предотвращения появления сообщения alert для каждого всплывающего окна.

Отлично работает в firefox. Но в google chrome есть такое поведение:

  • без инструментов разработчика, открытых : первое всплывающее окно открывается нормально, остальные блокируются , нет предупреждающего сообщения .

  • с открытыми инструментами разработчика : открывается первое всплывающее окно, но при загрузке «зависает» (это пустая страница). Предупреждающее сообщение отображается нормально.

Сохранение открытого окна браузера и простое переключение между инструментами разработки, открытыми или закрытыми, дает такое же поведение.

Кто-нибудь может мне помочь? Очень признателен!

Это мой первый вопрос о переполнении стека, и я все еще плохо знаком с программированием, у меня чуть более года опыта. Замечания по моим навыкам «задавать вопросы» приветствуются.

1 Ответ

0 голосов
/ 22 января 2020

Хорошо, благодаря комментарию 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!

...