【问题标题】:mousemove and cross-browser e.whichmousemove 和跨浏览器 e.which
【发布时间】:2012-05-12 10:35:15
【问题描述】:

我需要知道在每个 mousemove 事件上按下了哪个鼠标键,我尝试使用它:

获取鼠标代码:函数(e){ e = e ||窗口.事件; if (!e.which && e.button) { if (e.button & 1) e.which = 1; else if (e.button & 4) e.which = 2; else if (e.button & 2) e.which = 3; }; 返回 e.which; },

但这仅适用于 chrome 和 IE7-8。 IE9 调试器总是说 e.button == 0 和 e.which == 1。经过一些调试后,我发现 IE9 的 window.event 包含正确的值,所以我交换了

e = 窗口事件 || e;

这也适用于 Safari 和 Air,但 Firefox 的 window.event 未定义,而 Opera 在回调参数和 window.event 对象中具有相同的错误值。

【问题讨论】:

  • 你应该使用一个框架来规范这些东西
  • 我在这个应用中实际使用了dojo框架,但是它并不能解决这个问题
  • 好吧,我进一步调试,它看起来像是特定于浏览器或特定于 dojo 的问题,所以我做了一个解决方法:我将它存储在 mousedown 事件中,它在所有浏览器中都运行良好。无论如何,谢谢您的提前。
  • @Tommi - 很高兴你能弄明白。随意发布您自己问题的答案。您也可以将其标记为正确答案(clicking the checkmark

标签: javascript events cross-browser mousemove


【解决方案1】:

我在调查相关问题时正在查看这个问题。原来我的问题是我需要使用单独的函数来处理onclickonmouseover 事件。

我发现在使用 Opera、Safari 和 FireFox 时,当没有单击鼠标按钮时,mousemove 事件对象的“which”属性设置为 1。

【讨论】:

    【解决方案2】:

    虽然这个答案可能有点晚了,但我相信它会对未来的人有所帮助。我在搜索这个跨浏览器功能时偶然发现了这个问题,最初忽略了它。我回来为那些追随我的人提供答案。

    首先,一些知识。我发现这个网站很有帮助,因为所有跨浏览器问题(大部分)都已解决,并为您提供娱乐(当我们开发人员需要创建图表来了解浏览器的工作方式时,我会笑..)

    http://unixpapa.com/js/mouse.html

    在此页面的底部附近,您会找到一个蓝色链接,上面写着“使用各种鼠标按钮单击此处进行测试”,在此上方您将看到一个代码 sn-p。这将进入您的 mousedown 或 mouseup。如果您右键单击并查看此位置的源代码,您会发现一个包含 2 个函数的脚本标签,即此链接上方的一个函数,以及一个“不”函数,该函数可防止事件执行默认或失败,尽管不是在所有情况下都需要,了解一下很有用。

    第二条知识来自另一个网站,为我们提供了一些关于如何捕捉鼠标滚轮向上和向下事件的见解。

    http://www.javascriptkit.com/javatutors/onmousewheel.shtml

    为了将这一切放在一个地方,我们基本上有以下内容..

    function GetMouseButton(e) {
        // Normalize event variable
        var e = window.event || e;
        // Set button to initially not recognized (or false if you need to to be)
        var button = 'Not Recognized';
    
        // Check if this is a button push event
        if(e.type == 'mousedown' || e.type == 'mouseup') {
            if (e.which == null) {
                // Check if IE, if so, what e.button was pressed
                button = (e.button < 2) ? "Left" :
                    ((e.button == 4) ? "Middle" : "Right");
            } else {
                // All other browsers, what e.which was pressed
                button = (e.which < 2) ? "Left" :
                    ((e.which == 2) ? "Middle" : "Right");
            }
        } else {
            // If this is not a button push event, then we get the direction
            var direction = e.detail ? e.detail * (-120) : e.wheelDelta;
            // And name the direction as a 'button'
            switch(direction) {
                case 120: // Browsers use different variants of these
                case 240: 
                case 360: 
                    button = "Middle Scroll Up";
                break;
                case -120:
                case -240:
                case -360:
                    button = "Middle Scroll Down";
                break;
            }
        }
    
        alert(button);
    }
    
    /* Simple Bind function (like jQuery's for example) */
    function Bind(elem, type, eventHandle) {
        if (elem == null || elem == undefined) return;
        if ( elem.addEventListener ) {
            elem.addEventListener( type, eventHandle, false );
        } else if ( elem.attachEvent ) {
            elem.attachEvent( "on" + type, eventHandle );
        } else {
            elem["on"+type]=eventHandle;
        }
    }
    
    /* Bind your mousedown / mouseup to the window, as well as the mousewheel */
    Bind(window, 'mousedown', GetMouseButton);
    Bind(window, 'mouseup', GetMouseButton);
    
    /* One of FireFox's browser versions doesn't recognize mousewheel,
     * we account for that in this line
     */
    var MouseWheelEvent = 
    (/Firefox/i.test(navigator.userAgent))? "DOMMouseScroll" : "mousewheel";
    
    Bind(window, MouseWheelEvent, GetMouseButton);
    

    为了节省您一些时间 [和知识,如果您不想查看这些链接],您可以在以下 jsfiddle 中查看一个工作示例:

    http://jsfiddle.net/BNefn/

    编辑 我还应该说,由于您需要在每个 mousemove 事件上都知道这一点,您可以简单地存储生成的按钮“名称”和事件类型(向下或向上),然后在 mousemove 事件期间调用变量信息。如果这些“按钮”中的每一个都有一个变量,那么您可以查看哪个按钮被按下,哪个按钮没有被按下,并清除在 mouseup 上按下的变量。

    【讨论】:

    • 问题是mousemove。存储 mousedown 和 mouseup 事件并非在所有情况下都有效(例如,鼠标向上发生在窗口外)。
    • @panta82,这是人们会自动假设的,因为您无法捕获窗口外的任何事件。曾经。但是,如果您愿意,您可以轻松地假设鼠标离开窗口时发生鼠标向上,并在该点手动触发鼠标向上事件。无论哪种方式,都不能假设任何事件都会在视口之外被捕获。
    猜你喜欢
    • 2012-02-24
    • 2012-04-24
    • 2014-08-06
    • 2010-12-21
    • 2011-11-15
    • 2011-06-08
    • 2011-03-03
    • 2012-09-30
    • 2013-05-12
    相关资源
    最近更新 更多