2019独角兽企业重金招聘Python工程师标准>>>

JavaScript 的事件处理是所有浏览器端程序的基本必备技巧。当目标元素的事件被触发时,比如按钮被点击,鼠标移动,或者是表单提交,这些事件触发时都可以触发对应的方法。当然这个过程中我们可以传递一些参数过去来自定义很多事情。

一个要注意避免的就是事件与DOM元素的紧耦合。比如先看看下面这个代码,考虑到用一个简单表单来接受用户输入的信息。
1
2
3
4
5
<form id="msgbox"action="#"method="get">
<label for="msg">your message</label>
<input id="msg"value=""/>
<button>SEND</button>
</form>

我们能写一段代码让屏幕上显示刚才表单提交的信息
1
2
3
4
5
6
7
document.getElementById("msgbox").addEventListener("submit", function(e) {
e.preventDefault();
varmsg = e.currentTarget.getElementById("msg").value.trim();
if(msg) {
alert(msg);
}
}, false);

那么如果我们想对显示出来的这句话做一些操作,比如发一条tweet,或存储在服务器或者干些其他什么?则有两个选择:
1,对已有的事件处理方法添加代码
   这个方案的缺陷就是每当打算测试或者更新后来添加的事件处理方法时变得非常不弹性化,每当更改或者删除一些功能的时候,总会有一大段代码要跟着去修改。
2,为每一个功能都创建事件处理方法
   第二个方法很好的解决了前面方法的问题,虽然这个方法可能会一开始麻烦点。毕竟所有的方法代码都要处理重复的消息提取以及验证步骤。
设想假如能够自行触发自定义的"newMessage"事件而无需验证是否有message提交,或假如能监控整个HTML文档或者body这样的标签而不仅仅只是某个表单的节点,能否做到呢?这就是自定义事件要解决的问题了。
自行触发一个自定义事件是很简单的;如下代码就是传递一个name,details以及options到新建的 CustomEvent对象中:
1
2
3
4
5
6
7
8
9
10
11
var event = newCustomEvent(
"newMessage",
{
detail: {
message: "Hello World!",
time: newDate(),
},
bubbles: true,
cancelable: true
}
);

这个案例中,"newMessage"是一个自定义事件类型。而第二个参数包含了此对象的三个属性(detail,bubbles,cancelable)。
detail: 包含了自定义事件的具体信息,这里仅仅就包括了一个message与一个time
bubbles: 如果是true,则事件会一直传递给自身的父对象元素,接着父对象也会触发此类事件
cancelable: 如果是true, 事件可以被事件触发元素的 stopPropagation( ) 方法停止
现在,我们需要针对某个特定元素来触发此类事件。
1
document.getElementById("msgbox").dispatchEvent(event);
可以用以下代码订阅这个事件的处理。
1
document.addEventListener("newMessage", newMessageHandler, false);
展示页
查看自定义事件的展示页
一个标准的事件处理方法将会查看提交到HTML表单的所有信息。下面这个方法先获取当前的消息,假设它已经被验证,最后自行触发一个新的"newMessage"的事件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var msgbox = document.getElementById("msgbox");
msgbox.addEventListener("submit", SendMessage, false);
// new message: raise newMessage event
function SendMessage(e) {
e.preventDefault();
varmsg = document.getElementById("msg").value.trim();
if(msg && window.CustomEvent) {
varevent = newCustomEvent("newMessage", {
detail: {
message: msg,
time: newDate(),
},
bubbles: true,
cancelable: true
});
e.currentTarget.dispatchEvent(event);
}
}

所有的事件处理方法都可以订阅来处理那个 newMessage 事件。
1
2
3
4
5
6
7
8
9
// listen for newMessage event
document.addEventListener("newMessage", newMessageHandler, false);
// newMessage event handler
functionnewMessageHandler(e) {
LogEvent(
"Event subscriber on "+e.currentTarget.nodeName+", "
+e.detail.time.toLocaleString()+": "+e.detail.message
);
}

浏览器能力
不过上面这个 CustomEvent对象只有在 Chrome, FireFox以及Opera才能正常使用。而下一个版本的Safari也支持了。IE9以及更低版本暂时是不支持的。

转载于:https://my.oschina.net/thinkive/blog/644698

如何在JavaScript中使用自定义事件相关推荐

  1. 如何在JavaScript中检测用户的首选配色方案

    by Oskar Hane 由Oskar Hane 如何在JavaScript中检测用户的首选配色方案 (How to detect a user's preferred color scheme i ...

  2. 如何在javascript中使用多个分隔符分割字符串?

    如何在JavaScript中使用多个分隔符拆分字符串? 我正在尝试在逗号和空格上进行拆分,但是AFAIK,JS的拆分功能仅支持一个分隔符. #1楼 对于那些想要在拆分功能中进行更多自定义的人,我编写了 ...

  3. 现在JavaScript日期–如何在JavaScript中获取当前日期

    Many applications you build will have some sort of a date component, whether it's the creation date ...

  4. 如何在JavaScript中区分深层副本和浅层副本

    by Lukas Gisder-Dubé 卢卡斯·吉斯杜比(LukasGisder-Dubé) 如何在JavaScript中区分深层副本和浅层副本 (How to differentiate betw ...

  5. vj节点_创意编码—如何在JavaScript中创建VJ引擎

    vj节点 by George Gally 通过乔治·加利 创意编码-如何在JavaScript中创建VJ引擎 (Creative Coding - How to create a VJ engine ...

  6. html内置时间对象,JavaScript中的常用事件,以及内置对象详解

    原标题:JavaScript中的常用事件,以及内置对象详解 今天是刘小爱自学Java的第81天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 学前端有一个非常权威的组织,也就是w3c,其有个专 ...

  7. 如何在 JavaScript 中实现拖放

    来源:http://www.javaeye.com/post/152142 译者说明: 终于完成了全文的翻译,由于时间比较参促,文章没有过多的校正与润色,阅读过程中难免会有些许生硬或不准确的感觉,请大 ...

  8. 如何在JavaScript中声明名称空间?

    如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖? 我使用了以下内容: if (Foo == null || typeof(Foo) != "obje ...

  9. 如何在JavaScript中直观地设计状态

    by Shawn McKay 肖恩·麦凯(Shawn McKay) 如何在JavaScript中直观地设计状态 (How to visually design state in JavaScript) ...

最新文章

  1. java数据库视图工具_数据库视图工具类
  2. 浅谈AJAX基本实现流程
  3. PHP文件操作常用函数总结
  4. JavaScript响应键盘不再用KeyboardEvent.keyCode,而是用keyboardEvent.code
  5. 使用pytorch的相关问题总结
  6. 华科计算机考研2022年分数线,2022年华中科技大学软件工程考研分数线、参考书、上岸前辈初复试经验...
  7. mysql校对规则_MYSQL校对规则
  8. 如何实现动态加载删除android,关于android:融云IMKit-动态删除或添加plugin-的实现...
  9. 记一次ST-LINK维修及刷固件过程
  10. 剑指offer——23.反转链表
  11. python删除数据库的数据完整代码_轻松掌握Python对数据库的增、删、改、查
  12. java值得注意的几个问题
  13. python贪吃蛇_python实现贪吃蛇
  14. H3C AP当无线路由器静态IP上网配置
  15. IP代理软件哪个比较好
  16. 致敬赵雷:基于TensorFlow让机器生成赵雷曲风的歌词
  17. 专访Riverbed CEO:私有化和出售业务瘦身后的Riverbed更专注
  18. FOJ 1573 大学自习室
  19. 京东登录注册页面的简单实现——(仿)
  20. 操作系统的中的 IO

热门文章

  1. python 三数之和
  2. Android Studio 点击运行总是debug
  3. 射影几何笔记6:齐次坐标下“点-线”几何关系
  4. Vue中bus的使用
  5. 设备自动获取ip DHCP模型 IP为169.254.4.193
  6. 用electron-forge创建一个项目
  7. python的实现和测试是啥意思_Python接口自动化测试之pytest与unittest区别
  8. 13.文件:因为懂你,所以永恒
  9. 4.元组tuple:戴上了枷锁的列表
  10. Gdiplus byte *数据转换为Bitmap类型图片