TL; DR; touchmove
, touchstart
e touchend
sono gli eventi che lo hanno reso possibile.
ho trovato che le persone continuano a dirmi che non è possibile in applicazioni non native per fornire la funzionalità di evento hover su smartphone.
Ma i moderni browser per smartphone hanno effettivamente fornito le funzionalità. Mi sono reso conto che la soluzione è letteralmente situata in un posto molto semplice. E con poche modifiche, ho capito come posso simulare questo comportamento su multipiattaforma anche se è un po 'imbroglio.
Quindi, la maggior parte di touchevents
passa gli argomenti che contengono le informazioni necessarie in cui l'utente tocca lo schermo.
E.g
var touch = event.originalEvent.changedTouches[0];
var clientY = touch.clientY;
var screenY = touch.screenY;
E siccome so che l'altezza di ogni tasto sul mio ASB
, posso solo calcolare in cui l'utente si posiziona l'elemento su.
Ecco lo CodePen per provare più facilmente sui dispositivi touch mobili. (Si prega di notare che questo funziona solo su dispositivi touch, è comunque possibile utilizzare Chrome in modalità dispositivo commutato)
E questo è il mio codice finale,
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>
Non sicuro di aver capito che cosa stai cercando di raggiungere? L'hover funziona bene per me? –
@SCraig Funziona correttamente sul browser mobile? – choz
Nessun hover su smartphone. Il dispositivo non riesce a rilevarlo. Otterrai solo clic, trascina ecc. –