JS事件模型

简介: 事件模型发起方指事件是由谁产生的;比如,你喊谁谁谁回家吃饭,这时候你就是发起方; 监听方指事件是由谁来响应的,可以是一个,也可以是多个;比如,谁谁谁听到喊他回家吃饭,然后马上就回来了;设计事件对象添加监听方删除监听方清空监听方触发监听方响应事件JS实现模型实现事件在下面的函数中,向test中传递一个fn函数,将此函数作为参数进行传递; 如果之前用过c#的事件委托机制的话,就很容易理解下面这种写法了。

事件模型

发起方指事件是由谁产生的;比如,你喊谁谁谁回家吃饭,这时候你就是发起方;
监听方指事件是由谁来响应的,可以是一个,也可以是多个;比如,谁谁谁听到喊他回家吃饭,然后马上就回来了;

设计事件对象

  • 添加监听方
  • 删除监听方
  • 清空监听方
  • 触发监听方响应事件

JS实现模型

实现事件

在下面的函数中,向test中传递一个fn函数,将此函数作为参数进行传递;
如果之前用过c#的事件委托机制的话,就很容易理解下面这种写法了。

function test(a,b,fn){
    if(typeof(fn) == "function"){
        fn(a,b);
    }
}
test(1,2,function(a,b){
    alert(a + b);    //3
});

设计一个事件对象的概念模型

基于我们上面描述的模型概念,已经JS方法基础,我们可以使用如下JS设计一个简单的事件对象模型:

function myEvent(){
    this.listeners = [];    //监听者列表
}
//添加一个监听者
myEvent.prototype.addListener = function(fn){
    this.listeners.push(fn);
};
//除移一个监听者
myEvent.prototype.removeListener = function(fn){
    var index = this.listeners.indexOf(fn);
    this.listeners.splice(index,0);
};
//清除所有监听者
myEvent.prototype.clearListeners = function(){
    this.listeners = [];
};
//发出执行信号,并告之所有监听者
myEvent.prototype.raise = function(e){
    var l = this.listeners.length;
    for(var i = 0; i < l; i++){
        this.listeners[i](e);   //执行所有监听方法
    }
};

var me = new myEvent();
me.addListener(function(e){
    document.write("我是第一个监听者 : " + e);
});
me.addListener(function(e){
    document.write("<br/>我是第二个监听者 : " + e);
});
me.raise("a");

根据上面的模型设计一个现实模型

function myEvent(){
    this.listeners = [];    //监听者列表
}
//添加一个监听者
myEvent.prototype.addListener = function(fn){
    this.listeners.push(fn);
};
//除移一个监听者
myEvent.prototype.removeListener = function(fn){
    var index = this.listeners.indexOf(fn);
    this.listeners.splice(index,0);
};
//清除所有监听者
myEvent.prototype.clearListeners = function(){
    this.listeners = [];
};
//发出执行信号,并告之所有监听者
myEvent.prototype.raise = function(e){
    var l = this.listeners.length;
    for(var i = 0; i < l; i++){
        this.listeners[i](e);   //执行所有监听方法
    }
};

function worker(name){
    this.name = name;
    this.boss = null;
    this.startWorkEvent = new myEvent();    //定义一个startWork事件
}
worker.prototype.startWork = function(){
    this.startWorkEvent.raise(this);    //发起开始工作的事件,并通知外部自己的姓名
};
function boss(name){
    this.name = name;
    this.workers = [];
    this.workerState = {};    //定义一个JS原始对象用于存放员工工作状态
}
//员工开始工作的监听者,对开始工作的员工进行状态记录
boss.prototype.onWorkerStartWork = function(worker){
    worker.boss.workerState[worker.name] = true;
};
boss.prototype.addWorker = function(worker){
    this.workers.push(worker);
    worker.boss = this;
    worker.startWorkEvent.addListener(this.onWorkerStartWork);
};
//统计
boss.prototype.summary = function(){
    for(var i = 0;i<this.workers.length;i++){
        //循环所有员工
        var worker = this.workers[i];
        if(this.workerState[worker.name]){
            document.write(worker.name + "正在工作<br/>");
        }
        else{
            document.write(worker.name + "不在工作<br/>");
        }
    }
};
var jim = new worker("jim");
var tom = new worker("tom");

var bob = new boss("bob");
bob.addWorker(jim);
bob.addWorker(tom);

jim.startWork();
bob.summary();    //jim正在工作  tom不在工作

潜规则

  • 对于简单的事件(不需要添加多个监听者的),往往用on开头表示,下一个单词首字母大写,比如onSelect,onChange等
function worker(){
    this.onWork = null;
}
worker.prototype.startWork = function(){
    if(typeof(this.onWork) == "function"){
        this.onWork(this);
    }
};
var w = new worker();
w.onWork = function(){
    document.write("start!");
};
w.startWork();    //start!
  • 对于能够添加多个监听者的,往往用addEventListener(str,fn)表示,str表示事件名称,名称中一带不包含on,且首字母小写。fn表示监听者方法的具体内容。jQuery设计模式下,可以用bind来替代addEventListener,参数相同.
var btn = $("#btnLogin");
    btn.bind("click",function(){
        //some code here
    });
目录
相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
javascript onkeydown事件
javascript onkeydown事件
|
2月前
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
45 3
|
3月前
|
JavaScript 前端开发
JavaScript 事件
JavaScript 事件
39 2
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
50 5
|
2月前
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
57 6
|
1月前
|
JavaScript 前端开发
深入理解Node.js中的异步编程模型
【10月更文挑战第39天】在Node.js的世界里,异步编程是核心所在,它如同自然界的水流,悄无声息却又无处不在。本文将带你探索Node.js中异步编程的概念、实践以及如何优雅地处理它,让你的代码像大自然的流水一样顺畅和高效。
|
2月前
|
Web App开发 JavaScript 前端开发
深入理解Node.js事件循环和异步编程模型
【10月更文挑战第9天】在JavaScript和Node.js中,事件循环和异步编程是实现高性能并发处理的基石。本文通过浅显易懂的语言和实际代码示例,带你一探究竟,了解事件循环的工作原理及其对Node.js异步编程的影响。从基础概念到实际应用,我们将一步步解锁Node.js背后的魔法,让你的后端开发技能更上一层楼!
|
3月前
|
JavaScript 前端开发 数据库
探索Node.js中的异步编程模型
【9月更文挑战第23天】在Node.js的世界里,异步编程是核心的魔法,它让这个平台能够处理高并发请求。本文将带你深入理解Node.js的异步编程模型,通过代码示例和直观的解释,我们将一起揭开异步编程的面纱。
60 16
|
2月前
|
Web App开发 JavaScript 前端开发
JavaScript Window - 浏览器对象模型
JavaScript Window - 浏览器对象模型
27 2
|
3月前
|
JavaScript 前端开发
JavaScript HTML DOM 事件
JavaScript HTML DOM 事件
28 5