js滚轮事件兼容函数封装

文章发布于 2023-07-21

js滚轮事件有三个事件方法。这三个方法在指定的浏览器或版本使用。

  • Gecko 的传统像素滚动事件:DOMMousescrollMozMousePixelScroll
  • 非 Gecko 浏览器的旧版鼠标滚轮事件:mousewheel
  • 标准事件:wheel

Gecko 是套开放原始码的、以 C++ 编写的网页排版引擎。由 Mozilla 家族网页浏览器以及 Netscape 6 以后版本 浏览器所使用。这软件原本是由网景通讯公司开发的,现在则由 Mozilla 基金会维护。

Gecko 是跨平台的,能在 Microsoft Windows、Linux 和 Mac OS X 等主要操作系统上运行。

Gecko 为第 2 个最流行的排版引擎,仅次于 Trident(用于 Windows 版的 Internet Explorer)。


滚轮事件的兼容性分为两个方向:

  • 火狐浏览器 onmousewheel 和非火狐浏览器 DOMMousescroll
  • 标准 wheel 和非标准滚轮事件 onmousewheel

火狐浏览器 onmousewheel 和非火狐浏览器 DOMMousescroll

火狐浏览器滚轮事件用DOMMousescroll,非火狐浏览器事件使用mousewheel事件。

标准 wheel 和非标准滚轮事件 onmousewheel

非标准事件用mousewheel,标准事件用wheel。标准事件最低支持edge浏览器,如果不考虑IE浏览器,可以直接使用wheel事件来编写日常的需求。

注意: 非标准事件已经被弃用,在未来的浏览器中被删除。

封装滚轮事件兼容函数

function wheel(callback) {
    // 是否火狐浏览器
    if (navigator.userAgent.indexOf("Firefox") == -1) {
        // 非火狐浏览器
        // document.addEventListener 兼容写法。
        // 考虑兼容性,使用了非标准的mousewheel事件
        if (document.attachEvent) {
            document.attachEvent("onmousewheel", fn);
        } else {
            document.addEventListener("mousewheel", fn);
        }
    } else {
        // 火狐浏览器
        document.addEventListener("DOMMouseScroll", fn);
    }

    function fn(ev) {
        var oEvent = ev || event;
        // wheelDelta 非火狐浏览器 向上120 向下-120
        // detail 火狐浏览器 向上-3 向下3
        if (oEvent.wheelDelta) {
            if (oEvent.wheelDelta >= 120) {
                callback && callback(true);
            } else {
                callback && callback(false);
            }
        } else {
            if (oEvent.detail >= 3) {
                callback && callback(false);
            } else {
                callback && callback(true);
            }
        }
    }
}

示例

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title></title>
    </head>
    <body>
        <script>
            function wheel(callback) {
                if (navigator.userAgent.indexOf("Firefox") == -1) {
                    if (document.attachEvent) {
                        document.attachEvent("onmousewheel", fn);
                    } else {
                        document.addEventListener("mousewheel", fn);
                    }
                } else {
                    document.addEventListener("DOMMouseScroll", fn);
                }
                function fn(ev) {
                    var oEvent = ev || event;
                    if (oEvent.wheelDelta) {
                        if (oEvent.wheelDelta >= 120) {
                            callback && callback(true);
                        } else {
                            callback && callback(false);
                        }
                    } else {
                        if (oEvent.detail >= 3) {
                            callback && callback(false);
                        } else {
                            callback && callback(true);
                        }
                    }
                }
            }
    
           // 调用
            wheel(function (bool) {
                console.log(bool);
            });
        </script>
    </body>
</html>