Geri kalan cevapları inceledikten sonra şimdiye kadar bulduğum şey bu. Yalnızca dokunma, yalnızca fare veya karma kullanıcıları destekleyebilmelidir.
Fareyle üzerine gelme efekti için ayrı bir fareyle üzerine gelme sınıfı oluşturun. Varsayılan olarak, bu fareyle üzerine gelme sınıfını düğmemize ekleyin.
Dokunmatik desteğin varlığını tespit etmek ve tüm fareyle üzerine gelme efektlerini en başından devre dışı bırakmak istemiyoruz. Başkaları tarafından belirtildiği gibi, hibrid cihazlar popülerlik kazanıyor; insanlar dokunma desteğine sahip olabilirler, ancak fare kullanmak isterler ya da tam tersi. Bu nedenle, fareyle üzerine gelme sınıfını yalnızca kullanıcı düğmeye gerçekten dokunduğunda kaldırın.
Bir sonraki sorun, kullanıcı düğmeye dokunduktan sonra fare kullanmaya geri dönmek isterse ne olur? Bunu çözmek için, kaldırdığımız vurgulu sınıfı geri eklemek için fırsatlı bir an bulmamız gerekiyor.
Ancak, fareyle üzerine gelme durumu hala etkin olduğundan, kaldırdıktan hemen sonra geri ekleyemeyiz. Düğmenin tamamını da yok etmek ve yeniden oluşturmak istemeyebiliriz.
Bu yüzden, fareyle üzerine gelme durumunu kontrol etmek için meşgul bekleyen bir algoritma (setInterval kullanarak) kullanmayı düşündüm. Fareyle üzerine gelme durumu devre dışı bırakıldıktan sonra, fareyle üzerine gelme sınıfını geri ekleyebilir ve meşgul beklemeyi durdurabilir, böylece kullanıcı fareyi veya dokunmayı kullanabileceği orijinal duruma geri getirebiliriz.
Meşgul beklemenin o kadar da iyi olmadığını biliyorum ama uygun bir etkinlik olup olmadığından emin değilim. Mouseleave etkinliğine geri eklemeyi düşündüm, ancak çok sağlam değildi. Örneğin, düğmeye dokunduktan sonra bir uyarı çıktığında, fare konumu değişir, ancak fareyle açılan olay tetiklenmez.
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>
Düzenleme: Ben denedim başka bir yaklaşım e.preventDefault()
ontouchstart veya ontouchend içinde aramaktır. Düğmeye dokunulduğunda fareyle üzerine gelme efektini durdurduğu görülüyor, ancak düğme tıklama animasyonunu da durduruyor ve düğmeye dokunulduğunda onclick işlevinin çağrılmasını önlüyor, bu yüzden bunları başaşağı veya alt işleyicide manuel olarak çağırmanız gerekiyor. Çok temiz bir çözüm değil.