├── .DS_Store ├── .gitignore ├── NEJ ├── .DS_Store ├── components │ ├── login.html │ └── login.js ├── index.html ├── index.js ├── nej │ ├── .DS_Store │ └── src │ │ ├── .DS_Store │ │ ├── base │ │ ├── .DS_Store │ │ ├── .dep │ │ ├── chain.js │ │ ├── config.js │ │ ├── constant.js │ │ ├── element.js │ │ ├── event.js │ │ ├── global.js │ │ ├── klass.js │ │ ├── platform.js │ │ ├── platform │ │ │ ├── config.js │ │ │ ├── config.patch.js │ │ │ ├── element.js │ │ │ ├── element.patch.js │ │ │ ├── event.js │ │ │ ├── event.patch.js │ │ │ ├── util.js │ │ │ └── util.patch.js │ │ └── util.js │ │ └── define.js └── regularjs │ └── dist │ └── regular.js ├── README.md ├── spa ├── .gitignore ├── README.md ├── app │ ├── assets │ │ ├── css │ │ │ ├── bootstrap.css │ │ │ └── index.css │ │ ├── favicon.ico │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ ├── img │ │ │ ├── logo.png │ │ │ └── logo.svg │ │ └── index.html │ └── script │ │ ├── components │ │ ├── mask.js │ │ ├── menu.js │ │ ├── modal.html │ │ ├── modal.js │ │ ├── notify.js │ │ ├── pager.js │ │ └── progress.js │ │ ├── index.js │ │ ├── module │ │ ├── app.js │ │ ├── blog.detail.js │ │ ├── blog.edit.js │ │ ├── blog.js │ │ ├── blog.list.js │ │ ├── chat.js │ │ ├── index.js │ │ ├── login.js │ │ └── poster.js │ │ ├── routes.js │ │ ├── service │ │ ├── blog.js │ │ └── index.js │ │ └── util │ │ ├── consts.js │ │ ├── dom.js │ │ ├── extension.js │ │ ├── fetch.js │ │ └── helper.js ├── gulpfile.js ├── package.json └── scripts │ ├── routes.js │ └── webpack.config.js └── webpack ├── bundle.js ├── index.html ├── package.json ├── src ├── index.js ├── login-amd.js ├── login-babel.js ├── login-commonjs.js ├── login.html └── login.rgl └── webpack.config.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/regularjs/example/aa095048f1c964c0817ffc3a52ce24288bc19731/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/node 2 | 3 | ### Node ### 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directory 30 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 31 | node_modules 32 | 33 | -------------------------------------------------------------------------------- /NEJ/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/regularjs/example/aa095048f1c964c0817ffc3a52ce24288bc19731/NEJ/.DS_Store -------------------------------------------------------------------------------- /NEJ/components/login.html: -------------------------------------------------------------------------------- 1 | 2 |

{title}

3 |
4 |
5 | 6 | 7 |
8 |
9 | 10 | 11 |
12 |
13 | 14 |
15 |
-------------------------------------------------------------------------------- /NEJ/components/login.js: -------------------------------------------------------------------------------- 1 | 2 | define(['text!./login.html', 'pro/regularjs/dist/regular'] ,function( tpl ){ 3 | 4 | // 注意Regular是全局取的,而不是注入的 5 | return Regular.extend({ 6 | 7 | name: 'login-nej', 8 | 9 | template: tpl 10 | 11 | }) 12 | 13 | 14 | }) -------------------------------------------------------------------------------- /NEJ/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Document 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /NEJ/index.js: -------------------------------------------------------------------------------- 1 | 2 | define(['./components/login.js'] ,function(Login){ 3 | 4 | new Login({ 5 | data: { 6 | title: "NEJ + regularjs DEMO" 7 | } 8 | }).$inject('#app'); 9 | 10 | }) -------------------------------------------------------------------------------- /NEJ/nej/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/regularjs/example/aa095048f1c964c0817ffc3a52ce24288bc19731/NEJ/nej/.DS_Store -------------------------------------------------------------------------------- /NEJ/nej/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/regularjs/example/aa095048f1c964c0817ffc3a52ce24288bc19731/NEJ/nej/src/.DS_Store -------------------------------------------------------------------------------- /NEJ/nej/src/base/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/regularjs/example/aa095048f1c964c0817ffc3a52ce24288bc19731/NEJ/nej/src/base/.DS_Store -------------------------------------------------------------------------------- /NEJ/nej/src/base/.dep: -------------------------------------------------------------------------------- 1 | 基础库依赖关系 2 | 3 | global <- klass 4 | <- platform 5 | <- config <- constant 6 | <- util <- element <-> event -------------------------------------------------------------------------------- /NEJ/nej/src/base/chain.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ------------------------------------------ 3 | * 可链式接口实现代理文件 4 | * @version 1.0 5 | * @author genify(caijf@corp.netease.com) 6 | * ------------------------------------------ 7 | */ 8 | /** @namespace CHAINABLE */ 9 | /** @module base/chain */ 10 | NEJ.define([ 11 | 'base/util' 12 | ],function(_u,_p){ 13 | var _cache = {}; 14 | /** 15 | * 添加可链式调用的接口 16 | * 17 | * 添加可链式接口 18 | * ```javascript 19 | * NEJ.define([ 20 | * 'base/chain' 21 | * ],function(_l){ 22 | * var _map = {}; 23 | * 24 | * _map._$api1 = function(){ 25 | * // TODO 26 | * } 27 | * 28 | * _map._$api2 = function(){ 29 | * // TODO 30 | * } 31 | * 32 | * _l._$merge(_map); 33 | * }); 34 | * ``` 35 | * 36 | * 使用链式调用接口 37 | * ```javascript 38 | * NEJ.define([ 39 | * '/path/to/api.js', 40 | * 'util/chain/chainable' 41 | * ],function(_x,$){ 42 | * // 使用链式调用api 43 | * $('body > p')._$api1()._$api2(); 44 | * }); 45 | * ``` 46 | * 47 | * @method module:base/chain._$merge 48 | * @param {Object} arg0 - 接口集合 49 | * @return {Void} 50 | */ 51 | _p._$merge = function(_map){ 52 | _u._$merge(_cache,_map); 53 | }; 54 | /** 55 | * 导出链式接口列表 56 | * 57 | * @method module:base/chain._$dump 58 | * @return {Object} 链式接口列表 59 | */ 60 | _p._$dump = function(){ 61 | return _cache; 62 | }; 63 | /** 64 | * 清除链式列表 65 | * 66 | * @method module:base/chain._$clear 67 | * @return {Void} 68 | */ 69 | _p._$clear = function(){ 70 | _cache = {}; 71 | }; 72 | 73 | return _p; 74 | }); 75 | -------------------------------------------------------------------------------- /NEJ/nej/src/base/config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ------------------------------------------ 3 | * 平台配置信息 4 | * @version 1.0 5 | * @author genify(caijf@corp.netease.com) 6 | * ------------------------------------------ 7 | */ 8 | /** @module base/config */ 9 | NEJ.define([ 10 | './global.js', 11 | '{platform}config.js' 12 | ],function(NEJ,_h,_p,_o,_f,_r){ 13 | /** 14 | * 取Frame跨域Ajax代理文件,通过NEJ_CONF的p_frame配置给定域名的代理文件地址 15 | * 16 | * @method module:base/config._$getFrameProxy 17 | * @see module:base/config._$get 18 | * @param {String} arg0 - 请求地址或者域名 19 | * @return {String} 代理文件地址 20 | */ 21 | _p._$getFrameProxy = function(_url){ 22 | var _host = _h.__url2host(_url); 23 | return _p._$get('frames')[_host]|| 24 | (_host+'/res/nej_proxy_frame.html'); 25 | }; 26 | /** 27 | * 取Flash跨域Ajax配置文件,通过NEJ_CONF的p_flash配置给定域名的代理文件地址 28 | * 29 | * @method module:base/config._$getFlashProxy 30 | * @see module:base/config._$get 31 | * @param {String} arg0 - 请求地址或者域名 32 | * @return {String} 代理文件地址 33 | */ 34 | _p._$getFlashProxy = function(_url){ 35 | return _p._$get('flashs')[_h.__url2host(_url)]; 36 | }; 37 | /** 38 | * 获取NEJ配置信息,通过NEJ_CONF配置相关信息 39 | * 40 | * ```javascript 41 | * window.NEJ_CONF = { 42 | * // resource root 43 | * // defalut value -> '/res/' 44 | * root : '/nej/' 45 | * // blank image for ie6-ie7 46 | * // default value -> $root+'nej_blank.gif' 47 | * blank : '/res/nej_blank.gif' 48 | * // localstorage flash 49 | * // default value -> $root+'nej_storage.swf' 50 | * storage : '/res/nej_storage.swf' 51 | * // audio player flash 52 | * // default value -> $root+'nej_player_audio.swf' 53 | * audio : '/res/nej_player_audio.swf' 54 | * // video player flash 55 | * // default value -> $root+'nej_player_video.swf' 56 | * video : '/res/nej_player_video.swf' 57 | * // clipboard flash 58 | * // default value -> $root+'nej_clipboard.swf' 59 | * clipboard : '/res/nej_clipboard.swf' 60 | * // https request proxy 61 | * // default value -> $root+'nej_proxy_flash.swf' 62 | * ajax : '/res/nej_proxy_flash.swf' 63 | * // portrait root 64 | * // default value -> $root+'portrait/' 65 | * portrait : '/res/portrait/' 66 | * // cross domain xhr request for ie6-ie9 67 | * // if path not start with http[s]:// 68 | * // will use /res/nej_proxy_frame.html as default 69 | * p_frame:['http://c.d.com/html/nej_proxy_frame.html'] 70 | * // flash crossdomain.xml file path 71 | * // default value -> http://a.b.com/crossdomain.xml 72 | * p_flash:['http://a.b.com/proxy/crossdomain.xml'] 73 | * // CSRF cookie name and parameter name 74 | * // set p_csrf:true to use URS config {cookie:'AntiCSRF',param:'AntiCSRF'} 75 | * // default value -> {cookie:'',param:''} 76 | * p_csrf:{cookie:'AntiCSRF',param:'AntiCSRF'} 77 | * }; 78 | * ``` 79 | * 80 | * 配置标识支持 81 | * 82 | * | 标识 | 说明 | 83 | * | :-- | :-- | 84 | * | portrait | 表情根路径 | 85 | * | blank.png | 空白图片文件地址 | 86 | * | ajax.swf | Ajax代理Flash文件地址 | 87 | * | chart.swf | 图标Flash文件地址 | 88 | * | audio.swf | 实现Audio功能的Flash文件地址 | 89 | * | video.swf | 实现Video功能的Flash文件地址 | 90 | * | clipboard.swf | 实现剪切板功能的Flash文件地址 | 91 | * | upload.image.swf | 实现图片上传功能的Flash文件地址 | 92 | * | storage.swf | 实现本地存储功能的Flash文件地址 | 93 | * 94 | * @method module:base/config._$get 95 | * @param {String} arg0 - 配置标识 96 | * @return {Variable} 配置信息 97 | */ 98 | _p._$get = function(_key){ 99 | return _h.__get(_key); 100 | }; 101 | 102 | if (CMPT){ 103 | NEJ.copy(NEJ.P('nej.c'),_p); 104 | } 105 | 106 | return _p; 107 | }); 108 | -------------------------------------------------------------------------------- /NEJ/nej/src/base/constant.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ------------------------------------------ 3 | * 常量定义文件 4 | * @version 1.0 5 | * @author genify(caijf@corp.netease.com) 6 | * ------------------------------------------ 7 | */ 8 | /** @module base/constant */ 9 | NEJ.define([ 10 | './global.js', 11 | './config.js' 12 | ],function(NEJ,_c,_p,_o,_f,_r){ 13 | var _seed = +new Date; 14 | /** 15 | * 找不到指定内容的错误码 16 | * 17 | * @const {Number} module:base/constant._$CODE_NOTFUND 18 | */ 19 | _p._$CODE_NOTFUND = 10000-_seed; 20 | /** 21 | * 需要指定的参数未指定的错误码 22 | * 23 | * @const {Number} module:base/constant._$CODE_NOTASGN 24 | */ 25 | _p._$CODE_NOTASGN = 10001-_seed; 26 | /** 27 | * 不支持操作的错误码 28 | * 29 | * @const {Number} module:base/constant._$CODE_NOTSPOT 30 | */ 31 | _p._$CODE_NOTSPOT = 10002-_seed; 32 | /** 33 | * 操作超时的错误码 34 | * 35 | * @const {Number} module:base/constant._$CODE_TIMEOUT 36 | */ 37 | _p._$CODE_TIMEOUT = 10003-_seed; 38 | /** 39 | * 字符串作为脚本执行异常的错误码 40 | * 41 | * @const {Number} module:base/constant._$CODE_ERREVAL 42 | */ 43 | _p._$CODE_ERREVAL = 10004-_seed; 44 | /** 45 | * 回调执行异常的错误码 46 | * 47 | * @const {Number} module:base/constant._$CODE_ERRCABK 48 | */ 49 | _p._$CODE_ERRCABK = 10005-_seed; 50 | /** 51 | * 服务器返回异常的错误码 52 | * 53 | * @const {Number} module:base/constant._$CODE_ERRSERV 54 | */ 55 | _p._$CODE_ERRSERV = 10006-_seed; 56 | /** 57 | * 异常终止的错误码 58 | * 59 | * @const {Number} module:base/constant._$CODE_ERRABRT 60 | */ 61 | _p._$CODE_ERRABRT = 10007-_seed; 62 | /** 63 | * 请求头content-type统一名称 64 | * 65 | * @const {Number} module:base/constant._$HEAD_CT 66 | */ 67 | _p._$HEAD_CT = 'Content-Type'; 68 | /** 69 | * 文本请求头content-type值 70 | * 71 | * @const {String} module:base/constant._$HEAD_CT_PLAN 72 | */ 73 | _p._$HEAD_CT_PLAN = 'text/plain'; 74 | /** 75 | * 文件请求头content-type值 76 | * 77 | * @const {String} module:base/constant._$HEAD_CT_FILE 78 | */ 79 | _p._$HEAD_CT_FILE = 'multipart/form-data'; 80 | /** 81 | * 表单请求头content-type值 82 | * 83 | * @const {String} module:base/constant._$HEAD_CT_FORM 84 | */ 85 | _p._$HEAD_CT_FORM = 'application/x-www-form-urlencoded'; 86 | /** 87 | * 空图片BASE64编码地址,低版本浏览器使用图片地址 88 | * 89 | * @const {String} module:base/constant._$BLANK_IMAGE 90 | */ 91 | _p._$BLANK_IMAGE = _c._$get('blank.png')||'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='; 92 | 93 | if (CMPT){ 94 | NEJ.copy(NEJ.P('nej.g'),_p); 95 | } 96 | 97 | return _p; 98 | }); 99 | -------------------------------------------------------------------------------- /NEJ/nej/src/base/event.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ------------------------------------------ 3 | * 事件接口实现文件 4 | * @version 1.0 5 | * @author genify(caijf@corp.netease.com) 6 | * ------------------------------------------ 7 | */ 8 | /** @module base/event */ 9 | NEJ.define([ 10 | './global.js', 11 | './element.js', 12 | './util.js', 13 | './chain.js', 14 | '{platform}event.js' 15 | ],function(NEJ,_e,_u,_x,_h,_p,_o,_f,_r){ 16 | // {id:{type:[{type:'click',func:function,sfun:function,capt:true},...]}} 17 | // id - element id 18 | // type - event name, no on prefix 19 | // func - event after wrapper 20 | // capt - capture flag 21 | // sfun - event before wrapper 22 | // link - events link to this event [[element,type,handler,capture],...] 23 | var _xcache = {}, 24 | _y = {}; // chainable methods 25 | /* 26 | * 取事件类型列表 27 | * @param {String} 事件类型 28 | * @return {Array} 事件列表 29 | */ 30 | var _getTypeList = (function(){ 31 | var _reg = /[\s,;]+/; 32 | return function(_type){ 33 | var _type = (_type||'').trim().toLowerCase(); 34 | return !_type?null:_type.split(_reg); 35 | }; 36 | })(); 37 | /* 38 | * 取鼠标相对于BODY的偏移 39 | * @param {Event} 事件对象 40 | * @param {String} 类型,X/Y 41 | * @param {String} 滚动偏移名称,Left/Top 42 | * @return {Void} 43 | */ 44 | var _getClientOffset = function(_event,_type,_name){ 45 | var _key1 = 'page'+_type; 46 | return _event[_key1]!=null?_event[_key1]:( 47 | _event['client'+_type]+ 48 | _e._$getPageBox()['scroll'+_name] 49 | ); 50 | }; 51 | /* 52 | * 取鼠标相对于页面的偏移 53 | * @param {Event} 事件对象 54 | * @param {String} 类型,X/Y 55 | * @param {String} 滚动偏移名称,Left/Top 56 | * @return {Void} 57 | */ 58 | var _getPageOffset = function(_event,_type,_name){ 59 | var _key3 = 'scroll'+_name; 60 | _node = _p._$getElement(_event), 61 | _xret = _getClientOffset(_event,_type,_name); 62 | while(!!_node&& 63 | _node!=document.body&& 64 | _node!=document.documentElement){ 65 | _xret += _node[_key3]||0; 66 | _node = _node.parentNode; 67 | } 68 | return _xret; 69 | }; 70 | /* 71 | * 格式化添加删除事件接口参数 72 | * @param {String|Node} 节点ID或者对象 73 | * @param {String} 事件类型,不带on前缀,不区分大小写,多个事件用空格分隔 74 | * @param {Function} 事件处理函数 75 | * @param {Boolean} 是否捕获阶段事件,IE低版本浏览器忽略此参数 76 | * return {Object} 格式化后参数 77 | */ 78 | var _doFormatArgs = function(_element,_type,_handler,_capture){ 79 | var _result = {}; 80 | // check element 81 | _element = _e._$get(_element); 82 | if (!_element){ 83 | return null; 84 | } 85 | _e._$id(_element); 86 | _result.element = _element; 87 | // check event handler 88 | if (!_u._$isFunction(_handler)){ 89 | return null; 90 | } 91 | _result.handler = _handler; 92 | // check type 93 | var _type = _getTypeList(_type); 94 | if (!_type){ 95 | return null; 96 | } 97 | // save info 98 | _result.type = _type; 99 | _result.capture = !!_capture; 100 | return _result; 101 | }; 102 | /** 103 | * 节点添加事件, 104 | * 支持添加自定义事件, 105 | * 对于自定义事件的实现逻辑由其他模块负责实现 106 | * 107 | * 结构举例 108 | * ```html 109 | *
123
110 | * ``` 111 | * 112 | * 脚本举例 113 | * ```javascript 114 | * NEJ.define([ 115 | * 'base/event' 116 | * ],function(_v){ 117 | * // 添加系统预定义事件 118 | * _v._$addEvent( 119 | * 'abc','mouseover',function(_event){ 120 | * // TODO something 121 | * },false 122 | * ); 123 | * 124 | * // 添加自定义事件,回车事件 125 | * _v._$addEvent( 126 | * 'abc','enter',function(_event){ 127 | * // TODO something 128 | * },false 129 | * ); 130 | * 131 | * // 添加多个事件,用空格分隔 132 | * _v._$addEvent( 133 | * 'abc','mouseover click mousedown', 134 | * function(_event){ 135 | * // TODO something 136 | * },false 137 | * ); 138 | * }); 139 | * ``` 140 | * 141 | * 带自定义事件的类构造或者对象 142 | * ```javascript 143 | * NEJ.define([ 144 | * 'base/klass', 145 | * 'base/event', 146 | * 'util/event', 147 | * 'util/event/event' 148 | * ],function(_k,_v,_t0,_t1,_p){ 149 | * // 定义类 150 | * _p._$$Klass = _k._$klass(); 151 | * var _pro = _p._$$Klass._$extend(_t0._$$EventTarget); 152 | * 153 | * // TODO 154 | * 155 | * // 添加自定义事件支持 156 | * // 对节点的事件同样支持此自定义事件 157 | * _t1._$$CustomEvent._$allocate({ 158 | * element:_p._$$Klass, 159 | * event:['ok','fail'] 160 | * }); 161 | * 162 | * // 使用事件接口添加/删除/调度事件 163 | * var _handler = function(_event){ 164 | * // TODO 165 | * }; 166 | * _v._$addEvent(_p._$$Klass,'ok',_handler); 167 | * _v._$delEvent(_p._$$Klass,'ok',_handler); 168 | * }); 169 | * ``` 170 | * 171 | * @method module:base/event._$addEvent 172 | * @see module:base/event._$delEvent 173 | * @param {String|Node|Object} arg0 - 节点或者类构造或者对象 174 | * @param {String} arg1 - 事件类型,不带on前缀,不区分大小写,多个事件用空格分隔 175 | * @param {Function} arg2 - 事件处理函数 176 | * @param {Boolean} arg3 - 是否捕获阶段事件,IE低版本浏览器忽略此参数 177 | * @return {Void} 178 | */ 179 | /** 180 | * @method CHAINABLE._$addEvent 181 | * @see module:base/event._$addEvent 182 | */ 183 | _p._$addEvent = 184 | _y._$addEvent = (function(){ 185 | // cache event 186 | // type/handler/link 187 | var _doCacheEvent = function(_type,_source,_real){ 188 | var _id = _e._$id(_source.element), 189 | _cch_id = _xcache[_id]||{}, 190 | _cch_tp = _cch_id[_type]||[]; 191 | _cch_tp.push({ 192 | type:_real.type||_type, 193 | func:_real.handler||_source.handler, 194 | sfun:_source.handler, 195 | capt:_source.capture, 196 | link:_real.link 197 | }); 198 | _cch_id[_type] = _cch_tp; 199 | _xcache[_id] = _cch_id; 200 | }; 201 | return function(){ 202 | var _args = _doFormatArgs.apply(null,arguments); 203 | if (!_args) return; 204 | _u._$forEach( 205 | _args.type,function(_name){ 206 | var _argc = _h.__checkEvent( 207 | _args.element, 208 | _name,_args.handler 209 | ); 210 | // add event 211 | _h.__addEvent( 212 | _args.element,_argc.type, 213 | _argc.handler,_args.capture 214 | ); 215 | // add event link 216 | _u._$forIn( 217 | _argc.link,function(_item){ 218 | _item[3] = !!_item[3]; 219 | _h.__addEvent.apply(_h,_item); 220 | _item[0] = _e._$id(_item[0]); 221 | } 222 | ); 223 | // cache event 224 | _doCacheEvent(_name,_args,_argc); 225 | } 226 | ); 227 | }; 228 | })(); 229 | /** 230 | * 节点删除事件,输入参数必须保证与添加接口_$addEvent输入参数完全一致 231 | * 232 | * 结构举例 233 | * ```html 234 | *
123
235 | * ``` 236 | * 237 | * 脚本举例 238 | * ```javascript 239 | * NEJ.define([ 240 | * 'base/event' 241 | * ],function(_v){ 242 | * // 事件回调业务逻辑 243 | * var _doCallback = function(_event){ 244 | * // TODO something 245 | * alert('0'); 246 | * }; 247 | * 248 | * // 添加事件 249 | * _v._$addEvent('abc','mouseover',_doCallback,false); 250 | * // 删除事件,这里参数必须保持完全一致 251 | * _v._$delEvent('abc','mouseover',_doCallback,false); 252 | * 253 | * // 比如以下方式虽然回调的业务逻辑一致,但是无法删除之前添加的事件 254 | * _v._$delEvent( 255 | * 'abc',"mouseover",function(_event){ 256 | * // TODO something 257 | * alert('0'); 258 | * },false 259 | * ); 260 | * 261 | * // 删除多个事件 262 | * _v._$delEvent( 263 | * 'abc','mouseover click mouseup', 264 | * _doCallback,false 265 | * ); 266 | * }); 267 | * ``` 268 | * 269 | * @method module:base/event._$delEvent 270 | * @see module:base/event._$addEvent 271 | * @param {String|Node} arg0 - 节点ID或者对象 272 | * @param {String} arg1 - 事件类型,不带on前缀,不区分大小写,多个事件用空格分隔 273 | * @param {Function} arg2 - 事件处理函数 274 | * @param {Boolean} arg3 - 是否捕获阶段事件 275 | * @return {Void} 276 | */ 277 | /** 278 | * @method CHAINABLE._$delEvent 279 | * @see module:base/event._$delEvent 280 | */ 281 | _p._$delEvent = 282 | _y._$delEvent = (function(){ 283 | var _unCacheEvent = function(_type,_conf){ 284 | var _id = _e._$id(_conf.element), 285 | _cch_id = _xcache[_id]||_o, 286 | _cch_tp = _cch_id[_type], 287 | _index = _u._$indexOf( 288 | _cch_tp,function(_item){ 289 | // check handler and capture 290 | return _item.sfun===_conf.handler&& 291 | _item.capt===_conf.capture; 292 | } 293 | ); 294 | // check result 295 | var _result = null; 296 | if (_index>=0){ 297 | var _item = _cch_tp.splice(_index,1)[0]; 298 | _result = [[ 299 | _conf.element,_item.type, 300 | _item.func,_conf.capture 301 | ]]; 302 | if (!!_item.link){ 303 | _result.push.apply(_result,_item.link); 304 | } 305 | // clear cache 306 | if (!_cch_tp.length){ 307 | delete _cch_id[_type]; 308 | } 309 | if (!_u._$hasProperty(_cch_id)){ 310 | delete _xcache[_id]; 311 | } 312 | } 313 | return _result; 314 | }; 315 | return function(){ 316 | var _args = _doFormatArgs.apply(null,arguments); 317 | if (!_args) return; 318 | _u._$forEach( 319 | _args.type,function(_name){ 320 | _u._$forEach( 321 | _unCacheEvent(_name,_args), 322 | function(_item){ 323 | _h.__delEvent.apply(_h,_item); 324 | } 325 | ); 326 | } 327 | ); 328 | }; 329 | })(); 330 | /** 331 | * 清除节点事件 332 | * 333 | * 结构举例 334 | * ```html 335 | *
123
336 | * ``` 337 | * 338 | * 脚本举例 339 | * ```javascript 340 | * NEJ.define([ 341 | * 'base/event' 342 | * ],function(_v){ 343 | * // 添加事件 344 | * _v._$addEvent( 345 | * 'abc','mouseover',function(_event){ 346 | * // TODO something 347 | * } 348 | * ); 349 | * _v._$addEvent( 350 | * 'abc','mouseover',function(_event){ 351 | * // TODO something 352 | * },true 353 | * ); 354 | * _v._$addEvent( 355 | * 'abc','custom',function(_event){ 356 | * // TODO something 357 | * } 358 | * ); 359 | * 360 | * // 清除节点所有事件,包括两个mouseover事件和一个custom事件 361 | * _v._$clearEvent('abc'); 362 | * 363 | * // 清除节点指定类型事件,只清除两个mouseover事件 364 | * _v._$clearEvent('abc','mouseover'); 365 | * 366 | * // 清除多个事件,用空格分隔 367 | * _v._$clearEvent('abc','mouseover custom'); 368 | * }); 369 | * ``` 370 | * 371 | * @method module:base/event._$clearEvent 372 | * @see module:base/event._$delEvent 373 | * @param {String|Node} arg0 - 节点ID或者对象 374 | * @param {String} arg1 - 事件类型,不带on前缀,不区分大小写,多个事件用空格分隔 375 | * @return {Void} 376 | */ 377 | /** 378 | * @method CHAINABLE._$clearEvent 379 | * @see module:base/event._$clearEvent 380 | */ 381 | _p._$clearEvent = 382 | _y._$clearEvent = (function(){ 383 | var _doClearEvent = function(_id,_name,_list){ 384 | _u._$reverseEach( 385 | _list,function(_item){ 386 | _p._$delEvent( 387 | _id,_name,_item.sfun,_item.capt 388 | ); 389 | } 390 | ); 391 | }; 392 | return function(_element,_type){ 393 | var _id = _e._$id(_element); 394 | if (!_id) return; 395 | var _cch_id = _xcache[_id]; 396 | if (!!_cch_id){ 397 | _type = _getTypeList(_type); 398 | if (!!_type){ 399 | // clear event by type 400 | _u._$forEach( 401 | _type,function(_name){ 402 | _doClearEvent(_id,_name,_cch_id[_name]); 403 | } 404 | ); 405 | }else{ 406 | // clear all event 407 | _u._$loop( 408 | _cch_id,function(_value,_name){ 409 | _p._$clearEvent(_element,_name); 410 | } 411 | ); 412 | } 413 | } 414 | }; 415 | })(); 416 | /** 417 | * 触发对象的某个事件,注:对于IE浏览器该接口节点事件有以下限制 418 | * 419 | * * 捕获阶段支持需要浏览器IE9+ 420 | * * 节点上自定义事件支持需要浏览器IE9+ 421 | * 422 | * 423 | * 结构举例 424 | * ```html 425 | *
123
426 | * ``` 427 | * 428 | * 脚本举例 429 | * ```javascript 430 | * NEJ.define([ 431 | * 'base/event' 432 | * ],function(_v){ 433 | * // 注册鼠标事件 434 | * _v._$addEvent( 435 | * 'abc','click',function(_event){ 436 | * // 获取鼠标事件触发的垂直位置 437 | * var _y = _v._$pageY(_event); 438 | * } 439 | * ); 440 | * // 触发鼠标事件 441 | * _v._$dispatchEvent('abc','click'); 442 | * 443 | * // 注册自定义事件 444 | * _v._$addEvent( 445 | * 'abc','ok',function(_event){ 446 | * // TODO something 447 | * } 448 | * ); 449 | * // 触发自定义事件 450 | * _v._$dispatchEvent('abc','ok'); 451 | * }); 452 | * ``` 453 | * 454 | * @method module:base/event._$dispatchEvent 455 | * @param {String|Node} arg0 - 节点ID或者对象 456 | * @param {String} arg1 - 鼠标事件类型,不区分大小写,多个事件用空格分隔 457 | * @param {Object} arg2 - 传递的参数信息 458 | * @return {Void} 459 | */ 460 | /** 461 | * @method CHAINABLE._$dispatchEvent 462 | * @see module:base/event._$dispatchEvent 463 | */ 464 | _p._$dispatchEvent = 465 | _y._$dispatchEvent = function(_element,_type,_options){ 466 | var _element = _e._$get(_element); 467 | if (!!_element){ 468 | _u._$forEach( 469 | _getTypeList(_type),function(_name){ 470 | var _result = _h.__checkEvent( 471 | _element,_name 472 | ); 473 | _h.__dispatchEvent( 474 | _element,_result.type,_options 475 | ); 476 | } 477 | ); 478 | } 479 | }; 480 | /** 481 | * 获取触发事件的节点,可以传入过滤接口来遍历父节点找到符合条件的节点 482 | * 483 | * 结构举例 484 | * ```html 485 | *
486 | *

487 | * 123 488 | * 123 489 | * 123 490 | * 123 491 | * 492 | *

493 | *
494 | * ``` 495 | * 496 | * 脚本举例 497 | * ```javascript 498 | * NEJ.define([ 499 | * 'base/event' 500 | * ],function(_v){ 501 | * // 取事件触发节点 502 | * _v._$addEvent( 503 | * 'b','click',function(_event){ 504 | * // id为b的节点 505 | * var _node = _v._$getElement(_event); 506 | * // TODO something 507 | * } 508 | * ); 509 | * 510 | * // 事件触发,取id是a的节点 511 | * _v._$addEvent( 512 | * 'b','click',function(_event){ 513 | * // id为a的节点 514 | * var _node = _v._$getElement( 515 | * _event,function(_element){ 516 | * return _element.id=='a'; 517 | * } 518 | * ); 519 | * // TODO something 520 | * 521 | * // class含link或者属性含link或者data-link的节点 522 | * var _node = _v._$getElement(_event,'link'); 523 | * 524 | * // 仅匹配class即 class="link xx xxx" 525 | * var _node = _v._$getElement(_event,'c:link'); 526 | * 527 | * // 仅匹配dataset即 data-link="aaaa" 528 | * var _node = _v._$getElement(_event,'d:link'); 529 | * 530 | * // 仅匹配attributer即 link="aaa" 531 | * var _node = _v._$getElement(_event,'a:link'); 532 | * 533 | * // 仅匹配tag即