JS EventTarget方法

js event

事件的本质是程序的各组成部分之间的一种通信方式,也是异步编程的一种实现

DOM的事件触发都是定义在EventTarget接口。所有节点对象都部署了这个接口。

该接口主要实现三个方法
addEventListenser 绑定事件的监听函数
removeEventListener 移除事件的监听函数
dispatchEvent 触发事件
------------------------------
EventTarget.addEventListenser()
作用于当前节点或对象上,定义一个特定事件的监听函数,
一旦这个事件发生,就会执行监听函数。无返回值

addEventListenser(type, listener [, useCapture]);
三个参数
type: 事件名称, 大小写敏感
listener: 监听函数。 事件发生时,会调用该监听函数
useCapture: 布尔值,表示监听函数是否在捕获阶段触发
默认false(监听函数只在冒泡阶段触发)


第二个参数除了监听函数,还可以是一个具有handleEvent方法的对象
第三个参数除了布尔值,还可以是一个属性配置对象,属性有一下
{
capture: 布尔值,表示是否在捕获节点触发
once: 布尔,表示是否只触发一次监听函数,然后就自动移除
passive: 布尔值 表示监听函数不会调用事件的preventDefult方法
}

------------------------------
EventTarget.removeEventListenser()
该方法用来移除addEventListener方法添加的事件监听函数

eg:
div.addEventListener('click', listener, false);
div.removeEventListener('click', listener, false);

移除的监听函数必须是添加的同一个监听函数,而且必须是在同一个节点元素,】
否在无效
//无效的移除函数 因为部署同一个监听函数
div.addEventListener('click', function (e) {}, false);
div.removeEventListener('click', function (e) {}, false);
//无效的移除函数 因为第三个参数不一样,移除的一个是捕获节点 一个是冒泡阶段
element.addEventListener('mousedown', handleMouseDown, true);
element.removeEventListener("mousedown", handleMouseDown, false);
------------------------------
EventTarget.dispatchEvent()

在当前节点触发指定事件
返回布尔,只有存在一个监听函数调用了Event.preventDefault(),
则返回值为false, 否则为true
dispatchEvent方法的参数是一个Event对象

 

 

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>EventTarget</title>
</head>
<body>
    <button id='btn'>事件冒泡触发</button>
</body>
<script>
    function hello1() {
        console.log('hello world1');
    }
    function hello2() {
        console.log('hello world2');
    }

    var hello = {
        handleEvent: function(event) {
            event.preventDefault();    
            console.log('hello world');
        }
    };

    var useCapture = {
        capture: false
        //once: true,
        //passive: true
    };

    // useCapture: 布尔值,表示监听函数是否在捕获阶段触发 默认false(监听函数只在冒泡阶段触发)
    var btn = document.getElementById('btn');

    // 可以添加多了不同的监听函数,按照添加顺序触发,
    // 但是如果多次添加的是同一个函数,只会触发一次
    // btn.addEventListener('click', hello1, useCapture);
    // btn.addEventListener('click', hello1, useCapture);
    // btn.addEventListener('click', hello2, useCapture);

    btn.removeEventListener('click', hello1, false);
    // btn.removeEventListener('click', hello2, false);
    //div.removeEventListener('click', function (e) {}, false);

    //触发一次点击事件
    var event = new Event('click');
    // btn.dispatchEvent(event);

    var canceled = !btn.dispatchEvent({});
    if (canceled) {
        console.log('事件取消');
    } else {
        console.log('事件未取消');
    }


</script>
</html>
复制代码

 

拖拉事件
为了让元素节点可拖拉,可以将该节点的draggable属性设为true。

当元素节点或选中的文本被拖拉时,就会持续触发拖拉事件,包括以下一些事件。


drag:拖拉过程中,在被拖拉的节点上持续触发(相隔几百毫秒)。
dragstart:用户开始拖拉时,在被拖拉的节点上触发,该事件的target属性是被拖拉的节点。
通常应该在这个事件的监听函数中,指定拖拉的数据。
dragend:拖拉结束时(释放鼠标键或按下 ESC 键)在被拖拉的节点上触发,
该事件的target属性是被拖拉的节点。它与dragstart事件,在同一个节点上触发。
不管拖拉是否跨窗口,或者中途被取消,dragend事件总是会触发的。
dragenter:拖拉进入当前节点时,在当前节点上触发一次,该事件的target属性是
当前节点。通常应该在这个事件的监听函数中,指定是否允许在当前节点放下(drop
)拖拉的数据。如果当前节点没有该事件的监听函数,或者监听函数不执行任何操作,
就意味着不允许在当前节点放下数据。在视觉上显示拖拉进入当前节点,也是在这个
事件的监听函数中设置。
dragover:拖拉到当前节点上方时,在当前节点上持续触发(相隔几百毫秒),
该事件的target属性是当前节点。该事件与dragenter事件的区别是,dragenter
事件在进入该节点时触发,然后只要没有离开这个节点,dragover事件会持续触发。
dragleave:拖拉操作离开当前节点范围时,在当前节点上触发,该事件的target
属性是当前节点。如果要在视觉上显示拖拉离开操作当前节点,就在这个事件的监
听函数中设置。
drop:被拖拉的节点或选中的文本,释放到目标节点时,在目标节点上触发。注意,
如果当前节点不允许drop,即使在该节点上方松开鼠标键,也不会触发该事件。如果
用户按下 ESC 键,取消这个操作,也不会触发该事件。该事件的监听函数负责取出
拖拉数据,并进行相关处理。

浏览器原生提供一个DragEvent()构造函数,用来生成拖拉事件的实例对象。
new DragEvent(type, options)
第一个参数是字符串,表示事件的类型 必须
第二个参数是事件的配置对象 可选

 

复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <meta http-equiv='X-UA-Compatible' content='IE=edge'>
        <title>EventTarget</title>
    </head>
    <body>
        <div id='nodeDrag' draggable="true" style="background-color: aqua;">
            此区域可拖拽
        </div>
        <div style="background-color: aqua;">
            此区域可拖拽
        </div>

        <div class="dropZone">1
            <div id='draggable' draggable="true">
                此节点可拖拽
            </div>
        </div>
        <div class="dropZone">2
        </div>
        <div class="dropZone">3
        </div>
        <div class="dropZone">4
        </div>
    </body>

    <script>
        var node = document.getElementById('nodeDrag');
        node.addEventListener('dragstart', function (e) {
            this.style.backgroundColor = 'red';
        }, false);

        node.addEventListener('dragend', function (e) {
            this.style.backgroundColor = 'green';
        }, false);

        // 被拖拉节点
        var dragged;

        document.addEventListener('dragstart', function(event) {
            dragged = event.target;
            event.target.style.opacity = 0.5;
        }, false);

        document.addEventListener('dragend', function(event) {
            event.target.style.opacity = 1;
        }, false);

        document.addEventListener('dragover', function(event) {
            event.preventDefault();
        }, false);

        document.addEventListener('dragenter', function (event) {
            // 目标节点的背景色变紫色
            // 由于该事件会冒泡,所以要过滤节点
            if (event.target.className === 'dropZone') {
                event.target.style.background = 'red';
            }
        }, false);

        document.addEventListener('dragleave', function( event ) {
            // 目标节点的背景色恢复原样
            if (event.target.className === 'dropZone') {
                event.target.style.background = '';
            }
            }, false);

            document.addEventListener('drop', function( event ) {
            // 防止事件默认行为(比如某些元素节点上可以打开链接),
                event.preventDefault();
                if (event.target.className === 'dropZone') {
                    // 恢复目标节点背景色
                    event.target.style.background = '';
                    // 将被拖拉节点插入目标节点
                    dragged.parentNode.removeChild(dragged);
                    event.target.appendChild( dragged );
                }
            }, false);
    </script>
</html>
复制代码

 

posted @   姓蜀名黍  阅读(1399)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示