将IE event.button转换为W3C event.button

时间:2010-02-16 15:23:39

标签: javascript internet-explorer events w3c

在鼠标按下(和向上)我需要检查哪个鼠标按钮已改变其状态。使用W3C模型甚至是旧的netscape方式(event.which)这很容易,但IE让我很头疼。我知道IE中的event.button是一个位掩码,但问题是我无法找到从这个位掩码中按下的按钮。如果IE给了我event.button == 3那么我无法判断用户是否在右按钮已经按下时按下了左按钮,或者当左按钮已经按下时用户按下了右按钮。

一劳永逸地解决这个问题我正在寻找一个很好的通用解决方案来将破坏的IE事件转换为W3C兼容事件。也许有人已经这样做并想分享?

3 个答案:

答案 0 :(得分:3)

您可能会发现此页面非常有用:http://unixpapa.com/js/mouse.html。它有一个关于鼠标按钮检测的部分,我之前使用过,发现有用且准确,包括以下内容:

  

虽然没有与浏览器无关的   识别哪个鼠标按钮的方法   对于所有被调查的浏览器,   你可以非常接近。该   以下测试适用于所有浏览器   除了Opera 7.(它混合了右边   Opera 7中的鼠标和鼠标中键   但Opera 7很老了,有   只有少数版本的权利   和中间按钮甚至工作,和   然后只有当用户设置一个模糊   选项,所以你真的不在乎。)它   也没有正确处理   同时点击多个鼠标   IE中的按钮。要做到这一点你的   应用程序需要跟踪哪些   据报道,这些按钮正在下降   以前的mousedown事件,所以它可以   弄清楚添加了哪一个。

if (event.which == null)
   /* IE case */
   button= (event.button < 2) ? "LEFT" :
             ((event.button == 4) ? "MIDDLE" : "RIGHT");
else
   /* All others */
   button= (event.which < 2) ? "LEFT" :
             ((event.which == 2) ? "MIDDLE" : "RIGHT");

答案 1 :(得分:3)

IMO(和quirksmode's),IE的位掩码优于W3C版本,因为您可以检测组合点击,如左+右或中+左。它提供了更多的灵活性。两者(按下总按钮和按下最新按钮)会更好。

我不知道某个库或脚本已经完成了你想要做的事情,我认为大多数开发人员会忽略组合点击,除非他们想要对组合点击应用特定的操作。此外,它相当棘手,您必须检测整个文档的onmousedownonmouseup并记录鼠标按钮的状态。然后在你想要开启魔法的元素上,从新的鼠标状态中减去之前的鼠标状态。像(测试过)的东西:

if (document.attachEvent)
{
    (function ()
    {
        var mState = 0;
        document.documentElement.attachEvent("onmousedown", function () 
        {
            mState += event.button;
        });
        document.documentElement.attachEvent("onmouseup", function () 
        {
            mState -= event.button;
        });
        document.getElementById("jim").attachEvent("onmousedown", function ()
        {
            var realButton = event.button - mState;

            alert(realButton); 
            // Your code here
        });
    })();
}

当然,这个脚本只有大约一百万个可能出错的东西。例如,在我的例子中,我有一个弹出真实按钮状态的警告窗口。如果在该警报对话框启动时释放按钮,则文档将不会检测到鼠标,并且它会使所有内容失效。同样,停止传播到documentElement的事件处理程序的其他元素上的任何mouseup或mousedown事件都会导致它中断。

如果您需要我的建议,请在组合鼠标单击时显示消息,猜测“正确”鼠标按钮或一起忽略它们。这些选项中的任何一个都比hacky方法更好。

答案 2 :(得分:-2)

这篇文章可能有所帮助:

How to equalize the IE and W3C event models