web-dev-qa-db-ja.com

JavaScriptを使用してFirefoxでマウスホイールイベントを発生させる方法は?

WebDriverを使用して自動テストを実行しようとしていますが、現在、マウスホイールイベントをシミュレートする機能がありません。回避策として、代わりにJavaScriptを使用してこれらのイベントを発生させようとしています。私は現在、WebDriverフレームワーク内ではなく、まっすぐなHTMLページですべてのホイールの実験を行っています。

具体的には、スクロールする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が期待する場所に配置)を使用してマウスホイールイベントを発生させ、ハンドラーがそれを取得するための最低限のことを誰かに教えてもらえますか?

20
Justin Aquadro

上手、

  1. コードのMozillaの部分で、DOMMouseScrollをリッスンしている場合は、DOMMouseScrollイベントもディスパッチする必要があります。 (mousewheelは Microsoftの発明はwebkitによってコピーされましたが、Geckoではありません のようです)。
  2. イベントに(読み取り専用)プロパティを設定する代わりに、適切なinit...()メソッドを呼び出すことになっています。これは、マウスイベントの場合はinitMouseEvent()です。 ( spec

Firefoxで動作する修正済みのテストケースは次のとおりです。 http://jsfiddle.net/6nnMV/

おそらくあなたには役に立たないかもしれませんが、イベントをシミュレートしようとしている他の人々には興味があるかもしれません。mozillaの(特権)ユニットテストが「実際の」イベントをシミュレートする方法は次のとおりです。 http://hg.mozilla.org/mozilla-中央/注釈/ a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248

14
Nickolay