ajax中从另一个页面的表单获取数据_JavaScript的订阅者模式--实现一个简单的事件监听框架...

本文探讨了在开发中遇到的模块间强耦合问题,特别是在用户登录后需要异步获取数据的场景。通过引入事件监听(发布-订阅模式),可以避免在登录回调中直接调用各模块的函数,降低耦合度。文章提供了JavaScript实现的简单事件监听框架的核心代码,包括`subscribe`、`publish`和`unsubscribe`函数,并给出了运行示例。
摘要由CSDN通过智能技术生成

ffa5578b638e55301f5da29c0170a4c3.png

为什么要用到事件监听?

在实际开发过程中,经常会遇到下面这种情况:

某个页面包含Header头部、Nav导航、用户个人信息等。这些模块都要等用户登录之后通过发起Ajax异步请求来获取数据。

如果按照之前的做法,需要我们在Login成功之后的回调函数中调用各个模块获取数据的函数。这样看貌似没有什么问题,但只要页面的模块发生了改变,我们就需要在Login.success()中进行修改。举一个简单的例子:

原来的模块是这个样子的:

e567a49469af7ee73916bbd2f47abef2.png

用户登录成功后调用各模块的getData()分别发出异步请求来获取数据。

现在Profile模块被删除,添加一个List模块,那我们就不得不在Login的回调函数中也进行相应的修改。这样各模块就与Login直接发生了强耦合:

cd84971c3fc77a59e1bd367fa76e307c.png

再比如,在做类似百度贴吧发帖这样功能的页面时:在用户提交发帖的表单后,需要刷新帖子的列表。这个时候就要调用列表模块的refresh函数。这个时候如果提交表单的函数没有提供提交成功的回调函数的话,我们就无法判断用户什么时候提交了表单。

针对这个问题,就出现了事件监听这一解决方案。使用事件监听机制后,我们只需要在Login的回调函数中发布一个事件。相应的,我们只需要在模块初始化时让模块订阅相应的事件即可。在事件触发后,就会调用模块提供的函数。

5acb214fd93158fa28cdc91f79fc6519.png

这个其实就是JavaScript中的发布-订阅模式,又叫做观察者模式。利用这一模式我们就可以来实现一个简单的事件监听框架。

代码实现:

核心代码

__Core对象为框架的核心代码。其中__List数组用于存储事件名和对应的函数。

b6692e9d30886cbebe06a560aecc21e0.png

subscribe函数:

72f09a3babbd39d8f9e003e67f68dc1c.png

函数接收两个参数,事件名,事件触发后的函数。subscribe函数负责将提供的函数存放到对应的事件数组中。

publish函数:

f623432aa1d55adc2bd4a633e0d4d4b6.png

考虑到某个模块可能会触发多个事件,这里通过使Array.prototype.slice.call(arguments)来收集参数,即发布的事件名。通过遍历事件名对应的函数数组并执行对应的函数来达到“广播”的效果。

unsubscribe函数:

ef417bf216bfd1d651096f02ce77a206.png

模块还可以取消订阅。函数接收两个参数,取消订阅的事件名、对应的函数。若不传入函数,则默认清除事件对应的所有函数。

整体框架:

45b62f2c8f5ad274ebc61a1ede71dc4a.png

出于框架兼容度的考虑,这里的写法参考了JQuery的源码,利用了闭包函数的特性创建了一个安全的作用域。代码刚开始会通过是否存在window对象来判断运行环境是否为浏览器。如果进入if语句,则为非浏览器环境,为factory添加一个true参数。若存在这一参数则不会为全局的window对象添加Events对象。

代码总览:

7ad4c4dab612c2eb0326c77abb29bedf.png

原生Demo:

aa1c9c616ccba008c23a2ee264d2e435.png

效果浏览:

点击前:

d48e814fd5d09d2c2b624403071a69ac.png

点击后:

978ba90c468f4cb283cf2423ca41298f.png

参考资料:

javascript中的发布者与订阅者_duanshilong的博客-CSDN博客_发布者订阅者​blog.csdn.net
2c7785880b305f01ac02f62090ec89aa.png

源代码:

syk2018/Events-listener​github.com
c18d44af80f2617f7ff22997df62e87c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值