Сводная информация о блокировке браузера для открытия новых окон

внешний интерфейс JavaScript браузер Firefox

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

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

Только проанализируйте и перечислите способ ручного открытия нового окна с помощью кода js.

Пример тестового кода здесь

Несколько способов открыть новые окна

  1. window.open()
  2. Создать ссылку, активировать вручнуюa.click()
  3. Создать форму формы, запустить вручнуюform.submit()(создать форму формы, добавить дочерний элемент кнопки, запустить вручнуюbutton.click()Та же ситуация, разницы нет)

Результаты группировки случаев вызова

Используйте Chrome (70), Firefox (63), Edge и IE (9-11) в качестве тестовых браузеров, чтобы проверить открытие новых окон, как указано ниже.

x означает заблокировано, √ означает, что новое окно открывается правильно

открывать напрямую

То есть напрямую вызывать код для открытия нового окна после загрузки страницы

Способ Chrome Firefox Edge IE
window.open() x x x x
a.click() x x x x
form.submit() x x x x

Поведение пользователя при нажатии

  1. Открыть сразу после нажатия кнопки

    То есть в обратном вызове при нажатии на кнопку вызывается код открывающий новое окно напрямую

    Способ Chrome Firefox Edge IE
    window.open()
    a.click()
    form.submit()
  2. Задержка открытия после нажатия кнопки

    То есть в коллбэке при нажатии на кнопку код открытия нового окна выполняется через setTimeout

    Способ Chrome Firefox Edge IE
    window.open() × ×
    a.click() × ×
    form.submit() × ×
  3. Открыть в обратном вызове асинхронного запроса после нажатия кнопки

    То есть в коллбэке при нажатии на кнопку отправляется запрос, а в коллбэке запроса выполняется код открытия нового окна

    Способ Chrome Firefox Edge IE
    window.open() x x x x
    a.click() x x x x
    form.submit() x x x x

Поведение пользователя на клавиатуре

Мы тестировали с элементом ввода (другие элементы имеют тот же эффект, что и другие события клавиатуры), потому что наиболее вероятным вариантом использования является ввод ввода для открытия нового окна.

  1. Открыть сразу после ввода keydown

    Способ Chrome Firefox Edge IE
    window.open() x x
    a.click() x x
    form.submit() x x

    Среди них, хотя ie9 и ie10 будут всплывать, чтобы блокировать всплывающие окна, они могут открывать новые окна.

  2. Задержка открытия после нажатия кнопки

    Способ Chrome Firefox Edge IE
    window.open() x x x
    a.click() x x x
    form.submit() x x x
  3. Открыть в обратном вызове асинхронного запроса после нажатия кнопки

    Способ Chrome Firefox Edge IE
    window.open() x x x x
    a.click() x x x x
    form.submit() x x x x

Сводка правил

  1. Что касается браузеров, участвующих в тесте, то три способа открытия новых окон никак не влияют на результаты перехвата.
  2. Все браузеры не позволяютдействие, не связанное с пользователемВызывает открытие нового окна.
  3. Все браузеры не позволяютАсинхронный запрос ajaxОткрывает новое окно в.
  4. Edge и IE не позволяют открывать новые окна в setTimeout, Chrome, Firefox позволяют открывать новые окна в setTimeout в событиях действий пользователя.
  5. Firefox и IE не позволяют открывать новые окна при событиях клавиатуры пользователя.

решение

  1. Те, кому нужно открыть новое окно в асинхронном ajax-запросе, могут использовать метод открытия нового окна перед запросом, а затем изменение адреса окна после того, как запрос получит результат.
  2. Рекомендуется использовать оболочку формы и добавить кнопку для открытия нового окна в клавиатуре. Событие Enter, Enter, чтобы инициировать событие отправки по умолчанию для открытия нового окна.