【博学谷学习记录】超强总结,用心分享|WebAPI编程(三)

发布于:2022-12-29 ⋅ 阅读:(475) ⋅ 点赞:(0)

目录

事件高级

注册事件

事件监听

删除事件

DOM事件流

事件对象

事件委托

鼠标事件对象

键盘事件对象


事件高级

注册事件

       给元素添加事件称为注册事件或者绑定事件。

事件监听

       addElementListener()

       eventTarget.addEventListener(type,listener[,useCapture])

       eventTarget.addEventListener()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。

参数:type:世界类型字符串,比如click,mouseover注意这里不要带on。

          listener:时间处理函数事件发生时会调用该监听函数。

          useCapture:可选参数是一个布尔值,默认是false。

       attacheEvent()

       eventTarget.attachEvent(eventNameWithOn,callback)

       eventTarget.attachEvent()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,指定的毁掉函数就会被执行。

参数:eventNameWithOn:事件类型字符串,比如onclick,onmouseover这里要带on。

          callback:事件处理函数,当目标触发事件时,回调函数被调用。

<button>传统注册事件</button>
<button>方法监听注册事件</button>
<button>ie9 attachEvent</button>
<script>
    var btns = document.querySelectorAll('button');
    // 1. 传统方式注册事件
    btns[0].onclick = function () {
        alert('hi');
    }
    btns[0].onclick = function () {
        alert('hao a u');
    }
    // 2. 事件侦听注册事件 addEventListener 
    // (1) 里面的事件类型是字符串 必定加引号 而且不带on
    // (2) 同一个元素 同一个事件可以添加多个侦听器(事件处理程序)
    btns[1].addEventListener('click', function () {
        alert(22);
    })
    btns[1].addEventListener('click', function () {
        alert(33);
    })
    // 3. attachEvent ie9以前的版本支持
    btns[2].attachEvent('onclick', function () {
        alert(11);
    })
</script>

删除事件

       eventTarget.removeWventListener(type,listener[,useCapture])

       eventTarget.datachEvent(eventNameWithOn,callback)

<div>aaa</div>
<div>bbb</div>
<div>ccc</div>
<script>
    var divs = document.querySelectorAll('div');
    divs[0].onclick = function () {
        alert(11);
        // 1. 传统方式删除事件
        divs[0].onclick = null;
    }
    // 2. removeEventListener 删除事件
    divs[1].addEventListener('click', fn) // 里面的fn 不需要调用加小括号
    function fn() {
        alert(22);
        divs[1].removeEventListener('click', fn);
    }
    // 3. detachEvent
    divs[2].attachEvent('onclick', fn1);
    function fn1() {
        alert(33);
        divs[2].detachEvent('onclick', fn1);
    }
</script>

DOM事件流

       HTML中的标签都是相互嵌套的,我们可以将元素想象成一个盒子装一个盒子,document是最外面的大盒子,当你点击一个div时,同时你也点击了div的父元素,甚至整个页面。

       事件流描述的是从页面中接收事件的顺序,事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程及DOM事件流。

事件冒泡

       IE最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到最顶层节点的过程。

事件捕获

       网景最早提出,由最顶层节点开始,然后逐级向下传播到最具体的素接收的过程。

<div class="father">
    <div class="son">son盒子</div>
</div>
<script>
    // DOM 事件流 三个阶段
    // 1. JS 代码中只能执行捕获或者冒泡其中的一个阶段。
    // 2. onclick 和 attachEvent(ie) 只能得到冒泡阶段。
    // 3. 捕获阶段 如果addEventListener 第三个参数是 true 那么则处于捕获阶段  document -> html -> body -> father -> son
    // var son = document.querySelector('.son');
    // son.addEventListener('click', function() {
    //     alert('son');
    // }, true);
    // var father = document.querySelector('.father');
    // father.addEventListener('click', function() {
    //     alert('father');
    // }, true);
    // 4. 冒泡阶段 如果addEventListener 第三个参数是 false 或者 省略 那么则处于冒泡阶段  son -> father ->body -> html -> document
    var son = document.querySelector('.son');
    son.addEventListener('click', function() {
        alert('son');
    }, false);
    var father = document.querySelector('.father');
    father.addEventListener('click', function() {
        alert('father');
    }, false);
    document.addEventListener('click', function() {
        alert('document');
    })
</script>

事件对象

       事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象。

       事件触发发生时就会产生事件对象,并且系统会以13的形式传给事件处理函数。所以在事件处理函数中声明一个形参用来接收事件对象。

事件对象的属性和方法

事件对象属性方法 说明
e.targrt 返回触发事件的对象(标准)
e.srcElement 返回触发事件的对象(非标准 ie6-8使用)
e.type 返回事件的类型
e.cancelBubble 该属性阻止冒泡(非标准 ie6-8使用)
e.returnValue 该属性阻止默认事件(非标准 ie6-8使用)
e.preventDefault() 该属性阻止默认事件(标准)
e.stopPropagation() 阻止冒泡(标准)

阻止默认行为

<a href="http://www.baidu.com">百度</a>
<script>
    var a = document.querySelector('a');
    a.addEventListener('click', function(e) {
        e.preventDefault(); //  dom 标准写法
    })
    a.onclick = function(e) {
        // 普通浏览器 e.preventDefault();  方法
        // e.preventDefault();
        // 低版本浏览器 ie678  returnValue  属性
        // e.returnValue;
        // 我们可以利用return false 也能阻止默认行为 没有兼容性问题 特点: return 后面的代码不执行了, 而且只限于传统的注册方式
        return false;
        alert(1);
    }
</script>

阻止事件冒泡

       e.stopPropagation()

       e.cancelBubble=ture

<div class="father">
    <div class="son">son儿子</div>
</div>
<script>
    // 阻止冒泡  dom 推荐的标准 stopPropagation() 
    var son = document.querySelector('.son');
    son.addEventListener('click', function(e) {
        alert('son');
        e.stopPropagation(); // stop 停止  Propagation 传播
        e.cancelBubble = true; // 非标准 cancel 取消 bubble 泡泡
    }, false);
    var father = document.querySelector('.father');
    father.addEventListener('click', function() {
        alert('father');
    }, false);
    document.addEventListener('click', function() {
        alert('document');
    })
</script>

事件委托

       事件委托也称为事件代理,在jQuery里面称为事件委派。

       原理:给父元素注册事件,利用事件冒泡当子元素的事件出发会冒泡给复元素,然后去控制相应的子元素。(并不是给每个子节点设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置的每个子节点。)

<ul>
    <li>知否知否,应是绿肥红瘦</li>
    <li>知否知否,应是绿肥红瘦</li>
    <li>知否知否,应是绿肥红瘦</li>
</ul>
<script>
    var ul = document.querySelector('ul');
    ul.addEventListener('click', function(e) {
        e.target.style.backgroundColor = 'pink';
    })
</script>

鼠标事件对象

       event 事件对象是事件相关的一系列信息的集合。

鼠标事件对象 说明
e.clientX 返回鼠标相对于浏览器窗口可视区的X坐标
e.clientY 返回鼠标相对于浏览器窗口可视区的Y坐标
e.pageX 返回鼠标相对于文档页面的X坐标
e.pageY 返回鼠标相对于文档页面的X坐标
e.screenX 返回鼠标相对于电脑屏幕的X坐标
e.screenY 返回鼠标相对于电脑屏幕的X坐标

案例:获取鼠标在页面中的坐标

<script>
    document.addEventListener('click', function(e) {
        // 1. client 鼠标在可视区的x和y坐标
        console.log(e.clientX);
        console.log(e.clientY);
        console.log('---------------------');
        // 2. page 鼠标在页面文档的x和y坐标
        console.log(e.pageX);
        console.log(e.pageY);
        console.log('---------------------');
        // 3. screen 鼠标在电脑屏幕的x和y坐标
        console.log(e.screenX);
        console.log(e.screenY);
    })
</script>

键盘事件对象

键盘事件对象属性 说明
keyCode 返回该建的ASCII值

常用的键盘事件

键盘事件 触发条件
onkeyup 某个键盘按键被松开时触发
onkeydown 某个键盘按键被按下时触发
onkeypress 某个键盘按键被按下时触发
<script>
    // 1. 我们的keyup 和keydown事件不区分字母大小写  a 和 A 得到的都是65
    // 2. 我们的keypress 事件 区分字母大小写  a  97 和 A 得到的是65
    document.addEventListener('keyup', function(e) {
        console.log('up:' + e.keyCode);
        // 我们可以利用keycode返回的ASCII码值来判断用户按下了那个键
        if (e.keyCode === 65) {
            alert('您按下的a键');
        } else {
            alert('您没有按下a键')
        }
    })
    document.addEventListener('keypress', function(e) {
        // console.log(e);
        console.log('press:' + e.keyCode);
    })
</script>

网站公告

今日签到

点亮在社区的每一天
去签到