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

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
小众软件
小众软件
GbyAI
GbyAI
J
Java Code Geeks
B
Blog
Blog — PlanetScale
Blog — PlanetScale
宝玉的分享
宝玉的分享
M
MIT News - Artificial intelligence
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
阮一峰的网络日志
阮一峰的网络日志
NISL@THU
NISL@THU
T
Tenable Blog
S
Schneier on Security
T
Tor Project blog
V
V2EX
S
Secure Thoughts
P
Privacy International News Feed
Spread Privacy
Spread Privacy
博客园 - 三生石上(FineUI控件)
博客园_首页
T
Threatpost
月光博客
月光博客
Know Your Adversary
Know Your Adversary
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss
H
Help Net Security
The Hacker News
The Hacker News
A
Arctic Wolf
B
Blog RSS Feed
雷峰网
雷峰网
The Last Watchdog
The Last Watchdog
S
SegmentFault 最新的问题
博客园 - 【当耐特】
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
A
About on SuperTechFans
P
Palo Alto Networks Blog
Attack and Defense Labs
Attack and Defense Labs
N
News | PayPal Newsroom
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Securelist
L
LangChain Blog
I
InfoQ

博客园 - 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