首页 » JavaScript » 鼠标按钮button属性

鼠标按钮button属性

只有在主鼠标按钮被单击时才会触发click事件,因此检测按钮的信息并不是必要的。但对于mousedown和mouseup事件来说,则在其event对象存在一个button属性,表示按下或释放的按钮。DOM的button属性可能有如下3个值:0表示鼠标按钮,1表示中间的鼠标按钮(鼠标滚轮按钮),2表示次鼠标按钮。在常规设置中,主鼠标按钮就是鼠标左键,而次鼠标按钮就是鼠标左键。

IE也提供了button属性,但这个属性的值与DOM的button属性有很大的差异。

  • 0:表示是没有按下按钮
  • 1:表示按下了鼠标按钮
  • 2:表示按下了次鼠标按钮
  • 3:表示同时按下了主、次鼠标按钮
  • 4:表示按下了中间的鼠标按钮
  • 5:表示同时按下了主鼠标按钮和中间的鼠标按钮
  • 6:表示同时按下了次鼠标按钮和中间的鼠标按钮
  • 7:表示同时按下了三个鼠标按钮

DOM模型下的button属性比IE模型下的button属性更简单也更为实用,因为同时按下多个鼠标按钮的情形十分罕见。最常见的做法就是将IE模型规范化为DOM方式,毕竟除IE之外的其它浏览器都原生支持DOM模型。而对主、中、次按钮的映射并不困难,只要将IE的其它选项分别转换成如同按下这三个按钮中的一个即可(同时将住按钮作为优先选取的对象)。换句话说IE中返回的5和7会被转换成DOM模型中的0.

由于单独使用能力检测无法确定差异,因此必须另辟蹊径。我们知道,支持DOM版鼠标事件的浏览器可以通过hasFearture()方法来检测,所以可以再为EventUtil对象添加如下getButton()方法:

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;
        }
    },
    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;
            }
        }
    }
};
var div = document.getElementById("myDiv");
EventUtil.addHandler(div, "mousedown", function (event) {
    event = EventUtil.getEvent(event);
    alert(EventUtil.getButton(event));
});

通过检测“MouseEvents”这个特性,就可以确定event对象中存在的button属性中是否包含正确的值。如果测试失败,说明是IE,就必须对相应的值进行规范化。

在这个例子中,我们为一个<div>元素添加了一个onmousedown事件处理程序。当在这个元素上按下鼠标按钮时,会有警告框显示按钮的代码。

在使用onmouseup事件处理程序时,button的值表示释放的是那个按钮。此外,如果不是按下或释放了主鼠标按钮,Opera不会触发mouseup或mousedown事件。

此文章发表在 JavaScript. 将 固定链接 加入收藏.