zoukankan      html  css  js  c++  java
  • javascript事件之鼠标滚轮(mousewheel)和DOMMouseScroll事件

    javascript事件之鼠标滚轮(mousewheel)和DOMMouseScroll事件

    发布时间:2015-02-07   编辑:www.jquerycn.cn
    本文学习下,javascript中的鼠标滚轮(mousewheel)和DOMMouseScroll事件的用法,通过具体的实例来作深入的讲解,供大家学习参考。
     

    本节介绍javascript中的鼠标滚轮(mousewheel)和DOMMouseScroll事件的用法。

    IE6.0首先实现了mousewheel事件。此后,Opera、Chrome和Safari也都实现了这个事件。当用户通过鼠标滚轮与页面交互、在垂直方向上滚动页面时(无论向下还是向上),就会触发mousewheel事件。这个事件可以在任何元素上面触发,最终会冒泡到document(IE)或window(Opera、Chrome、及Safari)对象。

    与mousewheel事件对应的event对象包含鼠标事件的所有标准信息之外,还包含一个特殊的wheelDelta属性。
    当用于向前滚动鼠标滚轮是,wheelDelta是120的倍数;当用户向后滚动鼠标滚轮是,wheelDelta是-120的倍数。
    将mousewheel事件处理程序指定给页面中的任何元素或document对象,即可以处理鼠标滚轮的交互操作。

    例子
     

    复制代码代码示例:
    Event.addHnadler(document, "mousewheel", function (event) {
        event = EventUtil.getEvent(event);
        alert(event.wheelDelta);
    });

    这个例子会在发生mousewheel事件时显示wheelDelta的值。
    多数情况下,只要知道鼠标滚轮滚动的方向就够了,而这通过检测wheelDelta的正负号就可以确定。
    在Opera9.5之前的版本中,wheelDelta的值的正负号是颠倒的。
    如果你打算支持早期的Opera版本,就需要使用浏览器检测技术来确定实际的值。

    例子:
     

    复制代码代码示例:
    EventUtil.addHandler(document, "mousewheel", function () {
        event = EventUtil.getEvent(event);
        var delta = (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta);
        alert(delta);
    });

    Firefox支持一个名为DOMMouseScroll的类似事件,也是在鼠标滚动时触发。与mousewheel事件一样,DOMMouseScroll也被视为鼠标事件,因而包含与鼠标事件有关的所有属性。
    而有关鼠标滚轮的信息则保存在detail属性中,当向前滚动鼠标滚轮时,这个属性的值是-3的倍数,当向后滚动鼠标滚轮时,这个属性的值是3的倍数。

    可以将DOMMouseScroll事件天骄到页面中的任何元素,而且该事件会冒泡的window对象。

    因此,可以像下面这样针对这个事件添加事件处理程序:
     

    复制代码代码示例:
    EventUtil.addHandler(window, "DOMMouseScroll", function (event) {
        event = EventUtil.getEvent(event);
        alert(event.detail);
    })

    这个简单的事件处理程序会在鼠标滚轮滚动时显示detail属性的值。
    若要给出跨浏览器的解决方案,第一步就是创建一个能够取得鼠标滚轮增量值(delta)的方法。

    添加到EventUtil对象中的这个方法:
     

    复制代码代码示例:
    var EventUtil = {
        getWheelDelta: function (event) {
            if (event.wheelDelta) {
                return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta);
            } else {
                return -event.detail * 40;
            }
        }
    };

    这里,getWheelDelta()方法首先检测了事件对象是否包含wheelDelta属性,如果是则通过浏览器检测代码确定正确的值。
    如果wheelDelta不存在,则假设相应的值保存在detail属性中。由于Firefox的值有所不同,因此首先要将这个值的符号反向,然后再乘以40,就可以保证与其它浏览器的值相同了。
    有此方法之后,就可以将相同的事件处理程序指定给mousewheel和DOMMouseScroll事件了,例如:
     

    复制代码代码示例:
    (function(){
        function handleMouseWheel(event) {
            event = EventUtil.getEvent(event);
            var delta = EventUtil.getWheelDelta(event);
            alert(delta);
        }
        EventUtil.addHandler(document, "mousewheel", handleMouseWheel);
        EventUtil.addHandler(document, "DOMMouseScroll", handleMouseWheel);
    })();

    一个跨浏览器环境下的解决方案:
     

    复制代码代码示例:

    var client = function () {
            var engine = {
                //呈现引擎
                ie: 0,
                gecko: 0,
                webkit: 0,
                khtml: 0,
                opera: 0,
                //具体版本号
                ver: null
            };
            return {
                engine: engine
            };
        }();
    var EventUtil = {
        getEvent: function (event) {
            return event ? event : window.event;
        },
        addHandler: function (element, type, handler) {
            if (element.addEventListener) {
                element.addEventListener(type, handler, false);
            } else if (element.attachEvent) {
                element.attachEvent("on" + type, handler);
            } else {
                element["on" + type] = handler;
            }
        },
        getWheelDelta: function (event) {
            if (event.wheelDelta) {
                return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta);
            } else {
                return -event.detail * 40;
            }
        }
    };

    (function(){
        function handleMouseWheel(event) {
            event = EventUtil.getEvent(event);
            var delta = EventUtil.getWheelDelta(event);
            alert(delta);
        }
        EventUtil.addHandler(document, "mousewheel", handleMouseWheel);
        EventUtil.addHandler(document, "DOMMouseScroll", handleMouseWheel);
    })();

    在iPhone和iPodTouch中,如果两个手指同时放在屏幕上,而且页面因手指移动而滚动,也会触发mousewheel事件。

    https://www.tongbiao.xyz/
  • 相关阅读:
    JS-鼠标经过显示二级菜单
    CSS-论css如何纯代码实现内凹圆角
    JS-制作可伸缩的水平菜单栏
    CSS-混合布局的几种方法(正确的方法和错误的原因)
    JS-选项卡制作解释部分
    JS-制作网页特效——选项卡效果(水平,点击)
    JS-DOM 综合练习-动态添加删除班级成绩表
    JS-DOM对象知识点汇总(慕课)
    JS-window对象集合
    JS-节点属性(常用!)
  • 原文地址:https://www.cnblogs.com/tongbiao/p/6588086.html
Copyright © 2011-2022 走看看