JS事件模型

事件模型

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

设计事件对象

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

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
    });
时间: 2024-08-01 23:20:28

JS事件模型的相关文章

ExtJS框架的事件模型及其常用功能

前言 工作中用ExtJS有一段时间了,Ext丰富的UI组件大大的提高了开发B/S应用的效率.虽然 近期工作中天天都用到ExtJS,但很少对ExtJS框架原理性的东西进行过深入学习,这两天花了些时间学习 了下.我并不推荐大家去研究ExtJS框架的源码,虽然可以学习其中的思想和原理,但太浪费精力了,除 非你要自己写框架. 对于ExtJS这种框架,非遇到"杂症"的时候我觉得也没必要去研究其源码和 底层的原理,对其一些机制大致有个概念,懂得怎么用就行,这也是本篇博文的主要目的. Ext自 己的

用IE 10触控事件模型调试响应式Web设计

目前我正在研究IE 10触控事件.虽然我已经十分幸运地拥有了一台Windows 8平板电脑,但是我仍在寻找一种更加简便的方法,即无需每次切换至平板电脑,便可直接在经典笔记本上执行基本测试的方法.在寻找该方法的过程中,我发现了一些技巧和窍门,有了这些经验,您就可以在不使用触控设备的情况下,对代码中的IE 10触控事件进行调试了.正面效应:这种方法还可帮助您测试.调试响应式Web设计! 先决条件:在学习本教程之前,首先需要执行下列步骤: IE 10触控事件模型 如果您对触控执行方式还不甚了解,可以先

Node.js事件驱动模型

一.传统线程网络模型        在了解Node.js事件驱动模型之前,我们先了解一下传统的线程网络模型,请求进入web服务器(IIS.Apache)之后,会在线程池中分配一个线程来线性同步完成请求处理,直到请求处理完成并发出响应,结束之后线程池回收. 这就会就会带来以下几个问题 : 1.由于线程池中线程个数有限,对于频繁请求时,就会出现等待,严重的甚至会把服务器挂掉 2.对于高并发的时候,为了防止出现脏数据就会使用锁来解决,一些I/O事务可能消耗很长得时间,这样就会出现一些线程等待,效率低下

Javascript基础知识(一)核心基础语法与事件模型_基础知识

一.Javascript核心基础语法 1.Javascript是一门增加交互效果的编程语言,它最初由网景公司发明,最后提交给ECMA(欧洲计算机制造商协会),ECMA将Javascript标准化,其命名为Javascript. 2.Javascript是一门解释性语言,无需编译就可以直接在浏览器下运行. 3.Javascript的用途?  1.可以控制网页中所有元素,增加.删除.修改元素的属性.  2.可以在html中放入动态文本.  3.响应用户在使用网页时产生的事件.  4.校验用户输入的数

深入理解Node.js 事件循环和回调函数_node.js

本文详细的介绍了Node.js 事件循环和Node.js回调函数,废话不多说了,具体看下面把.  一.Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高.Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发.Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现.Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观

javascript事件模型介绍_基础知识

一.原始事件模型 其事件类型:分为"输入事件(如onclicki)"和"语义事件(如onsubmit)" 事件程序的注册可以以下几种方式: 1.JS代码作为HTML性质值 复制代码 代码如下: <input type="button" value="Press me" onclick="alert('thanks');" 2.事件处理程序作为JS属性 附注:文档中的每个HTML元素在文档树中都有一个相

jQuery学习5 jQuery事件模型_jquery

jQuery事件模型的功能有: 提供建立事件处理程序的统一方法: 允许在每个元素上为每个时间类型建立多个处理程序: 采用标准的事件类型名称,例如click或mouseover: 使用Event实例可用作处理程序的参数: 对Event实例的最常用的属性进行规范化: 为取消事件和阻塞默认操作提供统一方法. jQuery绑定事件处理程序: bind()命令 $('img').bind('click',funciton(event){alert('Hi there');}); 该语句为页面上的图片绑定已

jQuery学习4 浏览器的事件模型_jquery

首先要知道DOM的两级模式:DOM0级和DOM2级 在DOM0级事件处理程序是通过把函数实例的引用指派到DOM元素的属性而声明的. 声明DOM第0级事件处理程序 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>DOM Lev

快速掌握Node.js事件驱动模型_node.js

一.传统线程网络模型 在了解Node.js事件驱动模型之前,我们先了解一下传统的线程网络模型,请求进入web服务器(IIS.Apache)之后,会在线程池中分配一个线程来线性同步完成请求处理,直到请求处理完成并发出响应,结束之后线程池回收. 这就会就会带来以下几个问题 : 1.由于线程池中线程个数有限,对于频繁请求时,就会出现等待,严重的甚至会把服务器挂掉 2.对于高并发的时候,为了防止出现脏数据就会使用锁来解决,一些I/O事务可能消耗很长得时间,这样就会出现一些线程等待,效率低下 二.事件驱动