К сожалению, вы ничего не можете сделать, чтобы открыть новое окно при нажатии клавиши (кроме отключения блокировщика всплывающих окон).
Способ работы блокировщиков всплывающих окон в IE, Firefox и Chrome (с высокойlevel) браузером (при обнаружении вызова window.open
) идет вверх по стеку вызовов JavaScript, чтобы определить, является ли текущая функция - или была вызвана функцией, которая является - обработчиком события.Другими словами, он узнает, выполняется ли текущая функция, потому что пользователь сделал что-то, что вызвало событие DOM.
Если это так, то всплывающее окно разрешено;в противном случае он заблокирован.Однако вопрос о том, какие события считаются «разрешающими всплывающие окна», зависит от браузера. По умолчанию в Mozilla , только change
, click
, dblclick
, mouseup
, reset
и submit
.(Я предполагаю, что IE аналогичен.)
Функции, которые являются обработчиками событий для любого другого типа события - например, keydown
/ keyup
/ keypress
в вашем случае - делать не для получения специального разрешения, разрешающего всплывающие окна, это означает, что ваше всплывающее окно заблокировано, и именно поэтому ваш звонок на window.open
возвращает null
.
Chrome, однако, считает событие keydown
подходящим для разрешения всплывающих окончтобы быть открытым, именно поэтому ваш скрипт работает в этом браузере.
Вот сокращенный пример , чтобы продемонстрировать, как это работает.Это демо:
- Определяет функцию с именем
spawn()
, которая вызывает window.open
, чтобы открыть всплывающее окно. - Вызывает
spawn()
сразу после загрузки страницы.Это заблокировано всеми браузерами, так как вызов сделан из глобальной области;он не вызывается из обработчика событий. - Присоединяет функцию к
window.onkeydown
, которая вызывает spawn()
.Если вы нажмете любую клавишу в Chrome, всплывающее окно откроется, потому что оно позволяет всплывающие окна из обработчиков keydown
.В IE и Firefox всплывающее окно будет заблокировано, так как эти браузеры не допускают всплывающие окна от событий клавиатуры. - Присоединяет обработчик событий к ссылке, которая вызывает
spawn()
.При нажатии на ссылку всплывающее окно будет разрешено во всех браузерах, поскольку вызов window.open
можно отследить до обработчика события click
.
Как вы теперь видитеничего не происходит, чтобы манипулировать свойствами события или «обманывать» браузер, чтобы он не знал, что есть новое окно.Поведение всплывающих окон, открываемых при щелчках по ссылке, составляет по дизайну . Теория заключается в том, что если вы нажали на что-то, вполне вероятно, что вы захотите увидеть все, что находится внеожиданно возникнуть.Однако, когда звонят на window.open
из места, где вы ничего не сделали (например, глобальный охват), вы, вероятно, не не заинтересованы в том, что [объявление] находится вавтоматически запускающееся всплывающее окно.
Таким образом, блокировщики всплывающих окон предотвращают раздражение (автоматический запуск рекламы), в то же время позволяя страницам открывать всплывающие окна по запросу пользователя.