плагин горячих клавиш открывает новое окно, даже если всплывающие окна заблокированы? - PullRequest
5 голосов
/ 23 мая 2011

Я хочу открыть новое окно, если нажата «F2».Ниже код дает мне сообщение об ошибке newWindow is null в Firefox.Если я не использую блокировщик всплывающих окон, это работает.То же самое в IE.Он работает в Chrome даже при включенном блокировщике всплывающих окон.

с использованием jstree pre 1.0 stable

            hotkeys: {
                "f3" : function () {
                url = "http://www.vse.cz";
                var newWindow = window.open(url, '_blank');
                newWindow.focus();
                return false;

            },

Q1: Могу ли я сделать этоработать для всех браузеров, чтобы пользователям не приходилось менять свои настройки при использовании плагина горячих клавиш?

Q2: Почему Использование JavaScript вместо цели для открытия новых окон работает без проблем в Firefox?Это потому, что это ссылка, а не плагин горячих клавиш?


Насколько я понимаю, скрипт на странице сверху каким-то образом манипулирует тем, что происходит, когда пользователь нажимает на ссылку.Он изменяет свойства клика, поэтому браузеры «не знают», что это новое окно, поэтому блокировщик всплывающих окон обойден.

В моем случае я использую функцию чистого js, вызванную чем-то другим, а не пользователемнажмите кнопку.И эта «моя функция» не меняет свойств любых объектов HTML.Я думаю, что это разница.Я не уверен, что я прямо здесь.

1 Ответ

7 голосов
/ 26 мая 2011

К сожалению, вы ничего не можете сделать, чтобы открыть новое окно при нажатии клавиши (кроме отключения блокировщика всплывающих окон).

Способ работы блокировщиков всплывающих окон в 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 из места, где вы ничего не сделали (например, глобальный охват), вы, вероятно, не не заинтересованы в том, что [объявление] находится вавтоматически запускающееся всплывающее окно.

Таким образом, блокировщики всплывающих окон предотвращают раздражение (автоматический запуск рекламы), в то же время позволяя страницам открывать всплывающие окна по запросу пользователя.

...