如何使用JavaScript在Firefox中触发鼠标滚轮事件?

时间:2011-07-18 16:04:46

标签: javascript firefox javascript-events mousewheel dispatchevent

我正在尝试使用WebDriver进行自动化测试,但它目前无法模拟鼠标滚轮事件。作为一种解决方法,我试图用JavaScript来解雇这些事件。我现在正在直接在HTML页面上进行实验,而不是在WebDriver框架内。

我特意尝试在滚动的div元素上触发鼠标滚轮事件。

到目前为止,我已经能够使用Chrome和IE9执行此操作,但我似乎无法在Firefox(5.x)中使用任何内容。

我正在使用以下跨浏览器代码来检测何时触发鼠标滚轮事件,这是我从网上抓取的。当我在我创建的滚动div(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 个答案:

答案 0 :(得分:13)

那么,

  1. 在代码的Mozilla部分,如果您正在侦听DOMMouseScroll,您也应该发送一个DOMMouseScroll事件,不是吗? (mousewheel似乎是Microsoft invention copied by webkit, but not Gecko)。
  2. 您应该调用适当的init...()方法,而不是在事件上设置(只读)属性,鼠标事件为initMouseEvent()。 (spec
  3. 这是一个固定的测试用例,适用于Firefox:http://jsfiddle.net/6nnMV/

    可能对您没用,但可能对其他想要模拟事件的人感兴趣,这里是mozilla中的(特权)单元测试如何模拟“真实”事件:http://hg.mozilla.org/mozilla-central/annotate/a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248