Web API中的Event


一、Event是什么?

Event是事件接口,可以通过这个接口创建事件,并把它分配给目标元素。

1.创建和触发自定义事件

通过构造器Event创建了一个build事件,使用dispatchEvent将事件分配给elem元素,并监听事件。

<body>
    <div id = "container" style="height: 100px;width: 100px;background-color: black;">
    </div>
    <script>
        const event = new Event('build');
        const elem = document.getElementById('container')
        // Listen for the event.
        elem.addEventListener('build', function () {console.log('this is build')}, false);
        // Dispatch the event.
        elem.dispatchEvent(event);
    </script>
</body>

通过CustomEvent创建事件,可以添加更多自定义信息

        const event2 = new CustomEvent('build2', { detail: {myData:"hello"}});
        function eventHandler(e) {
            console.log('My data is: ' + e.detail.myData);
        }
        elem.addEventListener('build2', eventHandler)
        elem.dispatchEvent(event2);

运行结果

结果

二、事件冒泡和事件捕获

1.产生原因

因为元素的嵌套,结构上重叠,事件可能会依次被触发,触发的顺序取决于事件冒泡事件捕获在每一个元素上的设置情况。

2.事件冒泡

希望从子元素触发事件,并让祖先捕获该事件,顺序是由子到父。

使用:event.bubbles = true | false

将eventAwesome事件分发给textArea,其父元素Form能监听eventAwesome。

<body>
    <form>
        <textarea></textarea>
    </form>
    <script type="text/javascript" language="javascript">
        const form = document.querySelector('form');
        const textarea = document.querySelector('textarea');

        // Create a new event, allow bubbling, and provide any data you want to pass to the "detail" property
        const eventAwesome = new CustomEvent('awesome', {
            bubbles: true,
            detail: { text: () => textarea.value }
        });

        // The form element listens for the custom "awesome" event 
        // and then consoles the output of the passed text() method
        // e指的是eventAwesome事件
        form.addEventListener('awesome', e => console.log(e.detail.text()));
        // As the user types, the textarea inside the form dispatches/triggers the event to fire,
        // and uses itself as the starting point
        //e指的是input事件 e.target = <textarea></textarea>
        textarea.addEventListener('input', e => {e.target.dispatchEvent(eventAwesome);console.log(e.target)});

    </script>
</body>

3.事件委托

如果需要实现这样一个需求:点击li标签(li标签数量会改变),并显示其内容,该如何高效的进行事件绑定?

可以将事件绑定在li的父元素ul标签上,通过e.target获得具体的li标签。每次点击li标签,其父元素ul标签都会监听到并执行hide函数。

    <script>
        // Make a list
        var ul = document.createElement('ul');
        document.body.appendChild(ul);

        var li1 = document.createElement('li');
        var li2 = document.createElement('li');
        ul.appendChild(li1);
        ul.appendChild(li2);

        function hide(e) {
            // e.target 引用着 <li> 元素
            // 不像 e.currentTarget 引用着其父级的 <ul> 元素.
            e.target.style.visibility = 'hidden';
        }

        // 添加监听事件到列表,当每个 <li> 被点击的时候都会触发。
        ul.addEventListener('click', hide);
    </script>

总结

本文仅仅简单介绍Event的使用,具体的可以参考:Event——Web API接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值