Как запустить событие колеса мыши в Firefox с помощью JavaScript? - PullRequest
19 голосов
/ 18 июля 2011

Я пытаюсь провести автоматическое тестирование с WebDriver, но в настоящее время у него нет возможности имитировать события с колесом мыши.В качестве обходного пути я пытаюсь запустить эти события с помощью JavaScript вместо этого.Сейчас я провожу все свои эксперименты на прямой HTML-странице, а не в рамках WebDriver.

Я специально пытаюсь запустить событие колеса мыши для элемента div с прокруткой.

До сих пор я мог делать это с 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 Ответ

13 голосов
/ 19 июля 2011

Ну

  1. В части кода Mozilla, если вы слушаете DOMMouseScroll, вам также следует отправить событие DOMMouseScroll, не так ли? (колесо мыши кажется изобретением Microsoft, скопированным с помощью webkit, но не Gecko ).
  2. Вместо установки (только для чтения) свойств события, вы должны вызвать соответствующий метод init...(), который для события мыши равен initMouseEvent(). (* 1 010 * спецификации )

Вот исправленный тестовый пример, который работает в Firefox: http://jsfiddle.net/6nnMV/

Возможно, это не полезно для вас, но может представлять интерес для других людей, желающих симулировать события, вот как (привилегированные) модульные тесты в Mozilla симулируют «реальные» события: http://hg.mozilla.org/mozilla-central/annotate/a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248

...