При открытии нового окна из-за механизма безопасности браузера, если пользователь не всегда разрешает это, браузер может быть заблокирован и не может быть открыт напрямую.
В Интернете есть много коротких предложений, которые дают решения, которые не являются достаточно исчерпывающими, поэтому я сделал подробный анализ проблем, с которыми я столкнулся. Напишите резюме, чтобы потом не запутаться.
Только проанализируйте и перечислите способ ручного открытия нового окна с помощью кода js.
Несколько способов открыть новые окна
window.open()
- Создать ссылку, активировать вручную
a.click()
- Создать форму формы, запустить вручную
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 |
Поведение пользователя при нажатии
-
Открыть сразу после нажатия кнопки
То есть в обратном вызове при нажатии на кнопку вызывается код открывающий новое окно напрямую
Способ Chrome Firefox Edge IE window.open() √ √ √ √ a.click() √ √ √ √ form.submit() √ √ √ √ -
Задержка открытия после нажатия кнопки
То есть в коллбэке при нажатии на кнопку код открытия нового окна выполняется через setTimeout
Способ Chrome Firefox Edge IE window.open() √ √ × × a.click() √ √ × × form.submit() √ √ × × -
Открыть в обратном вызове асинхронного запроса после нажатия кнопки
То есть в коллбэке при нажатии на кнопку отправляется запрос, а в коллбэке запроса выполняется код открытия нового окна
Способ Chrome Firefox Edge IE window.open() x x x x a.click() x x x x form.submit() x x x x
Поведение пользователя на клавиатуре
Мы тестировали с элементом ввода (другие элементы имеют тот же эффект, что и другие события клавиатуры), потому что наиболее вероятным вариантом использования является ввод ввода для открытия нового окна.
-
Открыть сразу после ввода keydown
Способ Chrome Firefox Edge IE window.open() √ x √ x a.click() √ x √ x form.submit() √ x √ x Среди них, хотя ie9 и ie10 будут всплывать, чтобы блокировать всплывающие окна, они могут открывать новые окна.
-
Задержка открытия после нажатия кнопки
Способ Chrome Firefox Edge IE window.open() √ x x x a.click() √ x x x form.submit() √ x x x -
Открыть в обратном вызове асинхронного запроса после нажатия кнопки
Способ Chrome Firefox Edge IE window.open() x x x x a.click() x x x x form.submit() x x x x
Сводка правил
- Что касается браузеров, участвующих в тесте, то три способа открытия новых окон никак не влияют на результаты перехвата.
- Все браузеры не позволяютдействие, не связанное с пользователемВызывает открытие нового окна.
- Все браузеры не позволяютАсинхронный запрос ajaxОткрывает новое окно в.
- Edge и IE не позволяют открывать новые окна в setTimeout, Chrome, Firefox позволяют открывать новые окна в setTimeout в событиях действий пользователя.
- Firefox и IE не позволяют открывать новые окна при событиях клавиатуры пользователя.
решение
- Те, кому нужно открыть новое окно в асинхронном ajax-запросе, могут использовать метод открытия нового окна перед запросом, а затем изменение адреса окна после того, как запрос получит результат.
- Рекомендуется использовать оболочку формы и добавить кнопку для открытия нового окна в клавиатуре. Событие Enter, Enter, чтобы инициировать событие отправки по умолчанию для открытия нового окна.