1/*web.shell.js*/ 2/*ç½é¡µä¸»æ§å¶å¨*/ 3web.shell = (function() { 4 'use strict'; 5 6 var configMap, stateMap, jqueryMap, setJqueryMap, initModule, 7 getModuleName,//è§£æè¯·æ±å°å,è·åå¯¹åºæ¨¡å 8 getFuncByPath,//è§£æå½æ°è·¯å¾,è·å彿° 9 globalEventController,//ç»å®å ¨å±äºä»¶ï¼ç®å主è¦ç¨äºé¡µé¢å·æ° 10 initSubModule,//éè¿æ§è¡å模åçjsè·å页é¢å 容 11 loadPage,//å°htmlå 容å è½½å°é¡µé¢å®¹å¨ä¸ï¼å¹¶æ´æ¹æ é¢ 12 toPushState, //å°é¡µé¢å å ¥history 13 toUpdatePage,//å°å½å页颿°æ®æ´æ° 14 pageCache,//页é¢ç¼åç³»ç» 15 onPopState;//å¤çonpopstateäºä»¶ 16 17 configMap = { 18 file_pre:web.hostMap.file_pre, 19 } 20 21 stateMap = { 22 previous_state:null,//å¨ååè¿ãåéçèµ·ç¹é¡µé¢state 23 page_load_mark:false,//页颿¯å¦å è½½å®æ´çæ 示 24 maxCacheLength:20//æå¤§ååç¼åæ°é 25 } 26 27 getFuncByPath = function(string){//å¾ªç¯æ¾å°é¡µé¢çåå§å彿° 28 var call_array = string.split('.'), 29 function_prex; 30 for (var i = 0; i < call_array.length; i++) { 31 if(i==0){ 32 function_prex = web[call_array[i]]; 33 }else{ 34 function_prex = function_prex[call_array[i]]; 35 } 36 }; 37 return function_prex; 38 }; 39 40// çææ°ç页é¢ç¶æå¹¶å å ¥æµè§å¨åå²ï¼éè¿pushstateï¼ 41 toPushState=function(url){ 42 var page_id = (new Date).getTime(), //æ ¹æ®æ¶é´æ³çæä¸ä¸ªæ°çpageid 43 state = history.state, 44 page_html; 45 if(url){//æ¥æºä¸ºç¹å»<a>æ ç¾å¯¼è´çéå·æ°é¡µé¢è·³è½¬ 46 //妿页é¢å·²ç»æåå è½½ï¼åå°å½å页é¢åå ¥ç¼åï¼å¦åæ æ³¨ä¸ºnullï¼ä»¥ä¾¿ä¸æ¬¡è¿å页颿¶éæ°è·åé¡µé¢ 47 page_html=(stateMap.page_load_mark) ? web.getPageContent() : null; 48 state.location = $(window).scrollTop(); 49 history.replaceState(state,'',state.url); 50 if(state.closeFunc&&state.closeFunc!=''){// 离å¼åä¸é¡µé¢æ¶æ§è¡çæ¹æ³ 51 getFuncByPath(state.closeFunc)(); 52 } 53 pageCache.cachePush(state.page_id ,page_html); 54// æ§è¡pushstateæä½å建æ°é¡µé¢ç¶æï¼ 55 history.pushState({'page_id':page_id,'url':url}, '', url); 56 } 57 else{//页é¢å次å è½½æéæ°å è½½ 58 url=window.location.pathname+window.location.search; 59// æ¿æ¢å½åçstateï¼å°æ°çpage_idåurlåå ¥å ¶ä¸ 60 history.replaceState({'page_id':page_id,'url':url,'title':null},'', url); 61 history.state.location = 0; 62 } 63// å¹¶å°æ°é¡µé¢çstateåå ¥previous_stateä½ä¸ºä¸æ¬¡åé/åè¿å¨ä½çèµ·ç¹ï¼åæ¶æ ç¤ºé¡µé¢æªå®å ¨å è½½ï¼å è½½æååä¼ä¿®æ¹æ ç¤ºï¼ 64 // stateMap.previous_state=$.extend({},state); 65 stateMap.previous_state=$.extend({},history.state);// lixiaodi 66 stateMap.page_load_mark=false; 67 initSubModule(url,page_id); //请æ±é¡µé¢å 容 68 } 69 70// æ´æ°å½å页é¢ç¶æ 2017.03.26 by lixiaodi 71 toUpdatePage = function(){ 72 // pageCache.cacheMapping[page_id] = web.getPageContent(); 73 loadPage({ 74 html : web.getPageContent(), 75 page_id : history.state.page_id, 76 callback : history.state.callback, 77 title: history.state.title, 78 closeFunc: history.state.closeFunc, 79 },'hasLogin'); 80 } 81 82//ç¹å»æµè§å¨åè¿ãåéæé®çååºæ¹æ³ 83 onPopState = function(event){ 84 var state = event.state, 85 page_html_cache,direction,page_html,title; 86// console.log({'state':state}); 87 if(stateMap.previous_state){//妿ç¼ååå¨ 88// console.log({'previous_state':stateMap.previous_state}); 89 //å¤æè§¦åçæ¯åè¿è¿æ¯åé 90 direction = state.page_id>stateMap.previous_state.page_id ? "forward" : "back" ; 91 //ä»ç¼åä¸è¯»åè¦åå¾ç页é¢html 92 page_html_cache=pageCache.getCacheHtml(state.page_id); 93 //妿æ£è¦ç¦»å¼ç页颿ªå è½½å®æ¯ï¼åå¨ç¼åä¸è®°å½nullä»¥ä¾¿ä¸æ¬¡éæ°è·åé¡µé¢ 94 page_html=(stateMap.page_load_mark) ? web.getPageContent() : null; 95 96 //æä½ç¼åï¼æå³å°ç¦»å¼ç页é¢åå ¥ç¼åï¼å é¤å³å°åå¾é¡µé¢çç¼åï¼å¹¶æ§å¶ç¼åé¿åº¦å°é¢è®¾å¼ 97 stateMap.previous_state.location = $(window).scrollTop(); 98 pageCache.cachePop(direction,stateMap.previous_state.page_id,page_html); 99 100 //å°æè¿å页é¢çstateåå ¥previous_stateä½ä¸ºä¸æ¬¡åé/åè¿å¨ä½çèµ·ç¹ 101 stateMap.previous_state=$.extend({},state); 102 if(page_html_cache){ 103 //妿ç¼åä¸è¦åå¾ç页é¢åå¨ï¼åç´æ¥å è½½é¡µé¢ 104 loadPage({ 105 html : page_html_cache, 106 page_id : state.page_id, 107 callback : state.callback,
108 title: state.title, 109 location:state.location, 110 }); 111 } 112 else{ 113 //妿ç¼åä¸è¦åå¾ç页é¢ä¸åå¨ï¼=nullï¼ä¸è¬ä¸ºé¡µé¢æªå®æ´å è½½æè ç¼å溢åºï¼ï¼åéæ°ï¼è·åå¹¶ï¼æ§è¡jsçæé¡µé¢ 114 initSubModule(state.url,state.page_id); 115 } 116 } 117 else{ 118 //妿ç¼åä¸åå¨ï¼ä¸è¬ä¸ºéæ°å è½½é¡µé¢æè ä»å¤é¨æ¥å°è¥å°ç½ç«ï¼ 119 initSubModule(state.url,state.page_id); 120 } 121 }; 122 123//页é¢ç¼å管ç 124 pageCache = (function(){ 125 var cacheMapping = {},cacheForwardStack = [],cacheBackStack = [], 126 cachePush,cachePop,trimCacheStack,getCacheHtml; 127 //cacheMapping ç¨æ¥ä¿å页é¢ç¼åæ°æ® 128 //cacheForwardStack âåè¿âæä½çå岿°ç»ï¼ä¿å页é¢idï¼ä¸»è¦ç¨æ¥éå¶ç¼åæ°é 129 //cacheBackStack âåéâæä½çå岿°ç»ï¼ä¿å页é¢idï¼ä¸»è¦ç¨æ¥éå¶ç¼åæ°é 130 cachePush = function (page_id, value) { 131 //å°æ°ç页é¢åå ¥ç¼åï¼éè¿ä¸pushstateèå¨å®ç°historyåç¼åç忥 132 //page_idæ¯å³å°ç¦»å¼ç页é¢idï¼å¯¹åºstateMap.previous_stateï¼,valueæ¯å³å°ç¦»å¼ç页é¢çHTMLæ°æ® 133 cacheMapping[page_id] = value 134 cacheBackStack.push(page_id) 135 // å½ä¸ä¸ªæ°ç页é¢åå ¥âåéâæä½ç页é¢ç¼åæ°ç»åï¼å°âåè¿âæä½ç页é¢ç¼åæ°ç»æ¸ 空ï¼å³æ°åå¾ä¸ä¸ªé¡µé¢åï¼åæçåè¿åå²è®°å½å ¨é¨å¤±æï¼ 136 trimCacheStack(cacheForwardStack, 0) 137 // å°âåéâæä½é¡µé¢æ°ç»ä¿®åªä¸ºæå¤§ç¼åæ°é 138 trimCacheStack(cacheBackStack, stateMap.maxCacheLength) 139 }; 140 141 cachePop = function (direction, page_id, value) { 142 var target_page_id; 143 //彿µè§å¨è§¦åpopstateäºä»¶æ¶å¼¹åºå¯¹åºé¡µé¢çç¼å 144 //directionæ¯åå²è®°å½æä½æ¹åï¼ä¸¤ç§å符串èµå¼ï¼'forward'æ¯âåè¿âæä½ï¼'back'æ¯åéæä½ 145 //page_idæ¯å³å°ç¦»å¼ç页é¢idï¼å¯¹åºstateMap.previous_stateï¼,valueæ¯å³å°ç¦»å¼ç页é¢çHTMLæ°æ® 146 var pushStack, popStack 147 //æå³å°ç¦»å¼é¡µé¢çHTMLæ°æ®åå ¥ç¼å 148 cacheMapping[page_id] = value 149 //éè¿æ¹å夿æ¯âåè¿âæ°ç»åâåéâæ°ç»è¯¥å¦ä½ä¿®æ¹ï¼popstateå¼¹åºç页é¢åå ¥ä¸ä¸ªæ°ç»ï¼ç¶åä»å¦ä¸ä¸ªæ°ç»å¼¹åºè¿ä¸ªé¡µé¢ï¼ 150 if (direction === 'forward') { 151 pushStack = cacheBackStack 152 popStack = cacheForwardStack 153 } 154 else { 155 pushStack = cacheForwardStack 156 popStack = cacheBackStack 157 } 158 pushStack.push(page_id); 159 //妿å³å°åå¾ç页é¢åå¨ï¼åå 餿¤é¡µé¢çç¼å 160 target_page_id= popStack.pop(); 161 if (target_page_id){ 162 delete cacheMapping[target_page_id]; 163 } 164 // æåå ¥å½å页é¢çæ°ç»è¿è¡ä¿®åªä»¥ç¬¦åæå¤§ç¼åé¿åº¦ 165 trimCacheStack(pushStack, stateMap.maxCacheLength) 166 }; 167 168 //å½ç¼åæ°ç»è¶ è¿æå¤§å¼æ¶ï¼ä¿®åªæ°ç»å°æå¤§å¼ï¼å¹¶å é¤è¶ åºçç¼å 169 trimCacheStack = function (stack, length) { 170 while (stack.length > length){ 171 delete cacheMapping[stack.shift()]; 172 } 173 }; 174 175 getCacheHtml=function(page_id){ 176 return cacheMapping[page_id]||null; 177 }; 178 179 return{ 180 cachePush:cachePush, 181 cachePop:cachePop, 182 getCacheHtml:getCacheHtml, 183 cacheMapping:cacheMapping 184 } 185 })(); 186 187// æ ¹æ®URLåå§å忍¡å 188 initSubModule = function(url,page_id) { 189 var path,path_array=[],arg_array = [],module,seed_remark='default'; 190 path = $.trim(window.location.pathname); 191 // path = $.trim(url); 192 if(path.lastIndexOf('/')==path.length-1){ 193 path = path.substring(0,path.length-1); 194 } 195 if(path!="/"){ 196 arg_array = path.split('/'); 197 arg_array.shift(); 198 } 199 // è§£æURL 200 arg_array.shift();//åé¤è·¯å¾ä¸çweb 201 module = arg_array.shift();//ååºä»¥å模ååç§° 202 if(!module){//妿ä¸å 嫿¨¡ååç§°åé»è®¤ä¸ºèµè®¯ 203 module='home'; 204 } 205 if(arg_array[0]){ 206 seed_remark = arg_array[0]; 207 } 208 if(web[module]){//å¦ææ¨¡åçjså·²ç»å è½½ï¼åç´æ¥æ¾ç¤º 209 $.gevent.publish('changeNavModule');//æ¹åå¯¼èªæ éä¸ç模å 210 web[module].initModule(arg_array,page_id); 211 } 212 else{//å¦åä»åå°è·åç¸åºçJSåCSS 213 web.utility.addCSS(configMap.file_pre+"css/"+module+"/web."+module+".css?v="+new Date().getTime()); 214 //å¦æè§£æç第ä¸é¡¹æªæ¾å°è¯¥åå§åæ¹æ³,å卿å è½½ç¸å ³jsï¼ä¹ååæ§è¡åå§åæ¹æ³ 215 $.getScript(configMap.file_pre+"js/"+module+"/web."+module+".js") 216 .done(function(script, textStatus) { 217 if(web[module]){ 218 $.gevent.publish('changeNavModule'); 219 web[module].initModule(arg_array,page_id); 220 }else{
221 web.error.initModule(); 222 } 223 }) 224 .fail(function(jqxhr, settings, exception) { 225// web.error.initModule(); 226 // console.log(jqxhr); 227 }); 228 } 229 }; 230 231// å°å模åä¼ åæç¼åä¸ç页é¢å è½½å¨å®¹å¨ä¸ 232 loadPage=function(arg_map,ifLogin){ 233// console.log(arg_map); 234 var page_html = arg_map.html,//页é¢å 容ï¼å¿ 填项 235 page_id = arg_map.page_id,//页é¢IDï¼å¿ 填项 236 callback = arg_map.callback,//åè°å½æ°è·¯å¾ï¼éå¡« 237 title = arg_map.title||'æ æ³å¸è¥å°',//页颿 é¢ï¼éå¡« 238 closeFunc = arg_map.closeFunc,//离å¼é¡µé¢æ¶æ§è¡ç彿°è·¯å¾, éå¡« 239 state = $.extend({},history.state), 240 callFunction; 241 // callFunction = function(string){//å¾ªç¯æ¾å°é¡µé¢çåå§å彿° 242 // var call_array = string.split('.'), 243 // function_prex; 244 // for (var i = 0; i < call_array.length; i++) { 245 // if(i==0){ 246 // function_prex = web[call_array[i]]; 247 // }else{ 248 // function_prex = function_prex[call_array[i]]; 249 // } 250 // }; 251 // return function_prex; 252 // }; 253 if(page_html&&state&&page_id==state.page_id){ //å¦æè¯·æ±è¿åçpage_idåå½å页é¢çpage_idä¸è´ææ¾ç¤ºé¡µé¢ 254 //å¨state䏿´æ°åè°å½æ°ååæ é¢ 255 state.callback = callback; 256 state.title = title; 257 if(arg_map.location){ 258 state.location = arg_map.location; 259 } 260 if(arg_map.closeFunc){ 261 state.closeFunc = closeFunc; 262 } 263 //å å°æ¨¡åä¼ è¿æ¥çåè°å½æ°åæ 颿´æ°è³stateä¸ï¼å¹¶ä¿åè³æ¬å° 264 history.replaceState(state, '',state.url); 265 //æ´æ¹å¯¼èªæ 模åéä¸ 266 $.gevent.publish('changeNavModule'); 267 //å°è¿åçhtmlè¿è¡å è½½ï¼å¹¶æ è¯é¡µé¢å·²å è½½ï¼ç¶åä¿®æ¹é¡µé¢æ é¢ 268 $.gevent.publish('updatePageView',page_html); 269 stateMap.page_load_mark=true; 270 document.title=title; 271 //妿åè°å½æ°åå¨å°±æ§è¡ 272 if(callback){ 273 if(ifLogin=='hasLogin'){ 274 // callFunction(callback)('hasLogin'); 275 getFuncByPath(callback)('hasLogin'); 276 } 277 else{ 278 // callFunction(callback)(); 279 getFuncByPath(callback)(); 280 } 281 } 282 } 283 else{ 284 return false; 285 } 286 }; 287 288 getModuleName = function(){ 289 var path,path_array=[],arg_array = [],module,seed_remark='default'; 290 path = $.trim(window.location.pathname); 291 // path = $.trim(url); 292 if(path.lastIndexOf('/')==path.length-1){ 293 path = path.substring(0,path.length-1); 294 } 295 if(path!="/"){ 296 arg_array = path.split('/'); 297 arg_array.shift(); 298 } 299// è§£æURL 300 arg_array.shift();//åé¤è·¯å¾ä¸çweb 301 module = arg_array.shift();//ååºä»¥å模ååç§° 302 if(!module){//妿ä¸å 嫿¨¡ååç§°åé»è®¤ä¸ºèµè®¯ 303 module='home'; 304 } 305 if(arg_array[0]){ 306 seed_remark = arg_array[0]; 307 } 308 return {module:module,seed:seed_remark}; 309 }; 310 311 globalEventController = function() { 312 // æ ¹æ®ç¹å®urlå 载页é¢çæ¶æ¯ 313 $.gevent.subscribe($(window), 'getPageByUrl', function(event, url) { 314 // toPushState(url); 315 $(window).off('scroll'); 316 window.location.href = url; 317 }); 318 // 䏻页颿´æ°æ¶æ¯ 319 $.gevent.subscribe($(window), 'mainPageUpdate', function(event, arg_map) { 320 $(window).off('scroll'); 321 loadPage(arg_map); 322 }); 323 // æ´æ°å½å页颿°æ® 324 $.gevent.subscribe($(window),'updatePageState',function(event){ 325 $(window).off('scroll'); 326 toUpdatePage(); 327 }); 328 }; 329 330 initModule = function() { 331 globalEventController(); 332 if(web.utility.judgeIE()){ 333 $(document).on('click','a[data-ajax]',function(event){ 334 var $this = $(this); 335 event.preventDefault(); 336 toPushState($this.attr('href')); 337 }); 338 } 339 else{ 340 web.utility.showBasicPrompt({ 341 content:'妿æ³è·å¾æ´å¥½çä½éª,建议æ¨å级æµè§å¨!', 342 style:'alert-warning' 343 }); 344 } 345 window.onpopstate = function(e){ 346 onPopState(e); 347 } 348 toPushState(); 349 }; 350 351 return { 352 initModule: initModule, 353 }; 354}());
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.