如何在JavaScript中使用自定义事件

 我来答
影视后期制作学习
2017-05-26 · 知道合伙人教育行家
影视后期制作学习
知道合伙人教育行家
采纳数:258 获赞数:698
荣获北京智泽苑教育科技有限公司金牌教师称号。

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

一个要注意避免的就是事件与DOM元素的紧耦合。比如先看看下面这个代码,考虑到用一个简单表单来接受用户输入的信息。

<form id="msgbox" action="#" method="get">

<label for="msg">your message</label>

<input id="msg" value="" />

<button>SEND</button>

</form>

2.我们能写一段代码让屏幕上显示刚才表单提交的信息

document.getElementById("msgbox").addEventListener("submit", function(e) {

e.preventDefault();

var msg = e.currentTarget.getElementById("msg").value.trim();

if (msg) {

alert(msg);

}

}, false);

那么如果我们想对显示出来的这句话做一些操作,比如发一条tweet,或存储在服务器或者干些其他什么?则有两个选择:

1,对已有的事件处理方法添加代码

这个方案的缺陷就是每当打算测试或者更新后来添加的事件处理方法时变得非常不弹性化,每当更改或者删除一些功能的时候,总会有一大段代码要跟着去修改。

2,为每一个功能都创建事件处理方法

第二个方法很好的解决了前面方法的问题,虽然这个方法可能会一开始麻烦点。毕竟所有的方法代码都要处理重复的消息提取以及验证步骤。

设想假如能够自行触发自定义的"newMessage"事件而无需验证是否有message提交,或假如能监控整个HTML文档或者body这样的标签而不仅仅只是某个表单的节点,能否做到呢?这就是自定义事件要解决的问题了。

自行触发一个自定义事件是很简单的;如下代码就是传递一个name,details以及options到新建的 CustomEvent对象中:

var event = new CustomEvent(

"newMessage",

{

detail: {

message: "Hello World!",

time: new Date(),

},

bubbles: true,

cancelable: true

}

);
这个案例中,"newMessage"是一个自定义事件类型。而第二个参数包含了此对象的三个属性(detail,bubbles,cancelable)。
detail: 包含了自定义事件的具体信息,这里仅仅就包括了一个message与一个time
bubbles: 如果是true,则事件会一直传递给自身的父对象元素,接着父对象也会触发此类事件
cancelable: 如果是true, 事件可以被事件触发元素的 stopPropagation( ) 方法停止
现在,我们需要针对某个特定元素来触发此类事件。
document.getElementById("msgbox").dispatchEvent(event);
DoramiHe
2017-06-04 · 知道合伙人互联网行家
DoramiHe
知道合伙人互联网行家
采纳数:25335 获赞数:59533
2011年中山职业技术学院毕业,现担任毅衣公司京东小二

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

一个要注意避免的就是事件与DOM元素的紧耦合。比如先看看下面这个代码,考虑到用一个简单表单来接受用户输入的信息。

<form id="msgbox" action="#" method="get">

<label for="msg">your message</label>

<input id="msg" value="" />

<button>SEND</button>

</form>

我们能写一段代码让屏幕上显示刚才表单提交的信息

document.getElementById("msgbox").addEventListener("submit", function(e) {

e.preventDefault();

var msg = e.currentTarget.getElementById("msg").value.trim();

if (msg) {

alert(msg);

}

}, false);

那么如果我们想对显示出来的这句话做一些操作,比如发一条tweet,或存储在服务器或者干些其他什么?则有两个选择:

1,对已有的事件处理方法添加代码

这个方案的缺陷就是每当打算测试或者更新后来添加的事件处理方法时变得非常不弹性化,每当更改或者删除一些功能的时候,总会有一大段代码要跟着去修改。

2,为每一个功能都创建事件处理方法

第二个方法很好的解决了前面方法的问题,虽然这个方法可能会一开始麻烦点。毕竟所有的方法代码都要处理重复的消息提取以及验证步骤。

设想假如能够自行触发自定义的"newMessage"事件而无需验证是否有message提交,或假如能监控整个HTML文档或者body这样的标签而不仅仅只是某个表单的节点,能否做到呢?这就是自定义事件要解决的问题了。

自行触发一个自定义事件是很简单的;如下代码就是传递一个name,details以及options到新建的 CustomEvent对象中:

var event = new CustomEvent(

"newMessage",

{

detail: {

message: "Hello World!",

time: new Date(),

},

bubbles: true,

cancelable: true

}

);
这个案例中,"newMessage"是一个自定义事件类型。而第二个参数包含了此对象的三个属性(detail,bubbles,cancelable)。
detail: 包含了自定义事件的具体信息,这里仅仅就包括了一个message与一个time
bubbles: 如果是true,则事件会一直传递给自身的父对象元素,接着父对象也会触发此类事件
cancelable: 如果是true, 事件可以被事件触发元素的 stopPropagation( ) 方法停止
现在,我们需要针对某个特定元素来触发此类事件。
document.getElementById("msgbox").dispatchEvent(event);

可以用以下代码订阅这个事件的处理。
document.addEventListener("newMessage", newMessageHandler, false);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
育知同创教育
2016-10-14 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
javascript实现自定义事件的原理是创建一个管理事件的对象.如下面代码是事件的定义:
function EventTarget(){
this.handlers = {};//存储事件处理程序,由n个键值对组成,键表示事件名,值是一个由事件处理程序组成的数组
}

EventTarget.prototype = {
constructor:EventTarget,
//添加事件
addHandler:function(type,handler){
if(typeof this.handlers[type] == "undefined"){
this.handlers[type] = [];
}
this.handlers[type].push(handler);
},
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
greystar_cn
推荐于2017-11-07 · 知道合伙人软件行家
greystar_cn
知道合伙人软件行家
采纳数:16407 获赞数:17260
本人主要从事.NET C#方向的技术开发工作,具有10多年的各类架构开发工作经验。

向TA提问 私信TA
展开全部
这篇文章主要为大家介绍了javascript实现自定义事件的方法,自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,javascript如何实现自定义事件,需要了解的朋友可以参考下
我们平时在操作dom时候经常会用到onclick,onmouseover等一系列浏览器特定行为的事件, 
那么自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,在合适的时候需要哪个事件类型,就去调用哪个处理程序
http://www.cnblogs.com/jiangxiaobo/p/5829913.html
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
动力节点
2017-04-25 · 口口相传的Java黄埔军校
动力节点
动力节点始于2009年,一家专注IT教育的培训机构,在全国各大城市设有直营校区,是中国软件研发人才一体化服务的倡导者,为解决当前软件开发技术飞速发展,专注培养面向互联网领域的IT高端软件人才
向TA提问
展开全部
在IE based浏览器上,你可以用 createEventObject 和 fireEvent 函数来自定义和触发事件,在其他浏览器上用 createEvent 和 dispatchEvent 函数。

var event; // 自定义事件

if (document.createEvent) {

event = document.createEvent("HTMLEvents");

event.initEvent("your:event:name", true, true);

} else {

event = document.createEventObject();

event.eventType = "your:event:name";

}

event.eventName = "your:event:name";

if (document.createEvent) {

element.dispatchEvent(event);

} else {

element.fireEvent("on" + event.eventType, event);

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式