学习customEvent
title: 认真学习customEvent
tags: DOM
date: 2017-7-22 23:20:57
最近要实现一个模拟的select元素组件,所以好好看了这个自定义事件api,记录一下。
整体来说,这个api由3部分组成,监听事件的元素,触发事件的元素和event对象.
- 监听事件的元素主要负责监听事件,事件发生了调用回调函数。跟DOM事件一样
- 触发事件的元素负责在一定的条件下触发自定义事件
event对象,就好像击鼓传花,由事件的触发者传递给事件的监听者,供回调函数使用
这里要注意的是,自定义事件依然符合捕获-目标-冒泡这三个阶段,也就是说,子元素触发的事件,子元素和他的祖先元素可以接收到,而子元素的兄弟元素就算注册了监听事件,等到花儿都谢了,也不会触发回调函数的。。。(我一开始就是这么干的)
下面就通过一个自定义的select事件来说明自定义元素的作用:html结构如下:
<div class='selector'>
<div class='selected'>啥都没选</div>
<div class = 'options'>
<div >1</div>
<div >2</div>
<div >3</div>
<div >4</div>
<div >5</div>
</div>
</div>
在这个例子中,我们希望实现的效果是,点击选项时,会触发select事件,同时可以在根元素上监听到select这个自定义事件,js代码如下:
document.querySelector('.options').addEventListener('click', function (evt) {
if (evt.target.classList.contains('options')) {
return;
}
var text = evt.target.innerHTML;
//构造自定义事件
var select = new CustomEvent('select', {
detail: event.target.innerHTML,
bubbles: true//允许冒泡被祖先元素监听到
});
evt.target.dispatchEvent(select)//把select事件抛出去
})
document.querySelector('.selector').addEventListener('select', function (evt){
this.querySelector('.selected').innerHTML = evt.detail;
})
See the Pen NvPjde by imgss (@imgss) on CodePen.
当选项被点击时触发`select`事件,根元素监听到`select`事件之后显示出被选中的选项。有同学会说,这个直接用点击事件不就可以了吗,但是这样写逻辑更清楚
学习customEvent的更多相关文章
- javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)
前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...
- 自定义事件——Event和CustomEvent
之前在学习自定义事件时,在MDN的Event.initEvent()页面顶端有写:该特性已从Web标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性. 作 ...
- Node基础知识点--学习笔记(一)
一:建立http服务器: 在D盘建立一个文件夹node,放入app.js,代码如下: var http = require('http'); http.createServer(function(re ...
- spring学习12 -Spring 框架模块以及面试常见问题注解等
以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...
- Qt 学习之路 2(23):自定义事件
Qt 学习之路 2(23):自定义事件 豆子 2012年10月23日 Qt 学习之路 2 21条评论 尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的.例如, ...
- Qt 学习之路 2(20):event()
Qt 学习之路 2(20):event() 豆子 2012年10月10日 Qt 学习之路 2 43条评论 前面的章节中我们曾经提到event()函数.事件对象创建完毕后,Qt 将这个事件对象传递给QO ...
- Salesforce LWC学习(四) 父子component交互 / component声明周期管理 / 事件处理
我们在上篇介绍了 @track / @api的区别.在父子 component中,针对api类型的变量,如果声明以后就只允许在parent修改,son component修改便会导致报错. sonIt ...
- 转 js自定义事件——Event和CustomEvent
之前在学习自定义事件时,在MDN的Event.initEvent()页面顶端有写:该特性已从Web标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性. 作 ...
- Salesforce LWC学习(十七) 前端知识之 onclick & onblur & onmousedown
在Salesforce LWC学习(八) Look Up组件实现篇中,我们实现了公用的lookup组件,使用的过程中,会发现当我们输入内容以后,搜索出来的列表便无法被清空. 针对此种情况我们打算优化一 ...
随机推荐
- QT中槽的使用
一.建立槽和按钮之间的连接 connect(信号发送者,发送的信号,信号接收者,信号接收者的槽函数) 1.例子 connect(ui->pushButton,SIGNAL(clicked(boo ...
- Promise同时进入catch和then——踩坑
记录今天使用Promise遇到的一个坑--在resolve()返回运行then之后,函数又进入到了catch,源代码大意如下: var pro = function() { return new Pr ...
- tomcat配置虚拟路径保存、访问图片
一些项目中往往需要上传一些图片文件之类,一般不建议直接保存在数据库内,往往是讲图片等资源保存在服务器的某个文件夹下,传统做法是上传到部署目录下,通过相对路径进行访问.这样当我们系统需要进行升级,进行全 ...
- FLP不可能性(FLP impossibility)
FLP不可能性(FLP impossibility) FLP impossibility是一个定理,它证明了在分布式情景下,无论任何算法,即使是只有一个进程挂掉,对于其他非失败进程,都存在着无法达成一 ...
- WebView之js调用Android类的方法传递数据
1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只 ...
- let和const命令
let命令 1.let用来声明变量,类似于var,但只在代码块内有效. { let a = 1; var b = 2; } console.log(a); //a is not defined con ...
- 实现基于tomcat集群会话保持
1.实验环境 我们需要准备两台虚拟机,把这两台虚拟机组成集群,实现会话保持. 2.配置server1 2.1 修改nginx配置文件 [root@server1 ~]# vim /etc/nginx/ ...
- 【原创】抓个Firefox的小辫子,围观群众有:Chrome、Edge、IE8-11
前言 很多人都知道我们在做FineUI控件库,在这 9 年多的时间里,在和浏览器无数次的交往中,也发现了多个浏览器自身的BUG,并公开出来方便大家查阅: 分享IE7一个神奇的BUG(不是封闭标签的问题 ...
- h5前端流行的框架
很多时候别人问你,上手的框架有哪些,其实我们都是知道的,只是一时却也说不上哪些比较,这里想给大家介绍一下,我所遇到的,还算好用的框架,做个分享 1 Bootstrap 官网:http://getboo ...
- JSP6(JSP 指令与JSP 动作元素)
一.JSP指令用来设置整个JSP页面相关的属性 指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开. JSP中的三种指令标签: Page指令 Page指令为容器提供当前页面的使用说明.一个JS ...