Jak vyvolat událost kolečka myši ve Firefoxu pomocí JavaScriptu?

Snažím se provádět automatizované testování pomocí WebDriver, ale v současné době nemá schopnost simulovat události kolečka myši. Jako řešení se snažím tyto události místo toho spouštět pomocí JavaScriptu. Právě teď experimentuji na rovné HTML stránce, nikoli v rámci WebDriver.

Konkrétně se snažím vyvolat událost kolečka myši u prvku div posouvání.

Doposud jsem to mohl dělat s Chrome a IE9, ale nezdá se mi, že by ve Firefoxu (5.x) nic fungovalo.

Ke zjištění, kdy jsou spuštěny události kolečka myši, které jsem vylovil ze sítě, používám následující kód pro různé prohlížeče. Tento kód dokáže zachytit událost ve všech prohlížečích, když posouvám kolečkem myši v rámci posouvacího prvku, který jsem vytvořil (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>

Funkce níže, když je zavolána, je schopna spustit událost kolečka myši v Chrome a IE9 a je zachycena ve výše uvedeném ovladači s očekávaným chováním.

function ChromeWheel () {
  var evt = document.createEvent("MouseEvents");
  evt.initEvent('mousewheel', true, true);
  evt.wheelDelta = 120;
  view.dispatchEvent(evt);
}

Samozřejmě to nefunguje pro Firefox. Zjistil jsem, že stávající dokumentace je příliš řídká a matoucí na to, abych věděl, jak to FF řeší. Může mi někdo ukázat naprosté minimum pro vyvolání události kolečka myši ve Firefoxu s deltou kolečka (umístěným tam, kde to Firefox očekává), aby to můj ovladač zachytil?

Odpověď

No,

  1. Pokud v části kódu Mozilla posloucháte DOMMouseScroll, měli byste také odeslat událost DOMMouseScroll, ne? (kolečko myši se zdá být vynálezem Microsoftu zkopírovaným webkitem, ale ne Gecko).
  2. Místo nastavování vlastností (pouze pro čtení) události byste měli volat příslušné init...() metoda, která je pro událost myši initMouseEvent() . (spec)

Zde je opravený testovací případ, který funguje ve Firefoxu:http://jsfiddle.net/6nnMV/

Pravděpodobně to pro vás není užitečné, ale může to být zajímavé pro ostatní lidi, kteří chtějí simulovat události, zde je návod, jak (privilegované) testy jednotek v mozille simulují „skutečné“ události:http://hg.mozilla.org/mozilla-central/annotate/ a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248