框架说明:基于面向对象编程思想以原生js语言实现,不依赖任何第三方js库, 未引用任何外部代码片段!充分考虑不同的应用场景保证框架的灵活与健壮。
* 实现功能:实现了与jQuery完全一致的架构和内部细节,设置操作内部循环可设置所有匹配节点,方法可链式调用。
* 方法分类:静态方法用于框架内部进行数据逻辑和DOM预处理以及其它全局非DOM操作;实例方法调用对应UI组件。
* 参数配置:根据实际需求配置不同参数灵活调用,无参数时使用默认配置。
* 选择器支持:id、class、标签、后代选择器、dom节点,实例化对象H("css选择器")。
* 兼容性:所有方法做了跨浏览器全兼容处理,兼容当前绝大部分浏览器(IE6/7/8/9/10/11,chrome,firefox,Safari等)。
* 变量安全:闭包环境中,保障框架自身安变量全,避免变量冲突
* 框架性能:优化代码提升性能,尽量减少浏览器重排和重绘。如赋空值释放内存; 避免DOM,BOM,ECMAScript间孤岛通信; 基于文档碎片进行DOM操作; 冒泡委托处理集合事件......
*
* 【调用】
* 静态方法: H.Method(value)
* 实例方法: H("css选择器").Method(value), H("css选择器").Method({key:value})
* H(sel).Method({属性事件配置}), H(sel).Method(组件方法,方法参数)
* 链式调用: H("css选择器").Method({key:value}).Method()
* DOM树加载完毕执行: H(fn) 等价于jQuery库中的$(fn)===$(document).ready(fn)
* 内部循环:实例方法内部对H("css选择器")匹配的节点集合进行内部循环, 可同时操作所有匹配节点
* 属性方法:opts设置组件属性事件;组件方法Method(组件方法,参数);
* 手势触控:针对移动端封装了触控手势事件(Tap轻敲、Pinch捏合、Hold长按、Swipe滑动),通过e.data报告相应手势的状态。如捏合缩放系数,滑动方向,滑动距离等。
*
* Author: wheng
* Date: 2015-07-25
*/
* 框架源码 http://whwheng.gitee.io/csdn
*
*【结构简叙】
* 框架主体在闭包环境中保证自身安全,避免变量冲突;通过H或Heng向外引用基础类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
*构造函数中实现“css选择器”获取DOM节点的功能并将节点存储到nodes属性上,遵循“公共数据属性化”的规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
*静态方法不需实例化,用于框架内部进行数据逻辑和DOM预处理或其它全局非DOM操作;实例方法结合DOM节点完成需求,如果sel匹配组件入口为一个集合,则所有节点都可以实现方法的逻辑与功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
*面向对象编程不可避免会出现this指向混乱的情况,所有类似问题通过闭包在函数外部声明var This=this;修正this指向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
*
*【实例方法案例】
H("form").formCheck();一行代码完成页面所有表单验证,实现功能如下:
*对H("form")匹配到的所有表单内部任意类型的表单元素都会进行校验。
*每个表单元素在失去焦点时会各自进行独立验证。
*表单提交时内部所有元素进行统一验证,分为“逐一校验(遇到验证未通过的元素则中断后续检查)”和“一次校验(一次性检查所有元素)”两种模式,通过配置opts["submitCheck"]=true/false切换两种模式。
*无论验证通过与否,都会有相应验证类型成功或失败的提示信息,可以配置opts参数自定义提示的内容和样式信息。
*内置常用数据类型的验证,亦可通过opts["customType"]、opts["customReg"]扩展验证类型,极大的提高了表单验证的灵活性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
|
*
H(".wrap").page(opts);页面容器传入必须参数page实例化即可实现分页控件:
*总页数pageSize=totalData总数据条数÷pageItems每页数据条数(商向上取整)。必要的配置数据在初始化时由服务器传回。
*pageSize<6页码按钮基于pageSize生成,强制pageBtns等于pageSize,生成静态页码。
*6≤pageSize<10页码基于nowPage生成,强制删除上下页按钮,定义pageBtns=6,区分nowPage在开始、结尾和中间3种情形。
*pageSize≥10页码基于nowPage生成,考虑有无上下页分别就nowPage在开始、结尾和中间2*3=6种情形。
*页码序数基于等差数列通项公式【An=a1+(n-1)*d】推导并输出在按钮data-page上,a1由pageBtns、pageSize确定。
*上下页、首尾页、当前页、禁用页、省略页按钮根据不同情况重写data-page和内容,并判断启用或者禁用,对比nowPage报告当前页等。
*监听容器点击操作修改nowPage并更新所有页码,回调函数opts["cb"]接收nowPage用于数据请求,需过滤无效页码按钮避免无效更新浪费性能。
*本控件充分利用事件委托,文档碎片createDocumentFragment()原理优化批量节点的事件处理和DOM操作,节约性能损耗。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
|
*
H("p").on ("Tap",fn/{"Tap":fn,"Hold":fn});自定义事件处理程序实现触控手势操作:
*触控手势不属于系统事件,需一套在数据层管理事件及函数添加、销毁、遍历执行的机制,模拟系统原生add/removeEventListener方法的功能。
*触控手势事件的触发依赖系统touchstart/touchmove/touchend,触点ID号identifier跟踪同一手指。通过e.data报告手势状态。
*Tap:屏幕停留时间小于250ms,因不可避免手指抖动、力度不均影响触点状态,手指离屏时坐标偏移需小于阀值(水平:10px,垂直:5px)。
*Pinch:手指移动中水平或垂直方向坐标相对进屏时偏移大于10px时可触发,两根手指水平垂直偏移量4个值中的最大者作为缩放系数e.data.k。
*Hold:手指在屏幕停留时间大于500ms,如果提前离开或者手指偏移量大于阀值(水平:10px,垂直:5px)则停止定时器不触发。
*swipe:手指需在1000ms内连续(中途不反向)移动至少30px,对比进出屏触点坐标水平垂直偏移量,取较大者来确定e.data报告滑动方向和距离。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
|
*
*【静态方法案例】
H.ajaxJsonp(opts);数据请求包含ajax和jsonp两大模块:
*jsonp:基于src跨域特性动态插入script标签发送get请求远程调用本地同名函数opts["jsonpCBname"],数据以函数传参为载体传回本地。
*发送数据opts['data']自动序列化(支持Array、Object、String等类型);通过success获取ajax或jsonp请求结果并自动解析。
*post必须定义Content-Type类型,默认setRequestHeader("Content-Type","application/x-www-form-urlencoded)。
*区分同步异步请求过程,并处理了success、error、progress、complete等四个状态事件。
*若opts['dataType']=jsonp将切换为jsonp 请求,其它值为ajax,opts['data']自动拼接到get请求地址或推入send()后post数据。
*jsonp回调函数名默认随机生成并自动发送,执行回调后立即清除本次生成的script标签防止无限插入,同时清空回调释放内存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
|
相关推荐:
以上是前端框架Heng.js详解的详细内容。更多信息请关注PHP中文网其他相关文章!