[面试专题]JS事件模型

news/2024/7/5 3:52:13

JS事件模型


事件模型以及周边

  • 事件捕获

  • 事件冒泡

  • 事件触发

  • 移动端事件模拟

  • 事件委托


事件流

事件捕获(event capturing)&事件冒泡(event bubbling)

<div class="out">
    <p class="inner"></p>
</div>

给inner,out均绑定点击事件.点击inner,如果out先执行,inner后执行.则是事件捕获.若inner先执行.out后执行则是事件冒泡.(这两种模型来自于早期浏览器之争)

W3C模型

先事件捕获,到达目标后再进行冒泡

示例演示

out.addEventListener('click', (e) => {
   console.log('out clicked! ')
}, true)
inner.addEventListener('click', (e) => {
    console.log('inner clicked! ')
}, false)
document.addEventListener('click', (e) => {
    console.log('document clicked! ')
}, true)
点击inner后,执行顺序:document clicked => out clicked => inner clicked
out.addEventListener('click', (e) => {
   console.log('out clicked! ')
}, true)
inner.addEventListener('click', (e) => {
    console.log('inner clicked! ')
}, false)
document.addEventListener('click', (e) => {
    console.log('document clicked! ')
}, false)
点击inner后,执行顺序: out clicked => inner clicked => document clicked

事件模型

1.DOM0级事件(默认发生在冒泡阶段.只能绑定一个事件)

事件绑定

 ele.onclick = function (){
     //
 }

事件解除绑定

ele.onclick = null;

2.DOM2级事件(默认发生在冒泡阶段,由第三个参数决定,可绑定多个事件)

事件绑定

ele.addEventListener(eventType, handler, useCapture)//eventType不带on,如click
//IE下用attachEvent
ele.attachEvent(eventType, handler);

事件解除绑定

ele.removeEventListener(eventType, handler, useCapture)
//IE下使用detachEvent
ele.detachEvent(eventType, handler);

事件对象

DOM事件模型中的事件对象常用属性:

  • type用于获取事件类型

  • target获取事件目标

  • stopPropagation()阻止事件冒泡

  • preventDefault()阻止事件默认行为

IE事件模型中的事件对象常用属性:

  • srcElement获取事件目标

  • cancelBubble阻止事件冒泡

  • returnValue阻止事件默认行为

兼容处理

var eventUtil = {
    addEvent: function(ele, event, func, bool) {
        bool = bool || false;
        if (ele.addEventListener) {
            ele.addEventListener(event, func, bool)
        } else {
            ele.attachEvent('on' + event, func, bool);
        }
    },
    removeEvent: function(ele, event, func, bool) {
        bool = bool || false;
        if (ele.removeEventListener) {
            ele.removeEventListener(event, func, bool);
        } else {
            ele.detachEvent('on' + event, func, bool);
        }
    },
    getEvent: function(event) {
        return event || window.event;
    },
    getTarget: function(event) {
        return event.target || event.srcElement;
    },
    preventDefault:function (event) {
         if (event.preventDefault) {
            event.preventDefault();
         }else {
             event.returnValue = false;//IE
         }
    },
    stopPropagation:function  (event) {
         if (event.stopPropagation) {
            event.stopPropagation();
         } else {
             event.cancelBubble = true;//IE
         }
    }
};

移动端事件

Touch事件

touchstart:当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发。
touchmove:当手指在屏幕上滑动时连续的触发。在这个事件发生期间,调用preventDefault()可阻止滚动

touchend:当手指从屏幕上移开时触发。
touchcancel:当系统停止跟踪触摸时触发。关于此事件的确切触发事件,文档中没有明确说明。
以上事件的event对象上面都存在如下属性:
touches:表示当前跟踪的触摸操作的Touch对象的数组。
targetTouches:特定于事件目标的Touch对象的数组。
changeTouches:表示自上次触摸以来发生了什么改变的Touch对象的数组。

  • 每个Touch对象包含下列属性:
    identifier:表示触摸的唯一ID。

clientX:触摸目标在视口中的X坐标。
clientY:触摸目标在视口中的Y坐标。
pageX:触摸目标在页面中的x坐标。
pageY:触摸目标在页面中的y坐标。
screenX:触摸目标在屏幕中的x坐标。
screenY:触摸目标在屏幕中的y坐标。
target:触摸的DOM节点坐标

触发过程

touchstart =>touchmove =>touchend =>click(延迟300~200ms)
  • Tap事件封装原理:利用touchstart =>touchmove =>touchen模拟click

HTMLElement.prototype.tap = function (handler,interval) {
     that = this
     this.isMove = false,
     this.startTime = 0,
     this.addEventListener('touchstart',function(e){
            startTime = Date.now();
        }),
     this.addEventListener('touchmove',function(e){
            isMove = true;
        }),
     this.addEventListener('touchend',function(e){
            if(!this.isMove && (Date.now()-startTime) < interval){
                handler();
            }
            this.isMove = false;
            this.startTime = 0;
        })
};

事件委托

把本应绑定在自身的事件绑定到其他元素上来触发即事件委托

//HTML
<ul id="ul">
    <li>a</li>
    <li>b</li>
</ul>

//JS
    var oUl = document.getElementById("ul");
    oUl.onmouseover = function(ev){
        var ev = ev || window.event;
        var target = ev.target || ev.srcElement;
        if((/l\i/i).test(target.nodeName)){
        target.style.background = "red";
        }
    }
    oUl.onmouseout = function(ev){
        var ev = ev || window.event;
        var target = ev.target || ev.srcElement;
        if((/l\i/i).test(target.nodeName)){
             target.style.background = "";
        }
    }
//JS

http://www.niftyadmin.cn/n/2709608.html

相关文章

Linux常用命令 用法总结(sort,find,tar,ln,chmod,chown)

Linux实验课的内容&#xff0c;正好有些命令忘了&#xff0c;写篇文章总结一下用法。 本文承接于之前写的这篇文章&#xff1a;从零开始学Linux【Linux常用的基本命令&&文件通配符】 运行环境&#xff1a;CentOS 7 文章目录&#xff08;一&#xff09;sort命令&#…

Shiro INI 配置

之前章节我们已经接触过一些 INI 配置规则了&#xff0c;如果大家使用过如 Spring 之类的 IoC/DI 容器的话&#xff0c;Shiro 提供的 INI 配置也是非常类似的&#xff0c;即可以理解为是一个 IoC/DI 容器&#xff0c;但是区别在于它从一个根对象 securityManager 开始。 根对象…

【js 闭包】

越来越觉得国内没有教书育人的氛围&#xff0c;为了弄懂JS的闭包&#xff0c;我使出了我英语四级吃奶的劲去google上搜寻着有关闭包的解释&#xff0c;当我看到stackoverflow上这一篇解答&#xff0c;我脑中就出现了一句话&#xff1a;就是这货没跑了&#xff01;  不才译文见…

Linux shell脚本编程【条件判断、循环、函数】

可以看看这篇文章了解shell中的一些变量&#xff1a;Shell脚本中$0、$?、$!、$$、$*、$#、$ $$ Shell本身的PID&#xff08;ProcessID&#xff09;$! Shell最后运行的后台Process的PID$? 最后运行的命令的结束代码&#xff08;返回值&#xff09;$- 使用Set命令设定的Flag一览…

BZOJ 2957: 楼房重建 (分块)

2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1742 Solved: 833[Submit][Status][Discuss]Description 小A的楼房外有一大片施工工地&#xff0c;工地上有N栋待建的楼房。每天&#xff0c;这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆&…

Linux 用户与用户组管理(useradd,usermod,userdel,newusers,groupadd,groupdel)

运行环境&#xff1a;CentOS 7 以下命令均在root用户下执行。 一、用户管理命令&#xff1a;useradd&#xff0c;usermod&#xff0c;userdel&#xff0c;newusers &#xff08;1&#xff09;创建一个用户名 jone 描述信息为 jone 用户组为 jerry 登陆 shell 为/bin/sh 登陆…

Linux sed命令,awk命令【基本用法以及shell编程】

grep 、sed、awk被称为linux中的"三剑客"。 总结一下这三个"剑客"的特长。 grep 更适合单纯的查找或匹配文本 sed 更适合编辑匹配到的文本 awk 更适合格式化文本&#xff0c;对文本进行较复杂格式处理 参考&#xff1a;awk从放弃到入门&#xff08;1&#…

JVM调优——之CMS 常见参数解析

最近在学习使用CMS这个GC,这里记录下常用的参数。 1. UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 有一点需要注意的是&#xff1a;CMS并发GC不是“full GC”。HotSpot VM里对concurrent collection和full collection有明确的区分。所有带有“FullCollection…