Inilah yang saya temukan sejauh ini setelah mempelajari sisa jawaban. Itu harus dapat mendukung pengguna sentuh saja, mouse saja atau hybrid.
Buat kelas hover terpisah untuk efek hover. Secara default, tambahkan kelas hover ini ke tombol kami.
Kami tidak ingin mendeteksi keberadaan dukungan sentuh dan menonaktifkan semua efek hover dari awal. Seperti yang disebutkan oleh orang lain, perangkat hybrid semakin populer; orang mungkin memiliki dukungan sentuh tetapi ingin menggunakan mouse dan sebaliknya. Oleh karena itu, hapus saja kelas hover ketika pengguna benar-benar menyentuh tombol.
Masalah selanjutnya adalah, bagaimana jika pengguna ingin kembali menggunakan mouse setelah menyentuh tombol? Untuk mengatasinya, kita perlu mencari momen yang tepat untuk menambahkan kembali kelas hover yang telah kita hapus.
Namun, kami tidak dapat menambahkannya kembali segera setelah menghapusnya, karena status hover masih aktif. Kami mungkin tidak ingin menghancurkan dan membuat ulang seluruh tombol juga.
Jadi, saya berpikir untuk menggunakan algoritma sibuk-menunggu (menggunakan setInterval) untuk memeriksa status hover. Setelah negara melayang dinonaktifkan, kita kemudian dapat menambahkan kembali kelas melayang dan menghentikan sibuk menunggu, membawa kita kembali ke keadaan awal di mana pengguna dapat menggunakan mouse atau sentuhan.
Saya tahu sibuk-menunggu tidak terlalu bagus tapi saya tidak yakin apakah ada acara yang tepat. Saya sudah mempertimbangkan untuk menambahkannya kembali di acara mouseleave, tapi itu tidak terlalu kuat. Misalnya, ketika peringatan muncul setelah tombol disentuh, posisi mouse bergeser tetapi acara mouseleave tidak terpicu.
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>
Sunting: Pendekatan lain yang saya coba adalah menelepon e.preventDefault()
dalam ontouchstart atau ontouchend. Tampaknya untuk menghentikan efek hover ketika tombol disentuh, tetapi juga menghentikan animasi klik tombol dan mencegah fungsi onclick dipanggil saat tombol disentuh, jadi Anda harus memanggil mereka secara manual di ontouchstart atau ontouchend handler. Bukan solusi yang sangat bersih.