惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园 - pomp

Jquery资源-床头必备 全球网络的主色调是什么? user-agent检测详解 【转】前端开发大众手册(包括工具、网址、经验等) 基于JQuery的7款选项卡(Tabs)实例 什么是ImageLazyLoad技术 IE6下PNG图片透明 (二) 样式定义的权重问题 记录【转】 ie6 下最佳 PNG透明方案【转】 Javascript 判断浏览器是否为IE的最短方法 乔布斯:关于 Flash 的思考[转] Flex 开发必备10武器(转载) Flex4 SDK 新特性 PPT SQL中获得EXEC后面的sql语句或者存储过程的返回值的方法 【收藏】 SQL存储过程学习中的概念汇总 CuteEditor编辑器(转) SqlDataSource查询设置 sql select语句详解 跨页传值方法集锦
详解Javascript事件驱动的来龙去脉【转】
pomp · 2010-09-17 · via 博客园 - pomp

对于Javascript事件驱动大家了解很多,本文将从一个应用场景开始讲起,希望本文对大家使用好Javascript事件驱动有所帮助。

首先来看看这样一个应用场景,网页上有个链接,比如说高级搜索,点击以后会出现一个搜索面板。由于面板里有很多搜索字段,而这些搜索字段又有很多数据,因此决定采用异步来加载该搜索面板。以jQuery为例,代码可能会这么写:

  1. $('#advance_search’).bind(‘click’, function(e){  
  2. $('#advance_search_panel’).load(‘/xxx/advance_search.html"’);  
  3. }); 

但是呢,又需要在加载后做一些处理,比如说隐藏掉正在加载的提示文字或者图标,好说,就给load加上callback

  1. ….load(‘…..', function(){  
  2. $('#waiting_message’).hide();  
  3. }) 

面板里面有个搜索按钮,点击进行搜索,加载完需要绑定click事件,于是我们又在下面加上:

  1. ….load(‘…..', function(){  
  2. $('#waiting_message’).hide();  
  3. $('#search_button’).bind(‘click’, do_advance_search);  
  4. }) 

某一天,其他有些页面也要加上这个高级搜索,但是呢,加载完成后的处理又都不一样,有的页面需要隐藏掉某个div,有的页面需要绑定一些操作等,这时候怎么办?难道都去改这个load方法吗?

有一种方法可以解决这个问题,加上callback参数用以回调,比如 new AdvancedSearch(callback); 当然,除此以外,其实还有一种更优雅的方法,事件驱动。

代码写起来很简单,加载完毕后触发这个事件:

  1. ….load(‘….', function() {  
  2. $().trigger(‘advanced_search_load_complete’);  
  3. }) 

需要在加载完成后做某些操作的地方绑定一下事件处理函数即可:

  1. $().bind(‘advanced_search_load_complete’, function(){  
  2. ……  
  3. }); 

封装的地方不用任何改动,其它地方爱做什么操作就做什么操作,这就是事件驱动的魅力,极大的松耦合。

总结一下,事件驱动好处是什么呢?

1. 松耦合的交互,事件发布者和订阅者无须知道对方的存在。

2. 多对多的关系,多个事件发布者对应多个订阅者。

3. 一个个事件发布出来,针对这些事件作出响应,这就是一个业务场景,每个步骤清晰自然。

4. 事件发布可以带参数,事件处理者可以拿到关于该事件的任何数据。

基于事件驱动的Javascript编程模型不同于常见的全局函数随便调的Javascript,它的模块更内聚,更容易复用,在业务不可预知的前提下,业务代码改变得更少。

目标,更漂亮的Javascript事件驱动,我们都来拥抱它。

原文标题:事件驱动的javascript