• home > webfront > ECMAS > javascript >

    JavaScript鼠标事件细讲:执行顺序+注意事项+区别比对

    Author:[email protected] Date:

    mouseover和mouseenter的异同体现,​事件的触发时机。基本类型 (primitive values) 与引用类型 (reference values) 赋值与比较,需要注意的地方是对于JS对象,因为是引用地址,不同变量实际引用的是统一个值

    在 JavaScript 中,鼠标事件是 Web 开发中最常用的事件类型,本篇算是笔记吧。

    鼠标事件:

    在DOM2.0中,W3C对鼠标事件作了现范,鼠标事件被解析为MouseEvent(我们可以用e.constructor == MouseEvent来判断其是否为鼠标事件。

    常见的鼠标事件有

    • click:单击鼠标左键时发生。当用户的焦点在按钮上并按了 Enter 键时,同样会触发这个事

    • dblclick:双击鼠标左键时发生,如果右键也按下则不会发生

    • contextmenu :弹出右键菜单。

    • focus:获取焦点

    • blur:失去焦点

    • mouse事件

    click、dblclick 没有什么好讲的,contextmenu用的也不多讲。重点讲下mouse事件。

    focus跟blur不是鼠标事件,但是也是由鼠标触发。focus跟blur的 e.constructor 为FocusEvent

    Mouse事件

    Mouse事件有7种,分别是:

    • mouseup:鼠标在元素上松开时触发 mouseup 事件。与 click 不同,只要鼠标在元素上松开即触发(左右键都行)。

    • mousedown:鼠标在元素上并按下时触发 mousedown 事件。与 click 不同,只要鼠标在元素上按下即触发(左右键都行)。

    • mouseover:当鼠标位于元素上时触发 mouseover 事件,通常与 mouseout 配合使用。

    • mouseenter:当鼠标位于元素上时触发 mouseenter 事件,通常与 mouseleave 配合使用。

    • mousemove:鼠标在元素上移动时触发 moudemove 事件。

    • mouseout:鼠标在元素上移开时触发 mouseout 事件。

    • mouseleave:鼠标在元素上移开时触发 mouseleave 事件。

    mouseenter/mouseover

    • mouseover(鼠标覆盖):当鼠标移入元素或其子元素都会触发事件,所以有一个重复触发,冒泡过程。对应的移除事件是mouseout

    • mouseenter(鼠标进入):当鼠标移入元素本身(不包含元素的子元素)会触发事件,也就是不会冒泡,对应的移除事件是mouseleave

    mouseenter/mouseover区别点:

    • mouseenter不会冒泡,简单的说,它不会被它本身的子元素的状态影响到.

    • mouseover就会被它的子元素影响到,在触发子元素的时候,mouseover会冒泡触发它的父元素.(想要阻止mouseover的冒泡事件就用mouseenter)

    mouseenter/mouseover共同点:

    当二者都没有子元素时,二者的行为是一致的,但是二者内部都包含子元素时,行为就不同了.

    总结就是:

    mouseover和mouseenter的异同体现在两个方面:

    • 是否支持冒泡

    • 事件的触发时机

    浏览器UI时间MouseOver时间触发机制分解

    可见mouseover事件因其具有冒泡的性质,在子元素内移动的时候,频繁被触发,如果我们不希望如此,可以使用mouseenter事件代替之,但是早期只有ie浏览器支持该事件。

    结合其对称事件, mouseleave, mouseenter DOM事件的行为方式与CSS  :hover 伪类非常相似

    还有就是:mouseover先触发,mouseenter 后触发。离开时,却是 mouseout 先触发,mouseleave后触发

    鼠标事件执行顺序

    下来看下面代码

    <html>
    <head>
        <title>dsafsa</title>
    </head>
    <body>
        <input id="test" style="width: 100px;height: 100px;border: 1px solid #ccc;"></input>
        <script>
        let test = document.getElementById('test')
        test.addEventListener('mousedown',()=>console.log('mousedown'))
        test.addEventListener('mouseover',()=>console.log('mouseover'))
        test.addEventListener('mouseenter',()=>console.log('mouseenter'))
        test.addEventListener('mouseup',()=>console.log('mouseup'))
        test.addEventListener('focus',()=>console.log('focus'))
        test.addEventListener('blur',()=>console.log('blur'))
        test.addEventListener('mousemove',()=>console.log('mousemove'))
        test.addEventListener('mouseleave',()=>console.log('mouseleave'))
        test.addEventListener('mouseout',()=>console.log('mouseout'))
        test.addEventListener('click',()=>console.log('click'))
        test.addEventListener('touchstart',()=>console.log('touchstart'))
        test.addEventListener('touchmove',()=>console.log('touchmove'))
        test.addEventListener('touchend',()=>console.log('touchend'))
        </script>
    </body>
    </html>

    看看结果如何

    PC端

    打印顺序为:

    mouseover-》mouseenter-》mousemove-》-》mousedown-》focus-》-》mouseup-》click-》mousemove-》mouseout-》mouseleave-》blur

    移动端:

    tochstart -》touchend-》click

    这个是普通html元素。但是如果是input呢?

    需要注意的是:移动端,普通元素是不会触发 focus 与blur的,只有表单元素才会触发,如input输入框

    执行顺序是 tochstart -》touchend-》-》mousedown-》focus-》mouseup-》click-》blur

    mousedown、mouseup、click

    • 若在同一个元素上按下并松开鼠标左键,会依次触发mousedown、mouseup、click,前一个事件执行完毕才会执行下一个事件

    • 若在同一个元素上按下并松开鼠标右键,会依次触发mousedown、mouseup,前一个事件执行完毕才会执行下一个事件,不会触发click事件

    鼠标按键

    mousedown左右键按操按下均可触发,那么怎么区分左右键呢?

    是左键点击还是右键点击由它的一个叫button的属性判定。以下就是W3C的标准现范:

    1. 按下左键

    2. 按下中键

    3. 按下右键

    当然微软是不会妥协的,因为e.button本来就是微软最先实现的,网景用的是e.which,但相对而言,微软的复杂多了。

    • 0:没有键被按下

    • 1:按下左键

    • 2:按下右键

    • 3:左键与右键同时被按下

    • 4:按下中键

    • 5:左键与中键同时被按下

    • 6:中键与右键同时被按下

    • 7:三个键同时被按下


    参考文章:

    JS鼠标事件(非常详细) http://c.biancheng.net/view/5944.html

    mouseover和mouseenter的区别 https://www.cnblogs.com/psxiao/p/11543333.html

    javascript 鼠标事件总结 https://www.cnblogs.com/rubylouvre/archive/2009/08/24/1552862.html


    转载本站文章《JavaScript鼠标事件细讲:执行顺序+注意事项+区别比对》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js/2016_0106_384.html