2017-01-13 7 views
9

私は説明できない非常に奇妙な行動を見つけました。次の操作を実行したい:タッチスタートの代わりにマウスオーバーが発生することがあります - なぜですか?

ハンドラは、入力デバイスの種類に応じて、touchstartまたはmouseoverイベントに反応する必要があります。 (マウスとタッチスクリーンの両方で)ハイブリッドデバイスをサポートしたいと思い、ポインタイベントに依存できないことに注意してください。

ここでは、touchstartmouseoverの両方のイベントを設定しました。そして、ほとんどの場合、それはうまく動作します。 preventDefaultを使用して、タッチイベント後のシミュレートされた「マウス」イベントの発射を禁止します。しかし、どのような私には全く混乱していることが時々まだmouseoverイベントoccuringがあり、私はでpreventDefaultを削除する場合は、それもmouseoverではなくtouchstartを発射されているようだということです。なぜこのようなことが起こっているのですか?

さらに、これはAndroidとiOSの両方で再現可能です! Android(Chromeを使用)ではより簡単に起動するようです。

私は少しテストケースを用意していますので、自分で試してみることができます。この現象は、赤いDIV(イベントを含む)と背景の境界線のどこかをタップすると発生したように見えることに注意してください。センターをタップするだけで100%動作します。それが起こるまで、あなたは多かれ少なかれの試練を必要とするかもしれません。

大変助かりました!

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <title>Touchtest</title> 
 
    <style> 
 
    body { 
 
     background: #222; 
 
     color: white; 
 
     position: relative; 
 
     font-size: .9em; 
 
     font-family: Arial, Helvetica, sans-serif; 
 
    } 
 
    #test { 
 
     position: fixed; 
 
     top: 100px; 
 
     right: 100px; 
 
     bottom: 100px; 
 
     left: 100px; 
 
     background: red; 
 
    } 
 
    </style> 
 
</head> 
 

 
<body> 
 
    <div id="test"></div> 
 
    <script type="text/javascript"> 
 
    function testEvent(event) { 
 
     console.log("testEvent", event); 
 
     if (event.type === "mouseover") { 
 
     alert("MOUSEOVER DETECTED"); 
 
     } 
 
     event.preventDefault(); 
 
    } 
 

 
    var ele = document.getElementById("test"); 
 
    ele.addEventListener("touchstart", testEvent); 
 
    ele.addEventListener("mouseover", testEvent); 
 
    </script> 
 
</body> 
 

 
</html>

+0

mousedownイベントの座標を見ると、モバイルモードで(モバイルの外で)エッジをクリックするとChromeの座標が正しくありません。 –

+0

こんにちは、私はクロム、https://jsfiddle.net/xvtgc36r/1/にあなたのバグを再現することができません –

+0

うーん、あなたのコードは少し異なります。また、タッチデバイスでテストすることを確認してください。 –

答えて

2

私は少しあなたの例を突き刺しました。これはChromeのバグのようです。私はFirefoxでそれを再現できませんでした。 あなたは、デスクトップ上のChromeデベロッパーツールでそれを再現することができ、実際に私が例100%でそれを再現する方法見つけた:円

  • 場所を

    • オープンのdevのツールおよびデバイスモードに切り替えをカーソルの中心が画像品質のために申し訳ありません赤い長方形 chrome dev tool cursor の外でそれを動作させるために、私はスクリーンショットで
    • クリック
    • をこのカーソルをキャプチャすることができないように赤い長方形の端にカーソル次回は、最初に黒色のバックグラウンドをクリックする必要があります赤い矩形から遠ざかります。

    タッチの中心が矩形の外側にあり、タッチの半径が矩形と重なっているように見えます。 しかし、私はあなたがここで何ができるかわからないバグレポートを提出する以外

  • +0

    ええ、これはまさに私が観察したものです。最初はバグも考えました。しかし、待って...もう一度iOSを試してみてください。その動作はまったく同じです。だから私はとても混乱している。これは非常に古いバグで、ChromeとSafariが同じコード(別名Webkit)を共有した時代を指していますか? –

    +0

    私は、WebkitとBlinkが現在どのくらいのコードを共有しているのかよく分かりませんが、もう1つはフォークされているので、タッチイベントをトリガするロジックは同じです。しかし、とにかく、この動作は私に意図的に実装されたもののようには見えませんが、タッチデバイスを使用してマウスイベントをエミュレートする際の見落としの副作用か、実際のバグのようです。どちらの方法でも、この問題をChromeとiOSのブラウザチームに報告する必要がある場合は、より明確な回答を得ることができます:-) – jetpackpony

    +0

    あなたが正しいと思います。これを確認していただきありがとうございます、私はあなたの恩恵に値すると思います) –

    2

    マウスイベント(マウスオーバー、マウスアウト、マウスダウン、のmouseup、のMouseMoveなど)マウス入力装置に固有です。

    mouseover javascriptイベントは、touchenter touchイベントに変換されます。このイベントはW3Cのドラフト(現在のところFirefoxのサポートのみ)の一部なので、使用したい場合はtouchmoveイベントを使用してonmouseover機能を実装し、座標を見て、それらがhtmlの座標と重なるかどうかを確認する必要があります素子。

    私はそれがあなたを助けると思います。

    +0

    申し訳ありませんが、私の質問を慎重に読まなかっただけでなく、あなたの答えは間違っています。だからまず第一に、マウスイベントはマウス入力デバイスに固有ではありません!マウスイベントは、「合成イベント」と呼ばれるように、タッチを使用するとよく発生します。タッチを使用すると、タッチイベントとマウスイベントの両方が生成され、マウスイベントは通常、タッチイベント後に発生します。私の質問は、クライアントが特定の状況下でタッチを使用する場合(つまり、先行するタッチイベントがない場合)にのみマウスオーバーイベントを発生させることです。 –

    関連する問題