如何可靠地确定浏览器是否支持鼠标悬停事件?

时间:2012-02-24 09:07:19

标签: javascript mobile browser browser-feature-detection

过去,检查鼠标是否存在的最佳方法是查找touch event support。但是,桌面Chrome现在支持触摸事件,使此测试失败。

有没有办法直接测试鼠标悬停事件支持,而不是根据触摸事件的存在来推断它?

解决方案:根据AshleysBrain的回答,以下是有效的代码。

jQuery(function()
{
    // Has mouse
    jQuery("body").one("mousemove", function(e)
    {
        attachMouseEvents();
    });

    // Has touchscreen
    jQuery("body").one("touchstart", function(e)
    {
        // Unbind the mouse detector, as this will fire on some touch devices. Touchstart should always fire first.
        jQuery("body").unbind("mousemove");

        attachTouchEvents();
    });
});

4 个答案:

答案 0 :(得分:5)

你可以对detecting keyboard or touch input的解决方案做相反的事情。只需等待实际的触摸事件或鼠标移动事件,并根据该事件做出决定。如果检查是否存在事件处理程序,则浏览器可能会指示它具有该事件,即使它当前没有在支持它的硬件上运行,因此唯一可靠的做法是等待并查看哪些实际事件触发。

答案 1 :(得分:1)

您可能想要考虑使用Modernizr,您可以使用Modernizer.hasEvent()docs)方法执行以下操作:

Modernizr.hasEvent("mouseover", document);

答案 2 :(得分:0)

我试过这个,这是有效的。

<html>
<head>
    <script type="text/javascript">
        function isEventSupported(eventName) {
            var el = document.createElement("body"[eventName] || "div");
            var isSupported = "on" + eventName.toLowerCase() in el || top.Event && typeof top.Event == "object" && eventName.toUpperCase() in top.Event;
            el = null;
            return isSupported;
        }
    </script>
</head>

<body onload="alert(isEventSupported('mouseover'));">TEST mouseover event</body>
</html>

我从http://www.strictly-software.com/eventsupport.htm

获取了isEventSupported函数

答案 3 :(得分:-1)

如果网站能够像他们一样准确地检测到您正在使用移动浏览器,为什么不能使用相同的技术来推断它们没有鼠标悬停支持?