Повторно используемый объект события Javascript - PullRequest
3 голосов
/ 12 августа 2011

Я делаю события щелчка мышью и пытаюсь отправить его на какой-то узел несколько раз подряд.Для этого я использую тот же объект MouseEvent и по какой-то причине этот подход не работает.Тем не менее, когда я каждый раз создаю событие вручную, система работает.Кто-нибудь знает, в чем причина такого поведения?Я пытался изменить метку времени, но проблема все еще возникает.Я могу решить проблему, как я упоминал ранее, но меня интересует, как на самом деле работает этот MouseEvent и соответствующие подсистемы диспетчеризации и обработки.Спецификация MouseEvent, которую я нашел на страницах MDC, похоже, не содержит много информации.

Tnx за помощь!

Ответы [ 3 ]

6 голосов
/ 12 августа 2011

На самом деле это механизм безопасности, отправка события, которое было отправлено ранее, не разрешено. С событием всегда связаны дополнительные данные, например, происходит ли оно из надежного источника (клавиатура пользователя, а не код JavaScript). Некоторые атаки (в основном против MSIE, потому что у него были изменяемые объекты событий) использовали это - они перехватили доверенное событие, изменили его и отправили его снова в другое место (изменение может не всегда требоваться, для некоторых атак достаточно отправить его на другой элемент) , В конце концов, запрещение повторной отправки событий оказалось лучшим решением. В конце концов, эта функциональность на самом деле не требуется: создание нового объекта события с идентичными свойствами (за исключением скрытых данных) не совсем сложно.

Практически все проблемы безопасности в этой области были связаны с управлением вводом файлов. Некоторое время назад Firefox решил радикально изменить интерфейс ввода файлов и запретить вводить имя файла напрямую. Интересно, сделало ли это изменение повторную отправку событий не проблемой. Я сомневаюсь, что кто-нибудь захочет рискнуть снова открыть эту банку с червями.

1 голос
/ 12 августа 2011

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

Чтение События модели объектов документа может дать вам лучшее понимание того, как работает система событий DOM.

0 голосов
/ 12 августа 2011

Не зная, чем вы сейчас болеете, просто сделайте предположение.

Создать функцию события:

function clickEvent(event) {
    //do something
}

Прикрепите это:

obj.onclick = clickHandler;

И вы можете сделать это несколько раз для нескольких объектов.

...