Как запустить событие колеса мыши в Firefox с помощью JavaScript?
Я пытаюсь провести автоматическое тестирование с помощью WebDriver, но в настоящее время у него нет возможности имитировать события с колесом мыши. В качестве обходного пути я пытаюсь запустить эти события с помощью JavaScript. Сейчас я провожу все свои эксперименты на прямой HTML-странице, а не в рамках WebDriver.
Я специально пытаюсь запустить событие колеса мыши на элементе прокрутки прокрутки.
До сих пор я мог делать это с Chrome и IE9, но я не могу заставить что-либо работать в Firefox (5.x).
Я использую следующий кросс-браузерный код, чтобы определить, когда запускаются события колесика мыши, которые я вырвал из сети. Этот код может подобрать событие во всех браузерах, когда я прокручиваю колесико мыши внутри созданного мной элемента прокрутки (id = 'view').
<script type="text/javascript">
function wheel(event) {
var delta = 0;
if (!event) {
event = view.event;
}
if (event.wheelDelta) {
delta = event.wheelDelta / 120;
}
else if (event.detail) {
delta = -event.detail / 3;
}
alert(delta);
}
var view = document.getElementById('view');
if (view.addEventListener) {
view.addEventListener('DOMMouseScroll', wheel, false);
}
view.onmousewheel = wheel;
</script>
Приведенная ниже функция может вызывать событие колеса мыши в Chrome и IE9 и вызывается в вышеуказанном обработчике с ожидаемым поведением.
function ChromeWheel () {
var evt = document.createEvent("MouseEvents");
evt.initEvent('mousewheel', true, true);
evt.wheelDelta = 120;
view.dispatchEvent(evt);
}
Конечно, это не работает для Firefox. Я нашел существующую документацию слишком скудной и запутанной, чтобы знать, как FF справляется с этим. Может ли кто-нибудь показать мне минимум, необходимый для запуска события колеса мыши в Firefox с дельтой колеса (расположенной там, где его ожидает FF), так что мой обработчик его подберет?
1 ответ
Что ж,
- В части кода Mozilla, если вы слушаете DOMMouseScroll, вы также должны отправить событие DOMMouseScroll, не так ли? (колесо мыши похоже на изобретение Microsoft, скопированное с помощью webkit, но не Gecko).
- Вместо того, чтобы устанавливать (только для чтения) свойства для события, вы должны вызывать соответствующие
init...()
метод, который для события мышиinitMouseEvent()
, ( спец)
Вот исправленный тестовый пример, который работает в Firefox: http://jsfiddle.net/6nnMV/
Возможно, это не полезно для вас, но может представлять интерес для других людей, желающих симулировать события, вот как (привилегированные) модульные тесты в mozilla имитируют "реальные" события: http://hg.mozilla.org/mozilla-central/annotate/a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248