Dies ist, was ich mir bisher ausgedacht habe, nachdem ich den Rest der Antworten studiert habe. Es sollte in der Lage sein, Nur-Touch-, Nur-Maus- oder Hybrid-Benutzer zu unterstützen.
Erstellen Sie eine separate Hover-Klasse für den Hover-Effekt. Fügen Sie diese Hover-Klasse standardmäßig unserer Schaltfläche hinzu.
Wir möchten das Vorhandensein von Touch-Unterstützung nicht erkennen und alle Hover-Effekte von Anfang an deaktivieren. Wie von anderen erwähnt, werden Hybridgeräte immer beliebter. Menschen haben möglicherweise Touch-Unterstützung, möchten aber eine Maus verwenden und umgekehrt. Entfernen Sie daher die Hover-Klasse nur, wenn der Benutzer die Schaltfläche tatsächlich berührt.
Das nächste Problem ist, was ist, wenn der Benutzer nach dem Berühren der Taste wieder eine Maus verwenden möchte? Um dies zu lösen, müssen wir einen geeigneten Moment finden, um die von uns entfernte Schwebeklasse wieder hinzuzufügen.
Wir können es jedoch nicht sofort nach dem Entfernen wieder hinzufügen, da der Schwebezustand noch aktiv ist. Möglicherweise möchten wir nicht auch den gesamten Button zerstören und neu erstellen.
Daher habe ich mir überlegt, einen Algorithmus zum Warten auf Besetzt (mit setInterval) zu verwenden, um den Schwebezustand zu überprüfen. Sobald der Schwebezustand deaktiviert ist, können wir die Schwebeklasse wieder hinzufügen und das Warten beenden, um zum ursprünglichen Zustand zurückzukehren, in dem der Benutzer entweder Maus oder Berührung verwenden kann.
Ich weiß, dass das Warten beschäftigt nicht so toll ist, aber ich bin mir nicht sicher, ob es ein geeignetes Ereignis gibt. Ich habe überlegt, es im Mouseleave-Event wieder hinzuzufügen, aber es war nicht sehr robust. Wenn beispielsweise nach dem Berühren der Taste eine Warnung angezeigt wird, verschiebt sich die Mausposition, aber das Mausblattereignis wird nicht ausgelöst.
var button = document.getElementById('myButton');
button.ontouchstart = function(e) {
console.log('ontouchstart');
$('.button').removeClass('button-hover');
startIntervalToResetHover();
};
button.onclick = function(e) {
console.log('onclick');
}
var intervalId;
function startIntervalToResetHover() {
// Clear the previous one, if any.
if (intervalId) {
clearInterval(intervalId);
}
intervalId = setInterval(function() {
// Stop if the hover class already exists.
if ($('.button').hasClass('button-hover')) {
clearInterval(intervalId);
intervalId = null;
return;
}
// Checking of hover state from
// http://stackoverflow.com/a/8981521/2669960.
var isHovered = !!$('.button').filter(function() {
return $(this).is(":hover");
}).length;
if (isHovered) {
console.log('Hover state is active');
} else {
console.log('Hover state is inactive');
$('.button').addClass('button-hover');
console.log('Added back the button-hover class');
clearInterval(intervalId);
intervalId = null;
}
}, 1000);
}
.button {
color: green;
border: none;
}
.button-hover:hover {
background: yellow;
border: none;
}
.button:active {
border: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id='myButton' class='button button-hover'>Hello</button>
Bearbeiten: Ein anderer Ansatz, den ich versucht habe, ist das Aufrufen von e.preventDefault()
ontouchstart oder ontouchend. Es scheint den Hover-Effekt zu stoppen, wenn die Schaltfläche berührt wird, aber es stoppt auch die Schaltfläche-Klick-Animation und verhindert, dass die Onclick-Funktion aufgerufen wird, wenn die Schaltfläche berührt wird. Sie müssen diese also manuell im ontouchstart- oder ontouchend-Handler aufrufen. Keine sehr saubere Lösung.