因为公司还有还有一些老项目使用的是前后端不分离的形式,不得不采用jQuery作为技术栈进行前端开发。考虑到函数排序很随性可能导致后期维护麻烦的情况,按照知乎小爝Live所推荐的方式做了一次改版,感觉还行,特来分享。
整体页面结构如下
;(function (global, $, doc) { ‘use strict’; var Application = function () { this.a = 1, this.b = 2, this.eventsMap = { “click #btnOne”: “funcOne”, “click #btnTwo”: “funcTwo” } this.initEvent(); }; Application.prototype = { constructor: ‘Application’, funcOne: function () { console.log(‘You are clicked btn one!’); }, funcTwo: function () { console.log(‘You are clicked btn two!’); } }; global.Application = Application; $(function () { new Application() }); })(this, jQuery, jQuery(document));
我们在每个页面下,创建一个匿名函数,传入当前上下文、jQuery对象 以及 document 元素。在一开始,在onload完成后,创建一个当前页面的业务处理对象,有点像接口的感觉。然后依次设定私有变量,当前页面的事件映射和初始化函数,并将所有函数绑定到原型上,方便使用。
关于 eventsMap 对象的使用, 需要对其中的所有事件进行一次性全部绑定。所以初始化函数执行时应该有函数映射的初始化。函数如下:
initEventsMap: function (maps) { var matchExp = /^(\w+)\s*(.*)$/; for (var keys in constMap) { if (maps.hasOwnProperty(keys)) { var matchResult = keys.match(matchExp); doc.on(matchResult[1], matchResult[2], this[maps[keys]].bind(this)) // 原型为 document.on(event, element, function) } } }
至此,我们已经可以愉快地写函数代码了。当需要增加绑定事件时,只需要在eventsMap中注册事件即可。按照这种统一初始化绑定的思路,你还可以对选择器进行简化。
this.selectMap = { “idELement”: ‘#element’, “classElement”: “.head .page-title” } initSelector (maps) { for(var keys in maps) { if (maps.hasOwnProperty(keys)) { this[keys] = $(maps[keys]) } } }
总结:
该框架通过事件与地图的映射关系,统一对事件进行绑定,更直观的查看元素,方便定位事件位置。同时,结构清晰的代码、统一的入口更符合高内聚、低耦合的软件设计原则,有不足和地方欢迎探讨。
来源:https://www.cnblogs.com/miku561/p/12449977.html