Javascript之自定义事件
2015-06-18 17:06
766 查看
1、JS自定义事件
js自定义事件基本思路:定义一个数组,当添加事件的时候,push进去这个事件的处理函数;当执行的时候,从头遍历这个数组中每个事件处理函数,并执行。
当多个事件以及对应数据处理函数添加后,最终会得到一个类似下面的数据结构的对象:
因此,如果脱离了DOM,纯粹在数据层自定义事件的话,我们只要构建、遍历和删除 listener 对象即可。
1.1 函数式实现
函数式实现就是定义添加事件、触发事件和删除事件的三个方法,在需要的地方直接调用这些方法。
这种实现方式的缺点是:过多使用全局变量,方法无级联。
1.2 字面量实现
为了减少全局变量,我们可以采用对象字面量的方式。
完整的字面量实现方式的代码如下:
js自定义事件测试
参考文章:http://www.zhangxinxu.com/wordpress/?p=2330
js自定义事件基本思路:定义一个数组,当添加事件的时候,push进去这个事件的处理函数;当执行的时候,从头遍历这个数组中每个事件处理函数,并执行。
当多个事件以及对应数据处理函数添加后,最终会得到一个类似下面的数据结构的对象:
listener = { 'click': [fun1, fun2], 'dbclick': [fun3, fun4], 'myevent': [fun5] }
因此,如果脱离了DOM,纯粹在数据层自定义事件的话,我们只要构建、遍历和删除 listener 对象即可。
1.1 函数式实现
函数式实现就是定义添加事件、触发事件和删除事件的三个方法,在需要的地方直接调用这些方法。
var listener = {}; var addEvent = function(type, fn) { // 添加 }; var fireEvent = function(type) { // 触发 }; var removeEvent = function(type, fn) { // 删除 };
这种实现方式的缺点是:过多使用全局变量,方法无级联。
1.2 字面量实现
为了减少全局变量,我们可以采用对象字面量的方式。
完整的字面量实现方式的代码如下:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <body> <button id="mybutton">Click</button> <div style="background-color: darkgray; width:500px;height: 400px;" id="result"></div> <p> <input type="button" id="button1" value="触发alert事件" /> <input type="button" id="button2" value="清除第一个alert" /> <input type="button" id="button3" value="清除所有alert" /> </p> <p> <input type="button" id="button4" value="触发基于原型的自定义事件"/> <input type="button" id="button5" value="触发基于[伪]DOM的自定义事件"/> <input type="button" id="button6" value="删除基于[伪]DOM的自定义事件"/> </p> <script type="text/javascript" src="event.js"></script> <script type="text/javascript"> var btn = document.getElementById('mybutton'), result = document.getElementById('result'); function triggerDiv1() { result.innerHTML += '触发了一次插件方式自定义事件' + '<br/>'; } function triggerDiv2() { result.innerHTML += '再次触发了插件方式自定义事件' + '<br/>'; } //封装 div = $(btn); //绑定两次回调,支持链式 div.add('customTrigger', triggerDiv1).add('customTrigger', triggerDiv2); btn.onclick = function() { div.trigger('customTrigger'); } var btn1 = document.getElementById('button1'), btn2 = document.getElementById('button2'), btn3 = document.getElementById('button3'), fun1, fun2; //添加自定义事件 Event.addEvent('objEvent', fun1 = function() { result.innerHTML += '触发了一次字面量方式的自定义事件' + '<br/>'; }).addEvent('objEvent', fun2 = function() { result.innerHTML += '再次触发了字面量方式的自定义事件' + '<br/>'; }); btn1.onclick = function() { Event.triggerEvent('objEvent'); } btn2.onclick = function() { Event.removeEvent('objEvent', fun1); result.innerHTML += '移除了字面量方式的自定义事件fun1' + '<br/>'; } btn3.onclick = function() { Event.removeEvent('objEvent'); result.innerHTML += '移除了所有字面量方式的自定义事件' + '<br/>'; } var btn4 = document.getElementById('button4'), proEvt = new EventTarget(), onceFun; proEvt.addEvents({ 'once': function() { result.innerHTML += 'once自定义事件只会触发一次' + '<br/>'; this.removeEvent('once'); }, 'every': function() { result.innerHTML += 'every自定义事件每次都会触发' + '<br/>'; } }); btn4.onclick = function() { proEvt.triggerEvents(['once', 'every']); } var fnClick = function(e) { e = e || window.event; var target = e.target || e.srcElement; if(target.nodeType === 1) { result.innerHTML += '点击类型:' + e.type + '<br/>'; $$(target).triggerEvent('show_result'); }; }, domFun1 = function() { result.innerHTML += 'DOM自定义事件<br/>'; }, domFun2 = function() { result.innerHTML += 'DOM自定义事件Again<br/>'; } var btn5 = document.getElementById('button5'); $$(btn5).addEvent('click', fnClick).addEvent('show_result', domFun1).addEvent('show_result', domFun2); var btn6 = document.getElementById('button6'); $$(btn6).addEvent('click', function() { $$(btn5).removeEvent('show_result', domFun1).removeEvent('show_result', domFun2); result.innerHTML += 'DOM自定义事件清除完成<br/>'; }); </script> </body>
js自定义事件测试
参考文章:http://www.zhangxinxu.com/wordpress/?p=2330
相关文章推荐
- ServiceStack.Text 的JSON序列号和反序列化
- js判断正整数
- 理解Javascript_14_函数形式参数与arguments
- JS高级编程5-作用域安全的构造函数
- 理解Javascript_12_执行模型浅析
- JavaScript Number 对象 Javascript Array对象 Location 对象方法 String对象方法
- JS高级编程4-函数节流
- js本地图片预览,兼容ie[6-9]、火狐、Chrome17+、Opera11+、Maxthon3
- 理解Javascript_10_对象模型
- JS高级编程3-函数柯里化
- JavaScript深究系列 [一]
- JS高级编程2-使用高阶函数
- js中两个对象的比较
- JS高级编程2-使用高阶函数
- 文章标题
- javascript实现分页效果
- JS高级编程1-函数绑定
- js限制文本框只可以输入数字
- POJ 1062 最短路Dijstra
- js 日期格式转换