曾经有次在一个jQuery交流群里,有人问,能不能自定义事件,然后监听事件,比如监听一个变量的变化,当时我屁颠屁颠的给别人说,这个不大可 能。现在正是为我当时的无知和逞能感到羞耻,以后再也不轻易的否定一个事情,除非我有完全的理由否定,自己不知道,不是否定的理由.
下面我就来实现那次别人说到的自定义事件,监听某个变量的变化:
标准浏览器(firefox,chrome,safari,opera等)的实现非常简单,自然,有一个document.createEvent()的函数来专门创建自定义事件,使用起来也很简单,等会儿看代码一看就明白了。
varevent= document.createEvent(type);
- event is the created Event object.
- type is a string that represents the type of event to be created. Possible event types include “UIEvents”, “MouseEvents”, “MutationEvents”, and “HTMLEvents”. See Notes section for details.
简单的说来,自定义事件到激发这个事件,需要document.createEvent(),event.initEvent(),element.dispatchEvent()这三部,分别是创建事件对象,初始化事件对象,触发事件。先给个简单的例子。
function foo1(){
console.log("foo1 is execute");}function foo2(){
console.log("foo2 is execute");}var ev=document.createEvent('HTMLEvents');
ev.initEvent('fakeEvent',false,false);
document.addEventListener("fakeEvent",foo1,false);
document.addEventListener("fakeEvent",foo2,false);
在标准浏览器里的console里执行 document.dispatchEvent(ev); 就可以看到console里显示出来了 foo1 is execute和 foo2 is execute
自定义事件已经实现了,那么怎么实现监听某个变量的变化呢?我们可以使用一个特定的函数来给变量赋值,在这个函数中,除了执行给变量赋值的操作外,还激发事件。为了约束程序员直接对变量复制,使用下面的代码来强制程序员不能直接对该变量赋值
var idChange=function(){var id=1;return{getId:function(){return id;},
setId:function(a){id=a;
document.dispatchEvent(ev);}}}();
这样就只能通过idChange.setId()的方法对id赋值,通过 idChange.getId()来获得id的值,并且在赋值的过程中激发事件。
在标准浏览器里,现在已经实现了目标,遗憾的是IE并不支持document.createEvent()的方法,在JavaScript权威指南 第五版中,作者给出IE支持的 document.createEventObject()和event.fireEvent()方法,但是经过测试,fireEvent并不能用于自定 义事件,传给它的参数只能是在IE已经定义了的事件(MSDN文档写的不明不白的,看的很恼火)。在Dean Edwards的博客中看到了一个方法这 里就直接拿来用了,性能方面值得考虑,请阅读这篇博客下面的评论部分,就会知道怎么改进这个方法的性能,为了方便,我这里直接用他博客中给的方法了,为了 更直观,也添加了一个addLog()函数,来直接在页面中记录事件的发生, 为了配合addLog函数,页面中要有一个id为 log 的div ,具体代码如下:
function foo1(){
addLog("foo1 is excute");}function foo2(){
addLog("the id is "+idChange.getId()+" now!");}if(document.createEvent){//This is for the stand browser.var ev=document.createEvent('HTMLEvents');
ev.initEvent('fakeEvent',false,false);
document.addEventListener("fakeEvent",foo1,false);
document.addEventListener("fakeEvent",foo2,false);}elseif(document.attachEvent){//This is for the damn IE
document.documentElement.fakeEvents =0;// an expando property
document.documentElement.attachEvent("onpropertychange",function(event){if(event.propertyName =="fakeEvents"){
foo1();}});
document.documentElement.attachEvent("onpropertychange",function(event){if(event.propertyName =="fakeEvents"){
foo2();}});}function addLog(log){var logDiv=document.getElementById('log');var p=document.createElement("p");
p.appendChild(document.createTextNode(log));
logDiv.appendChild(p);}var idChange=function(){var id=1;return{getId:function(){return id;},
setId:function(a){
id=a;if(document.dispatchEvent) document.dispatchEvent(ev);elseif(document.attachEvent) document.documentElement.fakeEvents++;//This for IE}}}();
现在我们就已经实现了文章开头想要达到的需求,在浏览器地址栏里执行javascript:idChange.setId(8)就可以看见效果了。 监听某个变量的变化了,你可能会想到,干嘛不直接在idChange.setId()中直接执行 foo1(),foo2(),是的,这样也可以实现,但是这样不是真正的事件,如果你在代码中多处需要注册监听器到这个自定义事件,并且随时需要取消注 册,显然这种事件的方法更容易管理一些,另外事件还有另外的好处,代码更稳定,请参看上面给出的Dean Edwards的那篇博客Callbacks vs Events
相关推荐
javascript实现自定义事件,纯javascript不含vbscript。 通过自定义的HashMap.js和EventManager.js实现自定义事件的监听addEvent和发布fireEvent
### JavaScript自定义事件功能与用法实例分析 #### 概述 在JavaScript中,自定义事件(也称为自定义事件)是一种强大的工具,允许开发者在不同的模块或组件之间建立通信渠道。这种通信机制基于观察者模式,即一个...
在JavaScript中,自定义事件是一种强大的机制,它允许开发者创建自己的事件类型,以便在不同的对象之间传递信息或协调状态更新。这种技术对于大型应用程序或游戏的模块化和解耦至关重要。在JavaScript中实现自定义...
在JavaScript中,可以通过`Event`构造函数创建自定义事件,例如: ```javascript var customEvent = new Event('customEventType'); ``` 然后,可以使用`addEventListener`来注册事件监听器,并使用`dispatchEvent`...
Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加、删除事件。 下面通过实例,一步一步构建一个具体的Javascript自定义事件对象...
在JavaScript的世界里,jQuery是一个非常流行的库,它简化了DOM操作、事件处理、动画效果以及Ajax交互等任务。本文将深入探讨如何为jQuery添加自定义事件机制,这将帮助开发者扩展jQuery的功能,实现更加个性化的...
本文将探讨如何利用JavaScript实现一套自定义事件机制。 首先,自定义事件应具备的基本功能包括: 1. **绑定事件**:将事件处理函数与特定事件类型关联。 2. **触发事件**:执行与事件相关联的所有处理函数。 3. *...
本文实例讲述了JavaScript中的模拟事件和自定义事件。分享给大家供大家参考,具体如下: 前面介绍了JavaScript中为事件指定处理程序的五种方式和JavaScript的事件对象event。 下面介绍JavaScript中的模拟事件和...
### JavaScript 十个最常用的自定义函数详解 #### 一、引言 JavaScript 是一种广泛应用于网页开发中的脚本语言,它提供了强大的功能来增强网页的交互性和动态性。随着前端技术的发展,开发者们常常会遇到需要频繁...
在JavaScript中,自定义事件允许开发者扩展内置事件系统,以满足特定的需求。以下是对标题和描述中所涉及知识点的详细解释: 1. **事件驱动编程**: 事件驱动编程是一种编程范式,其中程序通过等待和处理来自外部...
自定义事件可以通过原生的JavaScript对象Event、CustomEvent以及dispatchEvent来创建和管理。Event是所有事件的基类,而CustomEvent继承自Event并允许开发者创建包含额外数据的事件对象。使用CustomEvent时,可以在...
本文档主要介绍了如何在JavaScript中加强自定义event事件的使用。 首先,文档提到了在事件处理时应避免的一些不专业做法。例如,在循环中注册事件监听器会导致事件被重复绑定多次,造成性能问题和非预期的行为。...
JavaScript 自定义浏览器滚动条兼容 IE、火狐和 chrome 本文主要共享了使用原生 JavaScript 实现自定义浏览器滚动条兼容 IE、火狐和 chrome 的思路与方法。通过 JavaScript 实现自定义浏览器滚动条,可以实现跨...
在JavaScript中,自定义事件的用法是前端开发中一个较为高级的话题,它允许开发者创建和触发自己的事件,从而达到更好的模块化和代码解耦。下面我们将详细探讨自定义事件的原理、用法以及如何在实际开发中应用。 ...
然而,JavaScript还允许我们创建自己的、自定义的事件,这样做可以让我们在适当的时机触发特定的事件处理函数,从而实现更复杂的交互逻辑。下面,我们就来详解JavaScript中实现自定义事件的方法。 首先,我们需要...
在JavaScript中,自定义事件(Custom Events)是一种增强网页交互性和灵活性的重要机制。它们允许开发者在不依赖特定DOM操作或用户交互的情况下,触发和响应特定的事件。这在模块化编程、组件化开发以及实现复杂逻辑...
### JavaScript自定义右键弹出菜单实现方法 在Web开发中,为了提升用户体验与功能多样性,自定义右键菜单是一种常见的交互方式。本文将详细解析如何利用JavaScript来实现一个简单的自定义右键弹出菜单,并深入探讨...