Как браузер указывает разницу между щелчком пользователя и программным нажатием?

Если я запускаю клик с 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), прикрепленные к событию, которые позволяют браузеру отслеживать, было ли событие инициировано с помощью реального щелчка мыши или нет, хотя могут быть и другие механизмы реализации.