为了让Page对象更专注于业务逻辑,将其它的操作转移出去,因此引入了App对象。App对象起到了管理多个Page对象的作用。有了App对象后, Page对象只需要负责渲染页面以及绑定事件,其它的都让App自动帮Page解决。类似以下代码:
首先创建一个App对象
var app = new App();
再创建一个Page对象,只需要重写getDomObj方法以及相关的事件方法。然后调用
var indexPage = new Page();
indexPage.getDomObj = function () {};
相关事件的方法定义(省略),最后通过一下代码切换
app.render(indexPage);
启用app.render方法后,将会自动卸载之前的页面,将当前的页面初始化插入页面中,从而简化了开发流程。App对象的代码如下
让App对象更好的管理Page对象,改造Page对象,新增_dispose和_initialize方法,分别指向装载和卸载操作,Page构造函数如下代码
其中domList与eventList存放着对应dom元素以及事件方法,通过规范化的数据结构,用于自动化绑定以及卸载。
这里是卸载与装载的实现,分别调用了以下方法
_removeEventListeners(): 移除所有的挂在页面的事件
_removeDom() : 清除dom元素
getDomObj(container): 缓存元素以及缓存事件存于domList和eventList 中,然后通过_addEventListener()方法一起绑定,需要开发者重写
_addEventListeners(); 将事件绑定到页面上。
这里的命名规则,内部使用的方法以下划线开头,提供用户实现的以驼峰命名。
以下为domList与eventList存储数据的格式
domList为简单对象,以key-value的格式, value代表dom元素,通过attachDom方法来存储,比如page.attachDom("#id", "id", dom); id为key, value为该代码document.querySelector("#id")获得的元素
eventList是一个数组,每个元素都是一个对象eventObj, eventObj拥有key字段和eventArray字段, key字段与domList的key对应,eventArray是一个数组,存储绑定事件的详情,每个事件详情都有method字段代表事件类型, eventArray字段代表事件函数的数组,每个事件函数都有函数本身,以及事件的传播方向(冒泡或者捕获),还有一个自定义的与bind函数,用于把事件函数的作用域转移到该Page对象,从而达到更好的封装作用。通过attachEvent方法进行存储事件。
以下为attachDom与attachEvent方法的代码定义
attachEvent事件中,调用了_getEvent方法,主要起到防止多次绑定完全相同的事件。
定义完数据结构以及数据的存储方式,下面就是关于数据操作处理,以下是_remvoeDom方法, _addEventListeners方法以及_removeEventListener方法的定义
进行代码重写之前,引入两个常用辅助函数,分别挂在App函数下面。
预备代码完毕, 接下开始重写页面代码, 这里html以及css完全不变, 只要更改js代码
最后初始化app
总结:引入了App对象管理Page对象是有必要的,可以让使用者更专注自己的习惯来编写代码。与现实中类似的,既然有管理者,被管理者必须要服从管理,因此对于Page对象做了很多相应的更改。这篇的代码有点多,但是这是做单页面的核心部分,通过代码的分离,可以为以后更好的维护打下坚实的基础。
后续更新:下一篇将引入tap事件和slide事件,这两个事件是移动端非常常用的,通过tap事件来代替click事件, slide事件用于简单的手势操作。
原生开发移动web单页面(step by step)1——传统页面的开发
原生开发移动web单页面(step by step)2——Page对象
原生开发移动web单页面(step by step)4——tap事件与slide事件