2017-01-13 89 views
9

Açıklayamayacağım çok garip bir davranış buldum. Aşağıdaki yapmak ister:mouseover bazen touchstart yerine ateş ediyor - neden?

bir işleyici giriş cihazının türüne bağlı olarak, bir touchstartveyamouseover olaya tepki gerekmektedir. Karma aygıtları (hem fare hem de dokunmatik ekranla) desteklemek istediğimi ve işaretçi olaylarına güvenemeyeceğimi unutmayın.

Şimdi hem touchstart hem de mouseover olaylarını kurdum. Ve çoğu için sadece iyi çalışıyor. Ayrıca dokunma olaylarından sonra simüle edilen "fare" olaylarını engellemek için preventDefault'u kullanın. Ama ne bana tamamen kafa karıştırıcı bazen hareketsiz bir mouseover olay husul yoktur ve ben preventDefault kaldırırsanız, hatta mouseover yerine touchstart aittetiklendiğini görünüyor olmasıdır. Neden bu neden oluyor? Ayrıca, bu hem Android hem de iOS ile yeniden üretilebilir! Android ile daha kolay bir şekilde tetiklense de (Chrome kullanarak).

Kendiniz için deneyebileceğiniz küçük bir test çantası hazırladım. Bu davranışın yalnızca kırmızı DIV (olayları içeren) ve arka plan arasındaki sınırda bir yere dokunduğunuzda tetiklendiğini unutmayın. Sadece merkeze dokunmak% 100 çalışır. Ve olana kadar az ya da çok deneye ihtiyacınız olabilir.

Herhangi bir yardım büyük beğeni topladı!

<!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

Eğer mousedown olayı koordinatlarına bakacaksanız, mobil modda kenarları (hemen dışında) tıkladığınızda Chrome koordinatları doğru değil. –

+0

Hey, hatayı kromda üretemiyorum, https://jsfiddle.net/xvtgc36r/1/ –

+0

Hmm, kodunuz biraz farklı. Ayrıca bir dokunmatik cihaz üzerinde test ettiğinizden emin olun. –

cevap

2

Örneğinizin etrafına biraz eğlendim ve Chrome'da bir hata gibi görünüyor. Firefox'ta üretemedim. Hem masaüstü Chrome geliştirici araçları üretebileceği ve aslında vakaların% 100'ünde yeniden ortaya çıkarmak için bir yol buldum: daire

  • yer

    • açık dev araçları ve cihaz moduna geçmek imlecin merkezi kırmızı dikdörtgenin dışında görüntü kalitesi için chrome dev tool cursor üzgün olacak şekilde kırmızı dikdörtgenin kenarında imleç, bir ekran görüntüsü ile bu imleci yakalayabilir edemez
    • tık
    • işe yaraması için Bir dahaki sefere siyah kağıda ilk tıklamanız gerekiyor kırmızı dikdörtgenden uzaklıklar

    Bu yüzden, dokunma ortası dikdörtgenin dışına çıktığında, ancak dokunmanın yarıçapı dikdörtgenin üstüste geldiğinde böyle olur. Yani, bir hata raporu dışında burada ne yapabileceğinizden emin değilim

  • +0

    Evet, tam olarak gözlemlediğim şey bu. İlk başta, bir hata olduğunu düşündüm. Ama bekle ... iOS'ta tekrar dene ve davranış tam olarak SAME. Bu yüzden bu yüzden kafam karıştı. Chrome ve Safari'nin aynı kodu (aka Webkit) paylaştığı günlere bakarak bu eski bir hata olabilir mi? –

    +0

    Webkit ve Blink'in günümüzde ne kadar kod paylaştığından emin değilim, ancak biri diğerinin çatalı olduğundan, dokunma olaylarını tetiklemek için aynı mantığa sahip olabilirler. Ama yine de, bu davranış benim için amaçlanan bir şey gibi görünmüyor, dokunmatik cihazlar veya gerçek bir hata kullanırken, ya da fare olayını taklit eden bir yan etkinin göz ardı edilmiş gibi görünüyor. Her iki durumda da muhtemelen bu sorunu Chrome ve iOS tarayıcı ekiplerine bildirmelisiniz, size çok daha net bir yanıt verebilirler :-) – jetpackpony

    +0

    Haklısınız. Bunu kontrol ettiğiniz için teşekkür ederim ve bencini hak ettiğinizi düşünüyorum;) –

    2

    Fare olaylar (fare üzerinde, mouseout, mousedown, mouseup, mousemove, vs), fare giriş cihazı özgüdür.

    Mouseover javascript olayı, touchenter dokunma olaylarına dönüşür. Bu olaylar bir W3C taslağının (şu anda sadece Firefox desteği) bir parçasıdır, bu yüzden kullanmak isterseniz, touchmove etkinliğini kullanarak ve koordinatlara bakarak ve htmlinizin koordinatlarıyla örtüşüp örtüşmediklerini görmek için çok fazla özelliği uygulamanız gerekir. öğesi.

    Size yardımcı olduğunu düşünüyorum.

    +0

    Bunu söylediğim için üzgünüm, ama sorumu dikkatlice okumadınız ve ek olarak cevabınız yanlış. Her şeyden önce, fare olayları fare giriş cihazına özgü DEĞİLDİR! Fare olayları, dokunma kullanırken "sentetik olaylar" olarak adlandırılan şekilde kullanılır. Dokunma kullanırken, BOTH touch ve mouse olayları üretilir, fare olayları genellikle dokunma olaylarından sonra ateşlenir. Benim sorum gerçekte müşterinin, bazı durumlarda dokunma (yani, önceki dokunma olayları) kullanırken (ki bu gerçekleşmemeli ve işleri daha da zorlaştırıyor) bir "mouseover" olayını tetiklemesi ile ilgilidir. –