Как браузер указывает разницу между щелчком пользователя и программным нажатием?
Если я запускаю клик с jquery, который делает window.open()
, он блокируется блокировщиком всплывающих окон. Если я делаю клик вручную, окно не блокируется. Как браузер отличается друг от друга?
Ответы
Ответ 1
Эта реализация Firefox подробно обсуждается в этой ошибке и в этой другой ошибке есть еще один интересный фон, в том числе, какие длины сайтов пройдут, чтобы навязать нежелательное всплывающее окно на ничего не подозревающих пользователей (в этом случае: вызов window.open()
из изображения load
), Если вы ищете Bugzilla, вы обнаружите, что люди Mozilla заняли несколько лет, чтобы все это работало правильно, например здесь ошибка с 2001 года.
То, как он работает в данный момент, заключается в следующем: когда Firefox получает событие клика из операционной системы, в течение определенного времени window.open()
включается в JavaScript (ищите dom.disable_open_click_delay
в about:config
). Если вы вызываете событие click()
из кода без щелчка пользователя, а затем на первом шаге, включение window.open()
никогда не произойдет, хотя вызов window.open()
сам преуспеет чтобы остановить сайты, обнаруживающие, что блокировка всплывающих окон включена.
Я не уверен, как другие браузеры реализуют этот материал, но мне было бы удивительно, если бы это было совсем другое.
Ответ 2
Я считаю, что вызов click
через jQuery фактически фактически не вызывает щелчок по элементу, а вместо этого вызывает функцию, прослушивающую щелчок. Поэтому, хотя вы вызываете click()
, вы фактически вызываете функцию.
Когда пользователь нажимает кнопку, это реальный щелчок.
Пример:
var handler = function () {
alert('hi');
};
$('#example').on('click', handler);
$('#example').click(); // really just calls handler();
Ответ 3
Собственный код браузера обрабатывает фактическое событие щелчка мыши (из операционной системы) и создает объект события браузера. В этот момент в собственном коде браузера браузер знает, что это событие было создано с помощью мыши.
Я предполагаю, что есть некоторые скрытые данные (недоступные из javascript), прикрепленные к событию, которые позволяют браузеру отслеживать, было ли событие инициировано с помощью реального щелчка мыши или нет, хотя могут быть и другие механизмы реализации.