Определить, будет ли функция вызвана в результате собственного события браузера - программирование
Подтвердить что ты не робот

Определить, будет ли функция вызвана в результате собственного события браузера

Есть ли способ определить, вызвана ли данная функция в результате собственного события браузера?

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

Однако, если вы попытаетесь вызвать его напрямую, браузер будет генерировать всплывающее предупреждение.

Таким образом, браузер отслеживает контекст выполнения и как-то флагами, поэтому первое использование функции выполняется успешно. Без наличия этого флага он блокирует второе использование.

Есть ли способ получить доступ к этому флагу, чтобы внутренне блокировать выполнение определенных функций, если они вызываются напрямую, в отличие от реального собственного события браузера.

Я просмотрел объект события, получаемый моими функциями, но не могу обнаружить ничего, что отличает реальное собственное событие, и событие, созданное при запуске события вручную.

Я действительно хочу, чтобы я мог?

4b9b3361

Ответ 1

В спецификации DOM Level 3 реализовано свойство isTrusted для объектов событий. Это свойство имеет значение true, когда событие генерируется в результате действия пользователя, и false, когда оно было создано, например. через createEvent:

События, которые генерируются пользовательским агентом либо в результате взаимодействия с пользователем, либо как прямой результат изменений в DOM, доверяются пользовательским агентом с привилегиями, которые не предоставляются событиям, генерируемым script через метод DocumentEvent.createEvent("Event"), модифицированный с помощью метода Event.initEvent() или отправленный методом EventTarget.dispatchEvent().

В настоящее время, похоже, IE9 + и Firefox поддерживают это свойство. Здесь рабочий пример (очевидно, вам придется запускать его в одном из поддерживаемых браузеров):

var elem = document.getElementById("example");
elem.addEventListener("click", function (e) {
    alert(e.isTrusted);
}, false);

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
elem.dispatchEvent(evt);

Это будет предупреждать false, когда симулированное событие будет запущено сразу, и true в любое время, когда вы на самом деле нажмете на элемент.