[英]How do I detect whether a browser supports mouseover events?
假設我有一個網頁,它有一些 onmouseover javascript 行為來下拉菜單(或類似的東西)
顯然,這不適用於 iPad 或智能手機等觸控設備。
如何檢測瀏覽器是否支持懸停事件,如 onmouseover 或 onmouseout 以及 CSS 中的 :hover 偽標簽?
注意:我知道如果我對此感到擔心,我應該以不同的方式編寫它,但我很好奇是否可以進行檢測。
編輯:當我說“支持懸停事件”時,我的意思是“瀏覽器是否對懸停事件具有有意義的表示”。 如果硬件支持而軟件不支持(反之亦然),則沒有有意義的表示。 除了一些即將到來的技術,我認為任何觸摸設備都沒有有意義的懸停事件表示。
此方法捕獲更多設備/瀏覽器
try {
document.createEvent("TouchEvent");
alert(true);
}
catch (e) {
alert(false);
}
現在是 2016 年,許多設備都具有觸摸和類似鼠標的輸入已有好幾年了。 “Can't touch”不是判斷“Can mouseover”的好方法。 舉幾個例子:
因此,用戶可能無法懸停一分鍾,然后,在同一設備上,不刷新頁面,他們將筆從 Galaxy Note 中拔出,並且(假設它沒有着火)他們突然在交互中使用懸停,他們希望它能夠正常工作。
如果您需要知道您的用戶 a) 是否可以使用並且 b) 當前正在使用使他們能夠方便地移動鼠標的設備,您可以:
mousemove
事件綁定到您的文檔body
,該事件激活“已懸停”狀態(例如,將類user-can-mouseover
到body
),然后立即解除綁定,使其只發生一次。touchstart
暫時停用該事件mousemove
和touchend
是重新激活它,這樣,在瀏覽器上觸發式鼠標事件(在Android和Windows很常見),正常觸摸滾動不會觸發mousemove
。mousemove
事件解除這些touchstart
和touchend
事件的綁定, touchend
進行良好的管理這將導致在用戶開始使用行為類似於鼠標的輸入設備時觸發“可以懸停”狀態。
以混合設備為例:
...並使用鼠標獲取老式桌面工作站:
基於 user568458 的響應的一組功能,允許您打開/關閉觸摸設備的 :hover 樣式(我還沒有在所有設備上嘗試過):
function detectMouseMove() {
$(document).one('mousemove', function() {
$('body').addClass('hoverActive');
detectTouchEvent();
});
}
function detectTouchEvent() {
$(document).one('touchstart', function() {
$('body').removeClass('hoverActive');
detectMouseMove();
});
}
然后,您可以在任何 :hover 選擇器之前在樣式表中使用 .hoverActive 以防止移動瀏覽器嘗試顯示懸停狀態。
matchMedia('(hover: hover)').matches; // Primary device can hover
matchMedia('(hover: none)').matches; // Primary device cannot hover
matchMedia('(any-hover: hover)').matches; // At least one of the connected devices can hover
matchMedia('(any-hover: none)').matches; // None of the connected devices can hover
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.