跨浏览器鼠标事件写法

以下兼容性代码实例来自《JavaScript高级程序设计》第三版,测试代码由本人编写:

var EventUtil = {
    // 添加绑定事件
    // 第一个条件兼容dom2级事件,可为同一个事件(如click)添加多个响应函数
    // 第一个条件兼容IE,IE没有事件捕获,只有事件冒泡
    // 第三个条件是dom0级事件,最原始的事件,同一事件只能有一个响应函数
    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;
        }
    },
    // 移除绑定事件,与添加绑定事件相反
    removeHandler: function(element, type, handler) {
        if (element.removeEventListener) {
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent) {
            element.detachEvent('on' + type, handler);
        } else {
            element['on' + type] = null;
        }
    },
    // 获取时间,IE没有event事件对象,只有window.event作为window的属性
    getEvent: function(event) {
        return event ? event : window.event;
    },
    // 获取事件的目标元素,IE的为srcElement
    getTarget: function(event) {
        return event.target || event.srcElement;
    },
    // 禁止默认事件,例如点击链接跳转
    // IE没有此函数接口,但是window.event有一个returnValue属性,将此属性设为false即可达到相同的效果
    preventDefault: function(event) {
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },
    // 禁止事件冒泡和捕获,IE中只能禁止事件冒泡
    // 同上,IE没有此函数接口,但是window.event有一个cancelBubble属性值
    stopPropagation: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    },
    // 获取事件相关的属性,只在mouseover和mouseout事件时此属性的值为相关元素,对于其他事件,此属性值为null
    // IE此属性名为fromElement
    getRelatedTarget: function(event) {
        if (event.relatedTarget) {
            return event.relatedTarget;
        } else if (event.toElement) {
            return event.toElement;
        } else if (event.fromElement) {
            return event.fromElement;
        } else {
            return null;
        }
    },
    // 获取鼠标点击事件的按键
    // IE有比较多可能
    getButton: function(event) {
        if (document.implementation.hasFeature('MouseEvents', '2.0')) {
            return event.button;
        } else {
            switch(event.button) {
                case 0:
                case 1:
                case 3:
                case 5:
                case 7:
                    return 0;
                case 2:
                case 6:
                    return 2;
                case 4:
                    return 1;
            }
        }
    },
    // 判断鼠标滚轮是向上还是向下,往用户方向滑是负值,反之则正值
    getWheelDelta: function(event) {
        if (event.wheelDelta) {
            // 下面的Opera判断还无法确认正确与否,有时间再测试
            if (navigator.userAgent.indexOf('Opera') && window.opera.version < 9.5) {
                return -event.wheelDelta;
            } else {
                return event.wheelDelta;
            }
            // return (client.engine.opera && client.engine.opera < 9.5 ?
            //     -event.wheelDelta : event.wheelDelta);
        } else {
            return -event.detail * 40;
        }
    }
};

测试代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>鼠标事件跨浏览器写法</title>
    <script src="./scripts/compatible.js"></script>
    <style>
        #container {
            width: 300px;
            height: 300px;
        }
    </style>
</head>
<body>
    <div id="container">
        <input id="myButton" type="button" value="click me">
    </div>
    <script>
        var button = document.getElementById('myButton');
        var container = document.getElementById('container');

        var handler = function(event) {
            event = EventUtil.getEvent(event);
            var target,
                relatedElement;
            switch(event.type) {
                case 'click':
                    // 获取目标元素,应为button
                    target = EventUtil.getTarget(event);
                    target.value = 'click me';
                    // 获取鼠标点击的按键
                    alert(EventUtil.getButton(event));
                    break;
                case 'mouseover':
                    target = EventUtil.getTarget(event);
                    target.value = 'mouse over';
                    // 获取相关元素
                    relatedElement = EventUtil.getRelatedTarget(event);
                    relatedElement.style.backgroundColor = 'red';
                    break;
                case 'mouseout':
                    target = EventUtil.getTarget(event);
                    target.value = 'mouse out';
                    // 获取相关元素
                    relatedElement = EventUtil.getRelatedTarget(event);
                    relatedElement.style.backgroundColor = '';
                    break;
            }
        }

        // 添加绑定事件
        EventUtil.addHandler(button, 'click', handler);
        EventUtil.addHandler(button, 'mouseover', handler);
        EventUtil.addHandler(button, 'mouseout', handler);

        // 如果要进行页面的卸载或者对button的父元素更改innerHTML操作
        // 最好为button移除事件
        // 但是要想正确运行上面的绑定事件,那么下面这个先注释
        // 否则会将刚绑定的事件又移除了
        // EventUtil.removeHandler(button, 'click', handler);
        // EventUtil.removeHandler(button, 'mouseover', handler);
        // EventUtil.removeHandler(button, 'mouseout', handler);
        
        function handleMouseWheel(event) {
            event = EventUtil.getEvent(event);
            var delta = EventUtil.getWheelDelta(event);
            if (delta < 0) {
                button.value = 'mouse scroll down';
            } else {
                button.value = 'mouse scroll dowm';
            }
        }

        EventUtil.addHandler(document, 'mousewheel', handleMouseWheel);
    </script>
</body>
</html>

其中,阻止默认事件以及停止事件冒泡函数没有测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值