对于mousedown和mouseup来说,其event对象中存有一个button属性,表示按下或释放的按钮。DOM中属性有3个值:0表示主鼠标按钮,1表示中间的鼠标按钮,2表示次鼠标按钮(右键)。
但是对于IE8及之前的版本来说,button中所存的值又是不同的:
0:表示没有按下鼠标按钮
1:表示按下主鼠标按钮
2:表示按下次鼠标按钮
3:表示同时按下主次鼠标按钮
4:表示按下了中间的鼠标按钮
5:表示同时按下了主鼠标按钮和中间鼠标按钮
6:表示同时按下了中间和次鼠标按钮
7:表示同时按下主,中间,次鼠标按钮
可以发现,这些button属性和DOM中规定的相比复杂了许多,但是有很多都是不必要的。在通常情况下,同时按下两个及以上的鼠标按钮时很少见的,所以只要判断成其中一个就可以了。对于跨浏览器检测来说,通过映射来使返回的行为一致是很有必要的。在映射中,把主鼠标按钮作为优先选择,即在按下多个键是选用主键,其次是右键。
由于两个属性都位于button,传统的直接检测button是否存在方法就会出现问题。这边使用了一个hasFeature。因为支持DOM规定的button的话,hasFeature(\'MouseEvents\',\'2.0)返回的就应该是true。所以我们就可以使用hasFeature来检测。
1 function getMouseButton(event){ 2 if(document.implementation.hasFeature(\'MouseEvents\',\'2.0\')){ 3 return event.button; 4 }else{ 5 switch(event.button){ 6 case 0: 7 case 1: 8 case 3: 9 case 5: 10 case 7: 11 return 0; 12 break; 13 case 2: 14 case 6: 15 return 2; 16 break; 17 case 4: 18 return 1; 19 break; 20 } 21 } 22 }