2016-05-09 20 views
10

Ich habe eine alphabetische Scroll-Leiste (ASB) in meiner App, die meisten Smartphones haben in ihrer Contacts App.Hover oder Mouseover auf Smartphone-Browser erkennen

Jetzt habe ich keine Problem zu bestimmten Artikel scrollen, wenn mein Finger touchstart touchend click etc.. auf dem ASB. Aber ich habe Probleme bei der Erfassung oder mouseover Ereignis auf meinem Smartphone.

Ich habe versucht touchstart touchswipe touchend mouseenter mousemove oder ohne Glück.

Hier können Sie die Fiddle oder Codepen auf Ihrem Handy spielen.

Jeder Vorschlag wird geschätzt.

+0

nicht sicher, ob ich verstehe, was Du versuchst es zu erreichen? Der Hover funktioniert gut für mich? –

+0

@SCraig Funktioniert es in Ihrem mobilen Browser? – choz

+2

Es gibt keinen Schwebeflug auf dem Smartphone. Das Gerät kann es nicht erkennen. Sie erhalten nur Klicks, ziehen etc. –

Antwort

4

TL; DR; touchmove, touchstart und touchend sind die Ereignisse, die dies möglich gemacht haben.


Ich habe festgestellt, dass mir zu sagen, die Menschen halten, dass es auf nicht-native App nicht möglich ist, die Funktionalität von Hover-Ereignisse auf dem Smartphone zur Verfügung zu stellen.

Aber die modernen Smartphone-Browser haben tatsächlich die Funktionen zur Verfügung gestellt. Ich erkannte, dass die Lösung buchstäblich an einem sehr einfachen Ort liegt. Und mit ein paar Optimierungen habe ich mir überlegt, wie ich dieses Verhalten simulieren kann, obwohl es etwas betrügerisch ist.

So, die meisten touchevents übergeben die Argumente, die die erforderlichen Informationen haben, wo der Benutzer auf dem Bildschirm berührt.

E.g

var touch = event.originalEvent.changedTouches[0]; 
var clientY = touch.clientY; 
var screenY = touch.screenY; 

Und da ich die Höhe jeder Taste auf meiner ASB weiß, ich kann nur berechnen, wo der Benutzer auf das Element schwebt.

Hier ist die CodePen, um es einfacher auf mobilen Touch-Geräten zu versuchen. (Bitte beachten Sie, dies funktioniert nur auf Touch-Geräten können Sie noch Chrom verwenden, um auf ein- und Gerätemodus)

Und das ist mein letzter Code,

var $startElem, startY; 
 

 
function updateInfo(char) { 
 
    $('#info').html('Hover is now on "' + char + '"'); 
 
} 
 

 
$(function() { 
 
    var strArr = "#abcdefghijklmnopqrstuvwxyz".split(''); 
 
    for (var i = 0; i < strArr.length; i++) { 
 
    var $btn = $('<a />').attr({ 
 
     'href': '#', 
 
     'class': 'btn btn-xs' 
 
     }) 
 
     .text(strArr[i].toUpperCase()) 
 
     .on('touchstart', function(ev) { 
 
     $startElem = $(this); 
 
     var touch = ev.originalEvent.changedTouches[0]; 
 
     startY = touch.clientY; 
 
     updateInfo($(this).text()); 
 
     }) 
 
     .on('touchend', function(ev) { 
 
     $startElem = null; 
 
     startY = null; 
 
     }) 
 
     .on('touchmove', function(ev) { 
 
     var touch = ev.originalEvent.changedTouches[0]; 
 
     var clientY = touch.clientY; 
 

 
     if ($startElem && startY) { 
 
      var totalVerticalOffset = clientY - startY; 
 
      var indexOffset = Math.floor(totalVerticalOffset/22); // '22' is each button's height. 
 

 
      if (indexOffset > 0) { 
 
      $currentBtn = $startElem.nextAll().slice(indexOffset - 1, indexOffset); 
 
      if ($currentBtn.text()) { 
 
       updateInfo($currentBtn.text()); 
 
      } 
 
      } else { 
 
      $currentBtn = $startElem.prevAll().slice(indexOffset - 1, indexOffset); 
 
      if ($currentBtn.text()) { 
 
       updateInfo($currentBtn.text()); 
 
      } 
 
      } 
 
     } 
 
     }); 
 

 
    $('#asb').append($btn); 
 
    } 
 
});
#info { 
 
    border: 1px solid #adadad; 
 
    position: fixed; 
 
    padding: 20px; 
 
    top: 20px; 
 
    right: 20px; 
 
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="info"> 
 
    No hover detected 
 
</div> 
 
<div id="asb" class="btn-group-vertical"> 
 
</div>

0

Das Hover-Ereignis wird mit Click/Touch-Ereignissen auf dem Mobiltelefon ausgelöst, weil Sie ein Element nicht einfach auf einem Touchscreen bewegen können.

Sie können dieses Verhalten demonstrieren, indem Sie einfach die css-Hover- und/oder Fokus-Selektoren verwenden, um den Inhalt zu ändern. Sie können sehen, dass vor dem Klicken die Elemente gleich bleiben, aber nach dem Klicken behalten sie geänderte Stile bei.

0

Bindung Touchstart auf einem Elternteil. So etwas wird funktionieren:

Sie müssen nichts in der Funktion tun, lassen Sie es leer. Dies reicht aus, um bei Berührung zu schweben, so dass sich eine Berührung eher wie folgt verhält: schweben und weniger wie: aktiv.

ähnliche Frage How do I simulate a hover with a touch in touch enabled browsers?

+1

Dieses Ereignis wird nur ausgelöst, wenn wir den Körper berühren. Dies erlaubt mir nicht, Hover auf Elemente zu ziehen und zu erkennen. – choz

0

Der Code, der Du in Ihrem Fiddle oder Codepen vorgesehen funktioniert gut. Also, was ist los?

Nun, in den meisten Luft-oder Touch-triggern Gadgets wie Smartphones und Tablets, können Sie nicht einfach die Hover-Funktion verwenden, weil Sie nicht Ding auf es, um einige Ereignisse machen können. Sie können die Hover-Funktion nur verwenden, wenn Sie zum Beispiel eine abnehmbare Tastatur für ein Tablet verwenden (oder eine Maus oder einen Fingerscroller).

+0

Der Code funktioniert nicht auf Mobilgeräten. – choz