【PC网站前端架构探讨系列】关于中小型PC网站前端架构方案的讨论与实践

news/2024/5/20 10:48:14/文章来源:https://blog.csdn.net/weixin_30883311/article/details/95103962

目   录

  1.遇到的问题

  2.目标

  3.探讨

  4.架构设想

  5.流程

      6.初步实现

  7.存在问题

  8.最后

 

 遇到的问题

         我在这个系列上篇文章 已经讲解并开始逐步应用模块化思想,不知大家还记不记得,题目:【PC网站前端架构探讨系列】结合公司网站首页,谈前端模块化开发与网站性能优化实践 。但是,仍然会存在下列问题:

            问题1----模块内部脚本和页面联系密切

     问题2----所有脚本文件集中放于一个目录,脚本目录不清晰,没有层次

   当然还有其他很多问题,但就以上两大问题来说,会对后期代码维护带来不便!

  目   标

      尽量将页面和脚本进行分离,以及方便开发人员维护管理,形成一个固定的代码规范;其二,项目的结构清晰,层次明确,功能突出。所以,需要设计一个合理的前端架构来解决当前以及后期会遇到的问题

  探   讨

       思想方面

    针对耦合性问题,业界流行的新一种架构思想——“MVC””MVVC”,但大多这种思想用于WAP开发中,国内很少的PC网站有用过,比如,有道好像用的是Backbone框架…

       

       技术角度

       在seajs模块划分的基础上

             1. backbone+underscore(MVC)

             2. knockout(MVVM)

       目前这两种用的较多,而且社区文档比较多,但是都比较适合单页面的应用,最主要就是开发方式会有很大转变….很难上手…感觉不太适合普通中小型的PC网站开发以及后期维护

       

      下面列出相关示例代码:(Backbone)

       

 1    define('module/home/index', ['backbone'], function(reuqire) {
 2     var Backbone = reuqire('backbone');
 3     App.Models.Home = Backbone.Model.extend({});
 4 
 5     App.Collections.Home = Backbone.Collection.extend({
 6         model: App.Models.Home
 7     });
 8 
 9     App.Views.Home = Backbone.View.extend({
10         el: '#container',
11         initialize: function(c) {
12             this.Collections = c;
13             this.render();
14         },
15         render: function() {
16             var html = '';
17             this.Collections.each(function(m) {
18                 html += '<div><a href="' + m.get('link') + '">' + m.get('name') + '</a></div>';
19             });
20             this.$el.html(html);
21         }
22     })
23 
24     return function() {
25         //模拟数据
26         var hc = new App.Collections.Home();
27         hc.add([
28             {'name': '加载模块A', 'link': '#at/m/a/name:moduleA/other:nothing'},
29             {'name': '加载模块B', 'link': '#at/m/b'}
30         ]);
31         new App.Views.Home(hc);
32     }
33 });
View Code

      紧接着:(knockout)

 1       <html xmlns="http://www.w3.org/1999/xhtml" >
 2 <head>
 3     <title>Knockout学习一</title>
 4     <script src="Scripts/knockout-3.0.0.js" type="text/javascript"></script>
 5     <script src="Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
 6 </head>
 7 <body>
 8    
 9     <div>
10          <span data-bind="text: personName"></span>
11     </div>
12  
13 </body>
14 <script type="text/javascript">
15     var myViewModel = {
16         personName: ko.observable('张三'),
17         personAge: ko.observable(12)
18     };
19 
20     $(function() {
21         ko.applyBindings(myViewModel);
22     });
23     
24 </script>
25 </html>
View Code

     

  另外,一个完整的前端框架要包括以下方面:                 

   1.  解耦

   2.  模块化

   3.  统一的代码书写结构

   4.  组件库

   5.  事件处理机制   ……

     

  目前互联网发展迅速,技术更新太快,所以,针对以上方面使用目前的技术手段,完全可以实现,就是好多文档不全,教程不清晰,关键比较零散,不同技术组合起来会遇到很多问题,问题再多,时间充足的话,也会找到解决的办法。我这里简单说下解决的思路:  

   1.  解耦问题--可以使用模板来达到业务和页面分离

   2.  模块化问题--模块化技术好多,requireJS、seajs等,我这里用的是seajs

   3.  代码结构—json格式

   4.  组件库—define封装,定义成seajs模块,定义属性、选择器、方法、事件等

   5.  事件处理机制 —事件的单独封装,统一的注册机制,调用机制(kissy 做的很好,个人还没研究透)

 

     下面先做个简单的架构设想 吧!

  架构设想

         

        这里看图就不多讲了,直接看下面的关系吧!

 

     

 流  程

     

    模块之间的关系以及调用流程如下:

  

        

 

     

  初步实现

               说到技术,推荐多去学习下百度阿里腾讯等的前端技术,相对比较贴地气,比较赶潮流. .比如,之前在学习seajs 的时候,无意中发现一些网站的脚本从风格、写法、思想上,都值得我学习一下。所以,我经常特意把上面的代码扒下来,研究一番…..

  废话不多说,这里把我部分代码分享出来:     

        1.package/main.js (核心工具类库)  

  1 /**
  2  *  核心工具类 文件 v20151023
  3  */
  4 (function() {
  5     var mods = [],
  6         version = parseFloat(seajs.version);
  7     define(["lib/jquery"],function(require, exports, module) {
  8         var uri = module.uri || module.id,
  9             m = uri.split("?")[0].match(/^(.+\/)([^\/]*?)(?:\.js)?.J/i),
 10             root = m && m[1],
 11             name = m && "./" + m[2].substring(0,m[2].length),
 12             i = 0,
 13             len = mods.length,
 14             curr, args, undefined;
 15         name = name.replace(/\.r[0-9]{15}/, "");
 16         for (; i < len; i++) {
 17             args = mods[i];
 18             if (typeof args[0] === "string") {
 19                 name === args[0] && (curr = args[2]);
 20                 args[0] = root + args[0].replace("./", "");
 21                 version > 1 && define.apply(this, args);
 22             }
 23         }
 24         mods = [];
 25         require.get = require;
 26         return typeof curr === "function" ? curr.apply(this, arguments) : require;
 27     });
 28     define.pack = function() {
 29         mods.push(arguments);
 30         version > 1 || define.apply(null, arguments)
 31     }
 32 })();
 33 define.pack("./request", ["lib/jquery","./random","./domains"], function(require, exports, module) {
 34     var Random = require("./random");
 35     var J = require("lib/jquery");
 36     var Domains=require("./domains");
 37     var MOD = {
 38             _Config: {
 39                 domain: Domains.base
 40             },
 41             request:function(conf){
 42                 var conf = {
 43                     type: conf.type,
 44                     async: conf.async || false,
 45                     url: this._Config.domain+conf.url,
 46                     dataType: conf.dataType || 'json',
 47                     data: conf.data || {},
 48                     beforeSend: conf.before,
 49                     success: conf.success,
 50                     complete: conf.complete,
 51                     error: conf.error
 52                 };
 53                 J.ajax(conf);
 54             },
 55             get: function(conf) {
 56                 return MOD.request({
 57                     type: 'get',
 58                     async: conf.async,
 59                     url: conf.url,
 60                     dataType: conf.dataType,
 61                     data: conf.data,
 62                     beforeSend: conf.callback.beforeSend,
 63                     success: conf.callback.success,
 64                     complete: conf.callback.complete,
 65                     error: conf.callback.error
 66                 })
 67             },
 68             post: function(conf) {
 69                 return MOD.request({
 70                     type: 'post',
 71                     async: conf.async,
 72                     url: conf.url,
 73                     dataType: conf.dataType,
 74                     data: conf.data,
 75                     beforeSend: conf.callback.beforeSend,
 76                     success: conf.callback.success,
 77                     complete: conf.callback.complete,
 78                     error: conf.callback.error
 79                 })
 80             },
 81             jsonp: function(conf) {
 82                 conf.dataType = "jsonp";
 83                 return MOD.request(conf)
 84             },
 85             src: function(conf) {
 86                 conf = conf || {};
 87                 var defConfig = this._Config;
 88                 var url, data = {
 89                     domain: conf.url || defConfig.domain,
 90                     _: Random()
 91                 };
 92                 if (data.domain) {
 93                     url = data.domain+"?_=" + data._;
 94                     (new Image).src = url
 95                 }
 96             }
 97         };
 98     return MOD;
 99 });
100 define.pack("./random", [], function(require, exports, module) {
101     var MOD = function() {
102         var rs = (new Date).getTime() + Math.ceil(Math.random() * 1E4);
103         return rs;
104     };
105     return MOD;
106 });
107 define.pack("./template", ['lib/jquery'], function(require, exports, module) {
108     var J = require("lib/jquery");
109     var MOD = {
110         parse: function() {
111             var cache = {};
112             return function(str, data) {
113                 if (typeof str === "function") return data ? str(data) : str;
114                 var fn = !/\W/.test(str) ? cache[str] = cache[str] || arguments.callee.call(this, document.getElementById(str).innerHTML) : new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" + "with(obj){p.push('" + str.replace(/[\r\t\n]/g,
115                         " ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g, "J1\r").replace(/\t=(.*?)%>/g, "',J1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'") + "');}return p.join('');");
116                 if (data){
117                     return fn(data);
118                 } else {
119                     return fn;
120                 }
121             }
122         }(),
123         render:function(opts){
124             var html = '';
125             var conf = J.extend({
126                 container: opts.container instanceof jQuery ? opts.container : J(opts.container),
127                 tmpl: typeof(opts.tmpl) =='string' ? opts.tmpl 
128                         : opts.tmpl.join(''),
129                 options: opts.options || {}
130             }, {});
131             html += MOD.parse(conf.tmpl,conf.options);
132             conf.container.html(html);
133         }
134     };
135     return MOD;
136 });
137 define.pack("./browser",["lib/jquery"],function(require,exports,module){
138     var J = require("lib/jquery");
139     var MOD={
140         _getBrower:function(){
141              var ua = navigator.userAgent,
142              jqBrowser = J.browser,
143              jqVersion = jqBrowser.version,
144              browser = '',
145              ver = '';
146          if (jqBrowser.msie) {
147              browser = 'ie';
148              ver = Math.floor(jqVersion);
149              if (ver < 6) {
150                  ver = 6;
151              }
152              if (ver > 10) {
153                  ver = 10;
154              }
155          } else if (jqBrowser.webkit) {
156              browser = 'safari';
157              if (ua.indexOf('Chrome') !== -1) {
158                  browser = 'chrome';
159              }
160          } else if (jqBrowser.mozilla) {
161              browser = 'firefox';
162          } else if (jqBrowser.opera) {
163              browser = 'opera';
164          }
165          if (!browser) {
166              browser = 'other';
167              ver = '';
168          }
169          return '' + browser + ver;
170         },
171         isIE:function(v){
172             v = v || J.browser.version;
173             return this._getBrowser=='ie'+v.toString();
174         }        
175     };
176     return MOD;
177 });
178 define.pack('./domains',[],function(require,exports,module){
179      var MOD={
180           base: basePath || "https://www.ddshenbian.com"
181      };
182      return MOD;
183 });
184 define.pack("./cookie", ["lib/jquery", "./domains"], function(require, exports, module) {
185     var J = require("lib/jquery");
186     var Domains = require("./domains");
187 
188     function MOD(name, value, options) {
189         if (typeof value != "undefined") {
190             options = options || {
191                     "domain": Domains.base
192                 };
193             if (value === null) {
194                 value = ""; 
195             }
196             var expires = "";
197             if (options.expires && (typeof options.expires == "number" || options.expires.toUTCString)) {
198                 var date;
199                 if (typeof options.expires == "number") {
200                     date = new Date;
201                     date.setTime(date.getTime() + options.expires *
202                         1E3)
203                 } else date = options.expires;
204                 expires = "; expires=" + date.toUTCString()
205             }
206             var path = options.path ? "; path=" + options.path : "";
207             var domain = options.domain ? "; domain=" + options.domain : "";
208             var secure = options.secure ? "; secure" : "";
209             document.cookie = [encodeURIComponent(name), "=", encodeURIComponent(value), expires, path, domain, secure].join("")
210         } else {
211             var cookieValue = null,
212                 name = encodeURIComponent(name);
213             if (document.cookie && document.cookie != "") {
214                 var cookies = document.cookie.split(";");
215                 for (var i = 0; i < cookies.length; i++) {
216                     var cookie = J.trim(cookies[i]);
217                     if (cookie.substring(0, name.length +
218                             1) == name + "=") {
219                         cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
220                         break
221                     }
222                 }
223             }
224             return cookieValue
225         }
226     }
227     return MOD;
228 });
229 define.pack("./html", [], function(require, exports, module) {
230     var MOD = function() {
231         var encodeMap = {
232                 reg: /([&"'<>])/gmi,
233                 "&": "&amp;",
234                 '"': "&quot;",
235                 "'": "&#039;",
236                 "<": "&lt;",
237                 ">": "&gt;"
238             },
239             decodeMap = {
240                 reg: /(&lt;)|(&quot;)|(&#0039;)|(&#039;)|(&#39;)|(&amp;)|(&gt;)/gim,
241                 "&lt;": "<",
242                 "&gt;": ">",
243                 "&quot;": '"',
244                 "&#0039;": "'",
245                 "&#039;": "'",
246                 "&#39;": "'",
247                 "&amp;": "&"
248             },
249             encode = function(J0, c) {
250                 return encodeMap[c]
251             },
252             decode = function(c) {
253                 return decodeMap[c]
254             };
255         return {
256             htmlEncode: function(str) {
257                 if (typeof str != "string") str = str + "";
258                 return str.replace(encodeMap.reg,
259                     encode)
260             },
261             htmlDecode: function(str) {
262                 if (typeof str != "string") str = str + "";
263                 return str.replace(decodeMap.reg, decode)
264             }
265         }
266     }();
267     return MOD;
268 });
269 define.pack("./error", [], function(require, exports, module) {
270     function MOD(mname,msg) {
271        throw "DD.error[" + mname + "]\u8f93\u51fa\u9519\u8bef\uff1a" + msg;
272     }
273     return MOD;
274 });
275 define.pack("./log", ["lib/jquery"], function(require, exports, module) {
276     var J = require("lib/jquery");
277     var MOD = function() {
278         var logPanel, logPanelBd;
279         return function() {
280             try {
281                 if (J.browser.msie) console.log([].slice.call(arguments).join(""));
282                 else console.log.apply(console, [].slice.call(arguments))
283             } catch (e) {}
284         }
285     }();
286     return MOD;
287 });
288 define.pack("./helper", ["lib/jquery", "./cookie"], function(require, exports, module) {
289     var J = require("lib/jquery");
290     var Cookie = require("./cookie");
291     var MOD = {
292         getURLArgs: function(str, k) {
293             str = str ? str : location.href;
294             var s = str.indexOf("?");
295             var e = str.indexOf("#") == -1 ? str.length : str.indexOf("#");
296             var r = {};
297             if (s != -1) {
298                 var ts = str.substring(s + 1, e);
299                 ts = ts.split("&");
300                 var t;
301                 for (var i = 0; i < ts.length; i++) {
302                     t = ts[i].split("=");
303                     if (t.length == 2) r[t[0]] = t[1]
304                 }
305             }
306             if (k) return r[k] ? r[k] : false;
307             return r
308         },
309         isEmpty: function(v) {
310             if (v != null && (typeof v ==
311                 "object" || typeof v == "function")) {
312                 if (J.isArray(v) && v.length == 0) return true;
313                 return false
314             }
315             return "" == v || undefined == v || null == v ? true : false
316         },
317         filterXSS: function(cont) {
318             cont = cont.replace(/&/g, "&amp;");
319             cont = cont.replace(/</g, "&lt;").replace(/>/g, "&gt;");
320             cont = cont.replace(/\'/g, "&#39;").replace(/\"/g, "&quot;");
321             return cont
322         },
323         str2Args: function(query, split) {
324             var args = {};
325             query = query || "";
326             split = split || "&";
327             var pairs = query.split(split);
328             for (var i = 0; i < pairs.length; i++) {
329                 var pos = pairs[i].indexOf("=");
330                 if (pos == -1) continue;
331                 var argname = pairs[i].substring(0, pos);
332                 var value = pairs[i].substring(pos + 1);
333                 args[argname] = this.filterXSS(decodeURIComponent(value))
334             }
335             return args
336         },
337         args2Str: function(args, split) {
338             split = split || "&";
339             var key, rtn = "",
340                 sp = "";
341             for (key in args) {
342                 rtn += sp + key + "=" +
343                     encodeURIComponent(args[key]);
344                 sp = split
345             }
346             return rtn
347         },
348         formatDate: function(mDate, fmt) {
349             var o = {
350                     "M+": mDate.getMonth() + 1,
351                     "d+": mDate.getDate(),
352                     "h+": mDate.getHours() % 12 == 0 ? 12 : mDate.getHours() % 12,
353                     "H+": mDate.getHours(),
354                     "m+": mDate.getMinutes(),
355                     "s+": mDate.getSeconds(),
356                     "q+": Math.floor((mDate.getMonth() + 3) / 3),
357                     "S": mDate.getMilliseconds()
358                 },
359                 week = {
360                     "0": "\u65e5",
361                     1: "\u4e00",
362                     2: "\u4e8c",
363                     3: "\u4e09",
364                     4: "\u56db",
365                     5: "\u4e94",
366                     6: "\u516d"
367                 };
368             if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.J1, (mDate.getFullYear() + "").substr(4 - RegExp.J1.length));
369             if (/(E+)/.test(fmt)) fmt = fmt.replace(RegExp.J1, (RegExp.J1.length > 1 ? RegExp.J1.length > 2 ? "\u661f\u671f" : "\u5468" : "") + week[mDate.getDay() + ""]);
370             for (var k in o)
371                 if ((new RegExp("(" + k + ")")).test(fmt)) fmt = fmt.replace(RegExp.J1, RegExp.J1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
372             return fmt;
373         },
374         toThousands:function(num) {
375             var num = (num || 0).toString(), re = /\d{3}J/, result = '';
376             while ( re.test(num) ) {
377                 result = RegExp.lastMatch + result;
378                 if (num !== RegExp.lastMatch) {
379                     result = ',' + result;
380                     num = RegExp.leftContext;
381                 } else {
382                     num = '';
383                     break;
384                 }
385             }
386             if (num) { result = num + result; }
387             return result;
388         }
389     };
390     return MOD;
391 });
392 define.pack("./response",["./error"],function(require, exports, module){
393     var error = require("./error");
394     var MOD=function(res,autoCode){
395         var code = res.code;
396         if(code){
397           return code == (autoCode || 1)?(res.obj || res.msg):res.msg;
398         }
399         error();
400     };
401     return MOD;
402 });
403 define.pack("./json",[],function(require, exports, module){
404     return  {
405         isJSON : function(obj){
406             var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;    
407             return isjson;
408         }
409     };
410 });
411 define.pack("./user",['jquery','./cookie','./json','./domains','./template'],function(require, exports, module){
412      var Domains = require("./domains"),
413           json = require("./json"),
414           template = require("./template"),
415          cookie = require("./cookie"),
416              J = require("jquery");
417      var MOD = {
418          logout: function() {
419              J('#header').delegate('a#quit', 'click', function() {
420                  seajs.use("package/data", function(d) {
421                      if(d.logout == 0){
422                          window.location.reload();
423                      }
424                  }) 
425              })
426          },
427          login: function(){
428                  var that = this;
429                  var loginTmpl = ['<a class="uname fr" id="_userName" href="<%=domain%>/auth/account/myaccount_index">','<%=_userName%>','<a class="msg-link" id="msgbox" style="<%=_isShow%>">','<em>','<%=_msgNum%>','</em>','</a>','</a>',
430                               '<ul class="dropdown-menu" role="menu" aria-labelledby="userInfoBox">',
431                               '<li role="presentation">','<a role="menuitem" tabindex="-1" id="accountURI" href="<%=domain%>/auth/account/<%=_accountURI%>">','我的账户','</a>', '</li>',
432                               '<li>', '<a role="menuitem" tabindex="-1" href="<%=domain%>/auth/msgManager/index" class="msg-link">','消息','(','<em>','</em>',')','</a>','</li>',
433                               '<li>','<a role="menuitem" tabindex="-1"  id="quit">','退出登录','</a>','</li>','</ul>'].join('');
434                  seajs.use("package/data", function(d) {
435                      var obj = json.isJSON(d.uinfo) ? d.uinfo : {};
436                      that.uinfo(loginTmpl,obj);
437                  })
438          },
439          uinfo: function(loginTmpl,obj){
440               var conf = J.extend({
441                   domain: Domains.base,           
442               });         
443 
444               if (obj.loginFlag == 1) {
445                   J.extend({
446                       _isShow: '',
447                       _accountURI: '#',
448                       _userName: 'hi!' + obj._userName,
449                       _msgNum: obj._msgNum
450                   },conf);
451                   
452                   J("#homelogin").show();
453                   J("#homeunlogin").hide();
454                   if (conf._msgNum != 0) {
455                       conf._isShow = 'display:"none"';
456                   }
457                   if (obj._userType == 2) {
458                       conf._accountURI = 'companyaccount_index';
459                   } else {
460                       conf._accountURI = 'myaccount_index';
461                   }
462                   var opts = {
463                             container: '#homelogin',
464                             tmpl: loginTmpl,
465                             options: conf
466                         };
467                   template.render(opts);
468               } else {
469                   J("#homelogin").hide();
470                   J("#homeunlogin").show();
471               }
472          },
473          toTop: function(){
474              J("#toTop").on('click', function() {
475                  J('html,body').animate({
476                      scrollTop: 0
477                  }, 700)
478              });
479              J(window).scroll(function() {
480                  var s = J(window).scrollTop();
481                  if (s > 600) {
482                      J("#toTop").fadeIn(100)
483                  } else {
484                      J("#toTop").fadeOut(200)
485                  }
486              })
487          },
488          _getCookieOpt: function(setting) {
489              setting = setting || {};
490              var opt = {
491                  domain: Domains.base,
492                  expires: 60 * 60 * 24 * (setting.expires || 1),
493                  path: '/'
494              };
495              return opt;
496          },
497          utm2cookie: function(opts){
498              var conf = J.extend({
499                  utm_type: opts.utm_type,
500                  utm_source: opts.utm_source,
501                  utm_medium: opts.utm_medium,
502                  utm_term: opts.utm_term,
503                  utm_content: opts.utm_content,
504                  utm_campaign: opts.utm_campaign,
505                  setting: this._getCookieOpt({ 
506                                 expires : 30 
507                           })
508              },opts || {});
509               
510              if (conf.utm_type != 'null' && conf.utm_source != 'null') {
511                  cookie('utm_type', parseInt(conf.utm_type), conf.setting);
512                  cookie('utm_source', conf.utm_source, conf.setting);
513                  cookie('utm_medium', conf.utm_medium, conf.setting);
514                  cookie('utm_term', conf.utm_term, conf.setting);
515                  cookie('utm_content', conf.utm_content, conf.setting);
516                  cookie('utm_campaign', conf.utm_campaign, conf.setting);
517              } else {
518                  return false;
519              } 
520          },
521          navActive:function(uri){
522              var category = "",
523                  pattern = /^http(s):\/\/.*\/.*\/(.*?)\/(.*?)\//g;
524              var mts = pattern.exec(uri);
525              if (mts != null)
526              {
527                  var parent = mts[1];
528                  var child = mts[2];
529                  if (parent == 'aboutus'&& 'guidelinessecurityfriendlinks'.indexOf(child) < 0) {
530                      category = parent + '>!gsf'; 
531                  }
532                  else{
533                      category = parent + '>' + child;
534                  }
535              }
536 
537              switch(category){
538                case 'aboutus>guidelines':
539                    J('.navbar-nav li').removeClass('active');
540                    J('.navbar-nav').children('li').eq(3).addClass('active');
541                    break;
542                case 'aboutus>security':
543                    J('.navbar-nav li').removeClass('active');
544                    J('.navbar-nav').children('li').eq(2).addClass('active');
545                    break;
546                case 'aboutus>friendlinks':
547                    J('.navbar-nav li').removeClass('active');
548                    break;
549                case 'aboutus>!gsf'://!guidelines!security!friendlinks
550                    J('.navbar-nav li').removeClass('active');
551                    J('#header .nav').children('li').eq(4).find('.dropdown-menu').remove();
552                    J('.navbar-nav').children('li').eq(4).addClass('active');
553                    break; 
554                default:
555                    J('.navbar-nav li').removeClass('active');
556                    J('.navbar-nav').children('li').eq(1).addClass('active')
557                    break;
558              }
559          }    
560      };
561      return MOD;
562 });
563 define.pack("./main", ["jquery","./request","./template","./browser","./domains", "./cookie", "./html", "./log", "./error", "./helper", "./response"], function(require, exports, module) {
564     var J = require("jquery"),
565         Module = module.constructor;
566     var DD = window.DD || {};
567     DD.$ = DD.J = J;
568     DD.UI = DD.UI || {};
569     DD.Module = DD.Module || {};
570     DD.request=require("./request");
571     DD.template = require("./template");
572     DD.browser = require("./browser");
573     DD.domains = require("./domains");
574     DD.cookie = require("./cookie");
575     DD.html = require("./html");
576     DD.log = require("./log");
577     DD.error = require("./error");
578     DD.helper = require("./helper");
579     DD.response = require("./response");
580     DD.json = require("./json");
581     DD.user = require("./user");
582     return DD;
583 });
View Code

       2. package/data.js (数据入口文件) 

 1 /**
 2  * 数据入口文件 v20151022
 3  */
 4 define(['dd','common/config/url'],function(require){
 5     var DD = require('dd'),
 6         url = require('common/config/url');
 7     var MOD = {
 8          cmsAC:function(conf){
 9              conf = conf || {};
10              DD.request.get({
11                  url: url.cmsAC,
12                  callback: {
13                      success: conf.success //TODO:cache 
14                  }
15              });
16          },
17          cmsMR:function(conf){
18              conf = conf || {};
19              DD.request.get({
20                  url: url.cmsMR,
21                  callback: {
22                      success: conf.success //TODO:cache 
23                  }
24              });
25          },
26          getFPAndInv:function(conf){
27              conf = conf || {};
28              DD.request.get({
29                  url: url.getFPAndInv,
30                  callback: {
31                      success: conf.success //TODO:cache 
32                  }
33              });
34          },
35          logout:function(conf){
36              conf = conf || {};
37              DD.request.get({
38                  url: url.logout,
39                  callback: {
40                      success: conf.success //TODO:cache 
41                  }
42              });
43          },
44          uinfo:function(conf){
45              conf = conf || {};
46              DD.request.get({
47                  url: url.uinfo,
48                  callback: {
49                      success: conf.success //TODO:cache 
50                  }
51              });
52          }    
53     };
54     return MOD;
55 });
View Code   

   3. template/tmpl_index.js (页面模板文件)

  1 /** template|index|v20151027*/
  2 define(['package/main','common/util/utils'], function(require, exports, module) {
  3     var DD = require("package/main"),
  4         util = require("common/util/utils");
  5     var tmpl = {
  6              'notice_tmpl': function(data) {
  7                     var __p = [],
  8                         _p = function(s) {
  9                             __p.push(s)
 10                         };
 11                     with(data || {}) {
 12                         var list = data.arcitleList;
 13                         var len = list.length;
 14                         if (len > 3) {
 15                             len = 3;
 16                         }
 17                         for (var i = 0; i < len; i++) {
 18                             var ntitle = DD.html.htmlEncode(list[i].title).replace(/[ ]/g,"");
 19                              if (ntitle.length <= 0) continue;
 20                             __p.push('<li><a title="');
 21                             _p(ntitle.replace('<br>', ''));
 22                             __p.push('" target=blank href="');
 23                             _p(DD.domains.base);
 24                             __p.push('/cms/arcitleDetail?id=');
 25                             _p(list[i].id);
 26                             __p.push('&cateId=3">');
 27                             _p(list[i].title.replace('<br>', '')+'</a>');
 28                             if (list[i].isNew) {
 29                                 __p.push('<i clannouncementListass="new-icon"></i>');
 30                             }
 31                             __p.push('<span>');
 32                             _p(util.date.format(list[i].createTime,'yyyy-MM-dd'));
 33                             __p.push('</span></li>');
 34                         }
 35                     }
 36                     return __p.join("");
 37                },
 38               'media_tmpl': function(data) {
 39                    var __p = [],
 40                        _p = function(s) {
 41                            __p.push(s)
 42                        };
 43                    with(data || {}) {
 44                        var list = data.arcitleList;
 45                         var len = (list.length >= 6) ? 6 : list.length;
 46                         for (var i = 0; i < len; i++) {
 47                             var ntitle = DD.html.htmlEncode(list[i].title).replace(/[ ]/g,"");
 48                             var titleSub = "";
 49                             if (ntitle.length > 28) {
 50                                 titleSub = ntitle.substr(0, 28) + "…"
 51                             } else {
 52                                 titleSub = ntitle
 53                             }
 54                             __p.push('<li><a title="');
 55                                _p(ntitle.replace('<br>', ''));
 56                                __p.push('" target=blank href="');
 57                                _p(DD.domains.base);
 58                                __p.push('/cms/arcitleDetail?id=');
 59                                _p(list[i].id);
 60                                __p.push('&cateId=4">');
 61                             _p(titleSub.replace('<br>', ''));
 62                             __p.push('</a></li>');
 63                         }
 64                    }
 65                    return __p.join("");
 66               },
 67               'invest_list_tmpl': function(data) {
 68                      var __p = [],
 69                          _p = function(s) {
 70                              __p.push(s)
 71                          };
 72                      with(data || {}) {
 73                          var list_bw=data.list_borrows;
 74                             var len=list_bw.length;
 75                             var repayType=["还款方式","等额本息","先息后本","本息一次","等额平息"];
 76                             if (len > 5){
 77                                 len = 5;
 78                             }
 79                             for(var i = 0; i < len; i++){
 80                                 __p.push('<li id="tl00');
 81                                 _p(i);
 82                                 __p.push('" class="hvr-sweep-to-top">');
 83                                 if(list_bw[i].isNew==1){
 84                                     __p.push('<div class="i_01 new"></div>');
 85                                 } 
 86                                 else{
 87                                     __p.push('<div class="i_01"></div>');
 88                                 }
 89                                 __p.push('<div class="i_02"><img src="');
 90                                 _p(list_bw[i].img);
 91                                 __p.push('" style="width:36px;height:30px;margin:0 15px 0 -52px;"><a href="');
 92                                 _p(DD.domains.base);
 93                                 __p.push('/invest/prodetail_index?id=');
 94                                 _p(list_bw[i].id);
 95                                 __p.push('">');
 96                                 _p(list_bw[i].no);
 97                                 __p.push('</a></div>');
 98                                 var num1=Number(list_bw[i].apr*100).toFixed(2);
 99                                 __p.push('<div class="i_03">');
100                                 _p(num1);
101                                 __p.push('%</div>');
102                                 var dateName="";
103                                 if(list_bw[i].isDayLoan==1){
104                                     dateName="天"
105                                 }else{
106                                     dateName="个月"
107                                 }
108                                 __p.push('<div class="i_04">');
109                                 _p(list_bw[i].periods);
110                                 _p(dateName);
111                                 __p.push('</div><div class="i_05">');
112                                 _p(repayType[list_bw[i].repayType]);
113                                 var amountForm=DD.helper.toThousands(list_bw[i].amount);
114                                 __p.push('</div><div class="i_06">');
115                                 _p(amountForm);
116                                 __p.push('元</div><div class="i_07"><div class="index-progress" style="height: 46px;line-height: 45px;">');
117                                 _p(list_bw[i].process);
118                                 __p.push('%</div></div>');
119                                 var invaFlagStr=util.business.getInvesFlag(list_bw[i],"1");
120                                 __p.push('<div class="i_08"><a href="');
121                                 _p(DD.domains.base);
122                                 __p.push('/invest/prodetail_index?id=');
123                                 _p(list_bw[i].id);
124                                 if(list_bw[i].status == 2){
125                                     __p.push('" class="disableFla">');
126                                 }
127                                 else{
128                                     __p.push('">');
129                                 }
130                                 _p(invaFlagStr);
131                                 __p.push('</a></div>');
132                             }
133                      }
134                      return __p.join("");
135                 },
136                 'financial_plans_tmpl': function(data) {
137                     data = data ||{}
138                        var __p = [],timeId=data.id+"1",num1="",
139                            _p = function(s) {
140                                __p.push(s)
141                            };
142                        __p.push('<p class="title">');
143                        _p(data.name);
144                        __p.push('</p>');
145                        if(data.isNew == 1){
146                            __p.push('<em class="new-icon"></em>');
147                        }
148                        if (!(data.addRate == undefined || data.addRate <= 0)) {
149                            __p.push('<span class="perc" style="position: absolute;top: 63px;left: 162px;font-size: 18px;">+');
150                            _p(Number(data.addRate).toFixed(1));
151                            __p.push('%</span>');
152                            num1=Number(data.num-data.addRate).toFixed(1);        
153                        }else{
154                            num1=Number(data.num).toFixed(1);
155                        }
156                        __p.push('<span class="num">');
157                        _p(num1);
158                        __p.push('</span><span class="perc">%</span><p class="rev">预期年化收益</p>');
159                        if(data.isShowTime){
160                            __p.push('<a class="ableFla" href="');
161                        }else{
162                            __p.push('<a  class="disableFla" href="');
163                        }
164                        _p(DD.domains.base);_p(data.toPage);__p.push('?id=');
165                        _p(data.id);__p.push('">');_p(data.flagStr);__p.push('</a>');
166                        if(data.isShowTime){
167                            __p.push('<p class="time">剩余时间:<span id="');
168                            _p(timeId);
169                            __p.push('></span></p>');
170                        }else{
171                            __p.push('<p class="notime"> </p>');
172                        }
173                        return __p.join("");
174                }
175                
176     };
177     return tmpl;
178 });
View Code

       4. module/init.js (模块业务文件)   

 

  1 /*首页模块2|v2015-10-11*/
  2 (function() {
  3     var mods = [],
  4         version = parseFloat(seajs.version);
  5     define(['jquery','dd','common/plugin/slides.min','template/tmpl_index','package/data','common/util/utils'],function(require, exports, module) {
  6         var uri = module.uri || module.id,
  7             m = uri.split("?")[0].match(/^(.+\/)([^\/]*?)(?:\.js)?.J/i),
  8             root = m && m[1],
  9             name = m && "./" + m[2].substring(0,m[2].length),
 10             i = 0,
 11             len = mods.length,
 12             curr, args, undefined;
 13         name = name.replace(/\.r[0-9]{15}/, "");
 14         for (; i < len; i++) {
 15             args = mods[i];
 16             if (typeof args[0] === "string") {
 17                 name === args[0] && (curr = args[2]);
 18                 args[0] = root + args[0].replace("./", "");
 19                 version > 1 && define.apply(this, args);
 20             }
 21         }
 22         mods = [];
 23         require.get = require;
 24         return typeof curr === "function" ? curr.apply(this, arguments) : require;
 25     });
 26     define.pack = function() {
 27         mods.push(arguments);
 28         version > 1 || define.apply(null, arguments)
 29     }
 30 })();
 31 define.pack("./animate",["jquery",'common/plugin/slides.min','dd'],function(require, exports, module){
 32     var J = require('jquery'),
 33         animate = {},
 34         DD = require('dd');
 35     require('common/plugin/slides.min')(J);
 36     animate.slider = function(opt){
 37         var conf = J.extend({
 38             container : opt.container,
 39             auto : opt.auto || true,
 40             nav :  opt.nav || true,
 41             pause:  opt.pause || true,
 42             speed :  opt.speed || 300,
 43             pager :  opt.pager || true
 44         }, opt || {});
 45         J(conf.container).responsiveSlides({
 46             auto : conf.auto,
 47             nav : conf.nav,
 48             pause: conf.pause,
 49             speed : conf.speed,
 50             pager : conf.pager
 51         });
 52     };
 53     
 54     animate.announcement = function(opt){
 55         var conf = J.extend({
 56             container : opt.container,
 57             _interval : opt.interval || 3000,
 58             speed :  opt.speed || 600,
 59         }, opt || {}),_moving,
 60             _wrap = J(opt.container);
 61         _wrap.hover(function(){
 62             clearInterval(_moving);
 63             },function(){
 64                 _moving = setInterval(function(){
 65                     var _field = _wrap.find("li:first");
 66                     var _h = _field.height();
 67                     _field.animate({marginTop:-_h+'px'},conf.speed,function(){
 68                         _field.css('marginTop',0).appendTo(_wrap);
 69                         })
 70                 },conf._interval)
 71             }).trigger('mouseleave');
 72     };
 73     
 74     animate.bind = function(){
 75         //animatedcss类动画的初始定义,ie8不加载
 76         if(DD.browser.isIE(8)){   //判断是否是IE/
 77             J(".callbacks1_s2").on('click',function(event){
 78                 J(event).addClass("callbacks_here");
 79             });
 80         }
 81         J('#financial .plans').on({
 82             'mouseover':function(){J(this).find('.time').show();},
 83             'mouseout':function(){J(this).find('.time').hide();}
 84         });
 85         J('li.dropdown').on({
 86             'mouseover':function(){J(this).addClass('open');},
 87             'mouseout':function(){J(this).removeClass('open');}
 88         });
 89         
 90         J('#userInfoBox').on({
 91             'mouseover':function(){J("#homelogin").addClass('open');},
 92             'mouseout':function(){J("#homelogin").removeClass('open');}
 93         });
 94         
 95         J("#goInvest,#goAboutus,#_userName").on('click',function(){
 96             window.location.href=J(this).attr("href");        
 97         }); 
 98     };
 99     
100     animate.run = function(opts){
101         animate.slider({container : opts[0]});
102         animate.announcement({container : opts[1]});
103         animate.bind();
104     };
105     
106     return animate;
107 });
108 define.pack("./render",["jquery",'dd','template/tmpl_index','package/data','common/util/utils'],function(require, exports, module){
109     var J = require('jquery'),
110         indexTmpl = require('template/tmpl_index'),
111         util = require("common/util/utils"),
112         data = require('package/data'),
113         DD = require('dd');
114     return {
115         ac: function(dom){
116              data.cmsAC({
117                  success:function(data){
118                      var obj = DD.response(data);
119                      var opts = {
120                                 container: dom,
121                                 tmpl: indexTmpl.notice_tmpl(DD.json.isJSON(obj) ? obj: {}),
122                                 options: {}
123                      };
124                      DD.template.render(opts);
125              }});        
126         },
127         mr: function(dom){
128             data.cmsMR({
129                  success:function(data){
130                      var obj = DD.response(data);
131                      var opts = {
132                                 container: dom,
133                                 tmpl: indexTmpl.media_tmpl(DD.json.isJSON(obj) ? obj : {}),
134                                 options: {}
135                             };
136                      DD.template.render(opts);
137              }});    
138         },
139         _invList: function(dom){
140             data.getFPAndInv({
141                  success:function(data){
142                      var obj = DD.response(data);
143                      var opts = {
144                                 container: dom,
145                                 tmpl: indexTmpl.invest_list_tmpl(DD.json.isJSON(obj) ? obj : {}),
146                                 options: {}
147                             };
148                      DD.template.render(opts);     
149             }});    
150         },
151         _loadImg: function(dom){
152             dom = dom instanceof jQuery ? dom : J(dom);
153             data.getFPAndInv({
154                     success:function(data){
155                         var obj = DD.response(data);
156                             obj=DD.json.isJSON(obj) ? obj : {};
157                        for (i = 0; i < 5; i++) {
158                            util.business.loadImg(obj.list_borrows[i].process,dom);
159                        }
160                }});    
161         },
162         _finPlan:{
163             bind:function(type,obj){
164                if(obj && ("" != obj) && ("undifinde" != obj)){
165                     var conf = {
166                         num: obj.apr * 100,
167                         flagStr: util.business.getInvesFlag(obj,"0"),
168                         id: obj.id,
169                         isNew: obj.isNew,
170                         isShowTime: obj.status == 2 ? true : false,
171                         addRate: obj.addRate * 100
172                     };
173                     switch (type) {
174                         case 0:
175                             conf = J.extend({
176                                 name: '活期宝',
177                                 toPage: '/invest/flex_borrow',
178                                 container: '#huoqibao'
179                             },conf);
180                             break;
181                         case 1:
182                             conf = J.extend({
183                                 name: '3个月计划',
184                                 toPage: '/invest/optimise_borrow',
185                                 container: '#3yue'
186                             },conf);
187                             break;
188                         case 2:
189                             conf = J.extend({
190                                 name: '6个月计划',
191                                 toPage: '/invest/optimise_borrow',
192                                 container: '#6yue'
193                             },conf);
194                             break;
195                         case 3:
196                             conf = J.extend({
197                                 name: '12个月计划',
198                                 toPage: '/invest/optimise_borrow',
199                                 container: '#12yue'
200                             },conf);
201                             break;
202                         default:
203                             return false;
204                     }
205                      var opts = {
206                             container: conf.container,
207                             tmpl: indexTmpl.financial_plans_tmpl(conf),
208                             options: {}
209                         };
210                      J(opts.container).addClass("sa_top");
211                     DD.template.render(opts);
212                }
213             },
214             show:function(){
215                 var self = this;
216                 data.getFPAndInv({
217                         success:function(data){
218                            var obj = DD.response(data);
219                                obj = DD.json.isJSON(obj) ? obj : {};
220                            self.bind(0,obj.flex_borrows[0]);
221                            self.bind(1,obj.optimise1_borrows[0]);
222                            self.bind(2,obj.optimise2_borrows[0]);
223                            self.bind(3,obj.optimise3_borrows[0]);    
224                    }});
225             }
226         },
227         run:function(opts){
228             this.ac(opts[0]);
229             this.mr(opts[1]);
230             this._finPlan.show();
231             this._invList(opts[2]);
232             this._loadImg(opts[3]);
233         }    
234     };
235     
236 });
237 define.pack("./init",["jquery",'dd','common/util/utils'],function(require, exports, module){
238     var J = require('jquery'),
239         util = require("common/util/utils"),
240         DD = require('dd');
241     return {
242         init: function(options){
243                  var that = this;
244                  var opts = J.extend({
245                     _amOpt: ['#slider','ul.announcements'],
246                     _rdOpt: ['.announcements','#mediaReports','#investmentList','#tl000 .index-progress']
247                  }, options);
248                  require.async('./animate', function(animate) {
249                      animate.run(opts._amOpt);
250                  });
251                  require.async('./render', function(render) {
252                      render.run(opts._rdOpt);
253                  });
254         },
255         time: util.business.showBorrowTime
256     };
257 });
View Code

       5. common/event.js (事件处理文件)

         注:这里代码主要是自定义事件的,个人感觉JQuery封装的事件挺强大的,所以暂未使用,后期有好的思路需要重新写下

 1 /**
 2  * 事件处理 v20151027
 3 */
 4 define(['lib/jquery'],function(require, exports, module) {
 5     var $ = require('lib/jquery');
 6     exports.batchBind = function(dom, obj) {
 7         for (var evt in obj) {
 8             (function(evt, handlers) {
 9                 $(dom).bind(evt, function(e) {
10                     var e = e || event;
11                     var target = e
12                             .target || e.srcElement;
13                     for (var cls in handlers) {
14                         if ($(target).hasClass(cls)) {
15                             if (handlers[cls].call(target)) {
16                                 break;
17                             }
18                         }
19                     }
20                 });
21             })(evt, obj[evt]);
22         }
23     };
24     exports.enableCustomEvent = function(obj) {
25         $.extend(obj, {
26             addEvent: function(type, func) {
27                 this._customEventListeners = this._customEventListeners || {};
28                 this._customEventListeners[type] = this._customEventListeners[type] || [];
29                 this._customEventListeners[type].push(func);
30                 return this;
31             },
32             delEvent: function(type, func) {
33                 var funcs = this._customEventListeners[type];
34                 if (funcs) {
35                     for (var i = funcs.length - 1; i >= 0; i--) {
36                         if (funcs[i] == func) {
37                             funcs[i] = null;
38                             break;
39                         }
40                     }
41                 }
42                 return this;
43             },
44             fireEvent: function(type) {
45                 if (!this._customEventListeners || !this._customEventListeners[type]) return;
46                 var funcs = this._customEventListeners[type],
47                     args = $.makeArray(arguments),
48                     tmp = null,
49                     returnValue = true;
50                 args.shift();
51                 for (var i = 0, j = funcs.length; i < j; i++) {
52                     if (funcs[i]) {
53                         try {
54                             tmp = funcs[i].apply(this, args);
55                             if (tmp === false) {
56                                 returnValue = false;
57                             }
58                         } catch (ox) {}
59                     }
60                 }
61                 return returnValue;
62             }
63         });
64         return obj;
65     };
66 });
View Code 

       6. ui/dialog.js (UI组件-弹窗 )   

     注:首页中未使用,需要根据网站弹窗样式功能修改

  1 /**UI|Dialog|v20151029**/
  2 define("./dialog",["jquery","dd"],function(require, exports, module) {
  3      var J = require('jquery'),
  4      DD = require('dd');
  5      //require('./dialog.css'); //css
  6      var jQuery, $;
  7      jQuery = $ = J;
  8      var _id = 0;
  9      var Dialog = function(options) {
 10          this.id = 'dialog_' + (++_id);
 11          this.dom = null;
 12          this.mask = null;
 13          this.timer = null;
 14          this.options = J.extend({
 15              title: options.title || '',
 16              header: options.header || '',
 17              footer: options.footer || '',
 18              content: options.content || '',
 19              submitButtonText: options.submitButtonText || '确定',
 20              cancelButtonText: options.cancelButtonText || '取消',
 21              dragable: options.dragable || true, //是否可以拖曳
 22              destroyWhenClosed: options.destroyWhenClosed || true,
 23              autoClose: options.autoClose || false,
 24              autoCloseDelay: options.autoCloseDelay || 1500,
 25              useModal: options.useModal || true,
 26              closeAfterSubmit: options.closeAfterSubmit || true,
 27              showCloseButton: options.showCloseButton || true,
 28              showSubmitButton: options.showSubmitButton || true,
 29              showCancelButton: options.showCancelButton || true,
 30              showHeader: options.showHeader || true,
 31              showFooter: options.showFooter || true,
 32              onCreated: options.onCreated || null,
 33              onOpened: options.onOpened || null,
 34              onClosed: options.onClosed || null,
 35              onDestroyed: options.onDestroyed || null,
 36              onSubmitted: options.onSubmitted || null,
 37              onCanceled: options.onCanceled || null,
 38              realOnCanceled: options.realOnCanceled || null,
 39              width: options.width || '350px',
 40              height: options.height || 'auto',
 41              zIndex: options.zIndex || 5000,
 42              template: options.template || '',
 43              autoPosit: options.autoPosit || true,
 44              left: options.left || '25%',
 45              top: options.top || '25%'
 46          }, options || {});
 47          Dialog.instances[this.id] = this;
 48      }
 49      Dialog.prototype = {
 50          create: function() {
 51              var _this = this;
 52              var tplData = {};
 53              tplData.id = this.id;
 54              tplData.showHeader = this.options.showHeader ? '' : 'display:none;';
 55              tplData.showFooter = this.options.showFooter ? '' : 'display:none;';
 56              tplData.showCloseButton = this.options.showCloseButton ? '' : 'display:none;';
 57              tplData.showSubmitButton = this.options.showSubmitButton ? '' : 'display:none;';
 58              tplData.showCancelButton = this.options.showCancelButton ? '' : 'display:none;';
 59              tplData.header = this.options.header ? this.options.header : '';
 60              tplData.title = this.options.title ? this.options.title : '';
 61              tplData.footer = this.options.footer ? this.options.footer : '';
 62              tplData.content = this.options.content ? this.options.content : '';
 63              tplData = J.extend(this.options, tplData);
 64              var dialog = DD.template.parse(this.options.template, tplData);
 65              J(document.body).append(dialog);
 66              if ($.browser.msie && !window.XMLHttpRequest) {
 67                  var divHeight = J('#' + this.id).height();
 68                  $('#' + this.id).find(' > iframe').height(divHeight);
 69              }
 70              this.dom = J('#' + this.id).get(0);
 71              J('#' + this.id + '_close').click(function() {
 72                  _this.options.onCanceled.call(_this);
 73                  _this.close();
 74              });
 75              J('#' + this.id + '_submit').click(function() {
 76                  if (_this.options.onSubmitted.call(_this) || _this.options.closeAfterSubmit) {
 77                      _this.close();
 78                  }
 79              });
 80              J('#' + this.id + '_cancel').click(function() {
 81                  _this.options.onCanceled.call(_this);
 82                  _this.options.realOnCanceled.call(this);
 83                  _this.close();
 84              });
 85              if (this.options.dragable) {}
 86              if (this.options.useModal) {
 87                  this.mask = new Dialog.Mask({
 88                      zIndex: this.options.zIndex - 1,
 89                      target: this.options.maskTarget
 90                  });
 91                  this.mask.create();
 92              }
 93              J('#' + this.id + ',#' + this.id + '_submit,#' + this.id + '_cancel,#' + this.id + '_close').attr('tabindex', 0);
 94              this.options.onCreated.call(this);
 95          },
 96          open: function() {
 97              if (this.dom == null) {
 98                  this.create();
 99              }
100              if (this.options.autoPosit) {
101                  var topPos = J(document).scrollTop() || 0,
102                      win = window;
103                  try {
104                      while (win.frameElement) {
105                          topPos += J(win.parent.document).scrollTop() || 0;
106                          if (win.parent.$e) {
107                              topPos -= win.parent.$e(win.frameElement).getXY()[1];
108                          } else if (win.parent.J) {
109                              topPos -= win.parent.J(win.frameElement).offset().top;
110                          } else {
111                              break;
112                          }
113                          win = win.parent;
114                      }
115                  } catch (e) {
116                      topPos = J(document).scrollTop() || 0, win = window;
117                  }
118                  if (this.options.vCenter) {
119                      topPos = J(document).scrollTop() || 0 + ($(window).height() - $(this.dom).height()) / 2;
120                  }
121                  if (topPos < 0) {
122                      topPos = 0;
123                  }
124                  J(this.dom).css({
125                      left: Math.floor((J(window).width() - J(this.dom).width()) / 2) + 'px',
126                      top: this.options.vCenter ? topPos : 100 + topPos + 'px'
127                  });
128              }
129              J(this.dom).show().focus();
130              var _this = this;
131              if (this.options.autoClose) {
132                  if (this.timer) {
133                      clearTimeout(this
134                          .timer);
135                  }
136                  this.timer = setTimeout(function() {
137                      _this.close();
138                  }, this.options.autoCloseDelay);
139              }
140              if (this.mask) {
141                  this.mask.show();
142              }
143              this.options.onOpened.call(this);
144          },
145          close: function() {
146              J(this.dom).hide();
147              if (this.mask) {
148                  this.mask.hide();
149              }
150              if (this.timer) {
151                  clearTimeout(this.timer);
152                  this.timer = null;
153              }
154              if (this.options && this.options.onClosed) {
155                  this.options.onClosed.call(this);
156              }
157              if (this.options && this.options.destroyWhenClosed) {
158                  var _this = this;
159                  setTimeout(function() {
160                      _this.destroy();
161                  }, 10);
162              }
163          },
164          resize: function(size, resizeContent) {
165              if (resizeContent) {
166                  var target = J('div.pop-common-bd', this
167                      .dom);
168              } else {
169                  var target = J(this.dom);
170              }
171              if (size.width) {
172                  target.css({
173                      'width': size.width
174                  });
175              }
176              if (size.height) {
177                  target.css({
178                      'height': size.height
179                  })
180              }
181          },
182          changeButtonText: function(type, text) {
183              switch (type) {
184                  case 'submit':
185                      var btn = J('#' + this.id + '_submit').get(0);
186                      break;
187                  case 'cancel':
188                      var btn = J('#' + this.id + '_cancel').get(0);
189                      break;
190              }
191              btn.innerHTML = text;
192          },
193          destroy: function() {
194              try {
195                  J(this.dom).find('iframe').remove();
196                  J(this.dom).remove();
197                  if (this.mask) {
198                      this.mask.destroy();
199                  }
200                  this.options.onDestroyed.call(this);
201                  this.dom = null;
202                  this.options = null;
203                  Dialog.instances[this.id] = null;
204                  delete
205                      Dialog.instances[this.id];
206              } catch (ex) {}
207          }
208      };
209      Dialog.template = ['<div id="<%=id%>" class="<%=mainStyle%>" style="position: absolute; z-index: <%=zIndex%>; top: <%=top%>; left: <%=left%>; height: <%=height%>; width: <%=width%>; display:none;">', 
210                         '<div class="py-pop-inner">', '<div class="pop-hd" id="<%=id%>_header" style="<%=showHeader%>" >', '<h3><%=title%></h3>', '</div>', '<div class="pop-bd"><%=content%></div>', 
211                         '<div class="pop-ft" id="<%=id%>_footer" style="<%=showFooter%>"><%=footer%><div class="pop-cmds"><a class="btn btn-green" style="<%=showSubmitButton%>" id="<%=id%>_submit" title="<%=submitButtonText%>"><b class="button"><span class="b-txt"><%=submitButtonText%></span></b></a><a title="<%=cancelButtonText%>" class="btn"  style="<%=showCancelButton%>" id="<%=id%>_cancel"><b class="button"><span class="b-txt"><%=cancelButtonText%></span></b></a></div></div>', 
212                         '</div>', '<a id="<%=id%>_close" title="关闭对话框" href="#" class="close" style="<%=showCloseButton%>" οnclick="return false;"><i class="icon i-pop-close"></i></a>',
213                         '<iframe style="width: <%=width%>;" tabindex="-1" class="shade-ie6" frameborder="0" src="about:blank" scrolling="no"></iframe>', '</div>'].join('');
214      Dialog.instances = {};
215      Dialog.close = function(id) {
216          if (id) {
217              Dialog.instances[id].close();
218          } else {
219              for (var ins in Dialog.instances) {
220                  Dialog.instances[ins].close();
221              }
222          }
223      }
224      Dialog.destroy = function() {
225          for (var ins in Dialog.instances) {
226              try {
227                  Dialog.instances[ins].destroy();
228              } catch (ex) {}
229          }
230          Dialog.instances = null;
231      }
232      Dialog.Mask = function(options) {
233          this.options = J.extend({
234              target: window,
235              zIndex: 990,
236              opacity: 0
237          }, options || {});
238          this.dom = null;
239      }
240      Dialog.Mask.prototype = {
241          create: function() {
242              var offset = this.getOffset();
243              var width = J(this.options.target).width(),
244                  height = J(this.options.target).height(),
245                  zIndex = this.options.zIndex,
246                  opacity = this.options.opacity;
247              this.dom = document.createElement('div');
248              document.body.appendChild(this.dom);
249              J(this.dom).css({
250                  'position': 'absolute',
251                  'zIndex': zIndex,
252                  'left': offset.left + 'px',
253                  'top': offset.top + 'px',
254                  'width': width + 'px',
255                  'height': height + 'px',
256                  'display': 'none'
257              });
258              J(this.dom).append('<div style="position:absolute; width:' + width + 'px;height:' + height + 'px; background:#000000;z-index:' + zIndex + ';opacity:' + opacity 
259                      + '; filter:alpha(opacity=' + (opacity * 100) + ');-moz-opacity:' + opacity + ';"></div>');
260              if (jQuery.browser.msie) {
261                  J(this.dom).append('<iframe style="opacity:0; filter:alpha(opacity=0);-moz-opacity:0;" scrolling="No" style="" border="0" frameborder="0" width="' + width + '" height="' + height + '"></iframe>');
262              } else if (jQuery.browser.opera) {
263                  J(this.dom).append('<img οnmοusedοwn="return false;" galleryimg="no" style="z-index:' + zIndex + '" width="' + width + '" height="' + height + '"/>');
264              }
265          },
266          show: function() {
267              if (!this.dom) {
268                  this.create();
269              } else {
270                  var offset = this.getOffset();
271                  J(this.dom).css({
272                      'left': offset.left + 'px',
273                      'top': offset.top + 'px'
274                  });
275              }
276              J(this.dom).show();
277          },
278          hide: function() {
279              J(this.dom).hide();
280          },
281          destroy: function() {
282              J(this.dom).remove();
283              this
284                  .dom = null;
285              this.options = null;
286          },
287          getOffset: function() {
288              if (this.options.target == window || this.options.target == document) {
289                  var offset = {
290                      left: 0,
291                      top: 0
292                  };
293              } else {
294                  var offset = J(this.options.target).offset();
295              }
296              var scrollTop = document.body.scrollTop || document.documentElement.scrollTop || 0;
297              offset.top += scrollTop;
298              return
299              offset;
300          }
301      }
302      Dialog.create = function(options) {
303          var that = this;
304          var opts = J.extend({}, options);
305          switch (options.type) {
306              case 'warn':
307                  opts.title = options.title ? options.title : '温馨提示';
308                  opts.template = (Dialog.template || '').replace('<%=content%>', '<div class="xpy-media"><div class="img"><i class="ico-warn-20"></i></div><div class="txt ft-14"><%=content%></div></div>');
309                  break;
310              case 'error':
311              case 'notice':
312                  opts.autoClose = true;
313                  opts.useModal = false;
314                  if (J('select').size()) {
315                      opts.useModal = true;
316                  }
317                  opts.template = '<div id="<%=id%>" style="z-index:<%=zIndex%>" class="hint hint-blue"><div class="hint-inner"><i class="ico-hint ico-busy"></i><span class="hint-txt"><%=content%></span></div></div>';
318                  opts.content = options.content;
319                  opts.zIndex = 9999;
320                  break;
321              case 'verify':
322                  options.content = options.content || '';
323                  opts.closeAfterSubmit = false;
324                  opts.content = '<div class="pop-vcode">\
325              <table>\
326                  <tbody>\
327                  <tr>\
328                      <td colspan="2"><span class="pop-vcode-tips">' + (options.subTitle || '请输入验证码') + '</span> <br/>' + options.content + '</td>\
329              </tr>\
330              <tr>\
331              <td>验证码:</td>\
332              <td>\
333              <label accesskey="v"><input autocomplete="off" type="text" class="verifycode" name="verifycode_div" maxlength="6">不区分大小写</label>\
334              </td>\
335              </tr>\
336              <tr>\
337              <td></td>\
338              <td>\
339              <img height="53" width="130" src="http://' + (document.domain == 'qq.com' ? 'captcha.qq.com' : 'captcha.pengyou.com') + '/getimage?aid=15000901&' + Math.random() + '">\
340                          <a href="#" class="js_change" tabindex="-1" οnclick="">看不清,换一张</a>\
341                      </td>\
342                  </tr>\
343                  </tbody>\
344              </table>\
345          </div>';
346                  opts.onOpened = function() {
347                      var jqInput = J('input.verifycode', this.dom),
348                          jqChange = J('a.js_change', this.dom);
349                      if (!this.dom) {
350                          return false;
351                      };
352                      var dia = this;
353                      jqInput.focus();
354                      jqChange.click(function() {
355                              var url = 'http://' + (document.domain == 'qq.com' ? 'captcha.qq.com' : 'captcha.pengyou.com') + '/getimage?aid=15000901&' + Math.random();
356                              J(this).parent().find('img').attr('src', url);
357                              jqInput.trigger('focus');
358                              return false;
359                          });
360                      jqInput.unbind('keydown').bind('keydown', function(ev) {
361                          var keycode = ev.keyCode,
362                              subRS = false;
363                          if (keycode === 13) {
364                              ev.preventDefault();
365                              subRS = opts.onSubmitted.call(dia);
366                              if (subRS || options
367                                      .closeAfterSubmit) {
368                                  dia.close();
369                              }
370                          }
371                      });
372                  };
373                  opts.onSubmitted = function() {
374                      if (!this.dom) {
375                          options.onSubmitted.call(this, '');
376                          if (that && that.close) {
377                              that.close();
378                          } else {
379                              Dialog.close();
380                          }
381                          return false;
382                      };
383                      var ipt = J('input.verifycode', this.dom),
384                          code = ipt.val();
385                      if (/^\s*$/.test(code)) {
386                          alert('请输入验证码');
387                          ipt.focus();
388                          return false;
389                      } else {
390                          options.onSubmitted.call(this, code);
391                          return true;
392                      }
393                  };
394                  break;
395              case 'success':
396                  opts.autoClose = true;
397                  opts.useModal = false;
398                  if (J('select').size()) {
399                      opts.useModal = true;
400                  }
401                  opts.template = options.template;
402                  opts.content = options.content;
403                  opts.zIndex = 9999;
404                  break;
405          }
406          return new Dialog(opts);
407      }
408      var DialogClass = {
409          open: function(type, content, config) {
410              var args = [].slice.apply(arguments);
411              config = args[args.length - 1];
412              if ($.isPlainObject(config)) {
413                  args.splice(-1, 1);
414              } else {
415                  config = null;
416              }
417              if (args.length > 1) {
418                  type = args[0];
419                  content = args[1];
420              } else if (args.length === 1) {
421                  type = null;
422                  content = args[0];
423              } else {
424                  type = null;
425                  content = '';
426              }
427              var confDef = {
428                      type: '',
429                      title: ''
430                  },dialog;
431              config = config ? $.extend(confDef, config) : confDef;
432              config.content = config.content || content;
433              config.type = config.type || type;
434              dialog = Dialog.create(config);
435              dialog.open();
436              return dialog;
437          },
438          closeAll: function() {
439              Dialog.close();
440          },
441          create: Dialog.create,
442          manager: Dialog
443      };
444      return DialogClass;
445 });
View Code

       7.index.jsp(页面文件-js部分)  

 1 <script type="text/javascript">  
 2 ;(function () {
 3     var fn = function () {
 4         seajs.use(['package/main','jquery'],function(d,$){
 5             var href = window.location.href;
 6             if(href&&href.indexOf('ddshenbian.com') > 0){
 7                 d.user.navActive(href);
 8             }
 9             d.user.toTop();
10         });
11     };
12 
13     setTimeout(fn,0);
14 })();
15 </script>
16 setTimeout(function () {
17     seajs.use('package/main', function(d){
18         d.user.utm2cookie({
19              utm_type: '<%=utm_type%>',
20                 utm_source: '<%=utm_source%>',
21                 utm_medium: '<%=utm_medium%>',
22                 utm_term: '<%=utm_term%>',
23                 utm_content: '<%=utm_content%>',
24                 utm_campaign: '<%=utm_campaign%>'
25         });
26         d.user.login();
27         d.user.logout();
28     });
29 },1000);
30 var target=[],time_id =[];
31 ;(function () {
32     window.onload = function () {
33         seajs.use(['lib/jquery','package/main'],function () {
34             seajs.use('module/index/init',function (i) {
35                 i.init();
36                 setTimeout(function(){
37                     i.time(target,time_id);
38                 }, 100);
39             });
40         });
41     };
42 })();
View Code

     下面看下页面效果:

                    

 

          

   存在问题

    1.最明显会带来的问题就是请求增多,kissy这一方面做的很好,大多数的解决办法是需要运维去服务器做相关配置来实现   

    2.事件处理机制不太完善,目前还在学习中…

    3.缓存处理、页面渲染等有待完善,请大神多多赐教

     

   

   

      

 

转载于:https://www.cnblogs.com/sybboy/p/4943211.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_728555.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站访问慢跟80端口_怎样用黑群创建自己的个人网站

我们搭建网站通常是在云服务器或云虚拟空间&#xff0c;亦或是自己的笔记本电脑。前者需要另外按月购买&#xff0c;后者需要24H联网开机。而已经在手上的(黑群)安装Web Station后&#xff0c;不仅不需要额外购买&#xff0c;还不用自己从零搭建网站。那么我们现在开始吧&#…

网站能ping通 网页打不开_怎么回事?我的电脑浏览器打不开网页,但微信、QQ却又能用?...

怎么回事&#xff1f;我的电脑浏览器打不开网页&#xff0c;但微信、QQ却又能用&#xff1f;打开电脑&#xff0c;登上微信、QQ&#xff0c;打开网页&#xff0c;这已经是每天的日常工作了。怎么回事&#xff0c;我的网页怎么打不开了&#xff1f;换个浏览器&#xff0c;好奇怪…

js通过月份判断前三个月_【扫黑专题】分析BC跳转JS骚操作、解决网站反复被黑【实战操作】...

【扫黑专题】分析BC跳转JS骚操作、解决网站反复被黑【实战操作】 前几天写了一篇文章、关于分析BC做法的文章(如果有没看的兄弟、请去公众号&#xff1a;逆冬黑帽SEO&#xff0c;公众号里有更多精彩文章)、下面我们再来看看BC跳转手法(主要以JS为主)、以及大家讲讲如何防黑的干…

安全狗linux更新日志,网站安全狗_ 网站安全狗(Linux版)_下载之家

网站安全狗(Linux版)是一款服务器安全防护软件,网站安全狗集网站内容安全防护,网站资源保护及网站流量保护功能为一体的服务器工具。网站安全狗功能涵盖了网马/木马扫描,防SQL注入,防盗链,防CC攻击,网站流量实时监控,网站CPU监控,下载线程保护,IP黑白名单管理,网页防篡改功能(结…

背景视频html5网页,视频作为网站背景? HTML 5

我可能有一个解决方案&#xff0c;可以将视频作为背景&#xff0c;并扩展到浏览器的宽度或高度(但视频仍将保留长宽比&#xff0c;尚无法找到解决方案。)&#xff1a;将视频放在带有bodydummy的正文标签之后。之后&#xff0c;放置一个“婴儿假人”标签&#xff1a;将所有内容放…

外贸电子商务网站之Prestashop 设置网站基本信息

顶部banner图&#xff0c;首页各尺寸banner图、社交分享、物流支持、支付方式提醒等等设置 示例版本&#xff1a;1.6.1.11 转载于:https://www.cnblogs.com/MY0101/p/6424770.html

使用Django开发集成Pytorch\Tensorflow的人工智能网站

AI_WEB 链接&#xff1a;resnet分类模型 提取码&#xff1a;nh4r 查看nginx错误日志cat /var/log/nginx/error.log1.基础环境和软件库需求2.Xshell远程连接服务器3.安装Linux版本的Anaconda4.安装并测试Django5.Git使用6.服务器拉取仓库代码7.规范django开发文件8.配置settin…

Hdlbit网站练习:Exams/ece241 2013 q4:水位问题

此题需要注意的地方有三个&#xff1a; 1&#xff09;水位监测器的输入是状态跳转的条件 2&#xff09;assign {fr3,fr2,fr1} {!s[1],!s[2],!s[3]};//不能根据输入判断否则会提前一会时钟 3&#xff09;assign dfr (state < next_state) ? 1’b0 : 1’b1; //使用组合逻辑…

从hdlbit网站学习到有关独热码编码方式的认识

题目如下所示&#xff1a; 首先介绍独热码&#xff1a; 其特征就是&#xff1a;只有一个位为1其余全为0 的编码方式 优点&#xff1a;因为每一个状态只有一位为1&#xff0c;减少了毛刺的产生&#xff08;时序电路增加&#xff0c;组合电路减少 &#xff09; 缺点&#xff1a;…

php 通用密码,(php脚本自研分享)•通用型保存网站用户密码到css文件

很多时候呢&#xff0c;我们拿到一个shell以后&#xff0c;偶尔会遇到密码解不了的情况&#xff0c;用xss收集cookie吧&#xff0c;感觉不方便&#xff1b;利用xss平台劫持表单吧&#xff0c;感觉麻烦&#xff0c;也会担心自己想要的密码别人也copy了一份等等情况吧&#xff0c…

网站关键词html代码,html网站代码+网站关键词如何优化呢

原标题&#xff1a;html网站代码网站关键词如何优化呢html网站代码网站关键词如何优化呢&#xff1f;为大家讲解一下。一、h标签优化1)h标签分为h1-h6标签&#xff0c;h1-h6分为六个层级。权重依次递减2)h1标签是h标签中最重要的&#xff0c;也是赋予权重最高的&#xff0c;因为…

使用float设置经典的网站前端结构(深入探讨)

DIV的特点&#xff1a;关于宽度&#xff1a;1.要是DIV的宽没有设定&#xff0c;那么其宽度默认为auto&#xff0c;即会填满其父元素。2.要是DIV的宽度设定了&#xff0c;那么其宽度不会受子元素或父元素影响。3.要是DIV的子元素宽度大于它自己的宽度&#xff0c;不管子元素有没…

产品开发都应该知道的8个网站,增强工作体验

0. 引言 好的资源网站可以节约我们大量的开发时间&#xff0c;那么本期&#xff0c;就分享下多年积攒的高质量前端、设计网站。每个都值得收藏&#xff01; 图标类 1. iconfont 阿里巴巴图标库 网址&#xff1a;www.iconfont.cn 说明&#xff1a;你要的图标我都有&#xff…

利用cmd和ip入侵电脑_网络安全分享:如何避免你的网站被入侵?

在移动互联网的高速发展下&#xff0c;一切都开始进入了以数据和流量为王时代。那么企业想要发展就要开始改变经营模式&#xff0c;从而就出现了线下和线上运营模式。通过线上推广宣传扩大知名度&#xff0c;做线上就必须要有自己的网站&#xff0c;但是有了网站后还需要用心维…

前端 domparser未定义怎么解决_小白如何学Web前端 怎么解决网站响应时间过长

小白如何学Web前端&#xff1f;怎么解决网站响应时间过长&#xff1f;在完成网页制作项目的时候&#xff0c;有人发现在这个过程中网页打开很慢&#xff0c;即网站响应时间过长。针对这个问题&#xff0c;下面就给大家分享几种比较好的解决方法。网站响应时间是什么?网站响应时…

数据量大的sql怎么做优化_绵阳网站排名优化怎么做

绵阳网站排名优化怎么做&#xff0c;推广佳传媒口碑好&#xff0c;做一个合格的推广佳传媒人&#xff1a;“永远积极&#xff0c;永不放弃” 是推广佳传媒人的信念&#xff1b;“认真、快、坚守承诺”是推广佳传媒人的行为准则&#xff1b;“没有任何借口”是推广佳传媒人的行为…

如何在线把网站html生成xml文件_网站地图对seo有作用吗?网站地图制作步骤分享...

网站地图是什么&#xff1f;从字面上理解&#xff0c;就是网站的导航。它通常有两种格式sitemap.html和sitemap.xml&#xff0c;前者是给网站用户看的&#xff0c;后者是给搜索引擎看的&#xff0c;有利于收录。如果你不想做佛系seo&#xff0c;那么&#xff0c;制作网站地图就…

Alexa世界排名原理+作弊源码,为网站赢得好排名

推荐链接&#xff1a; 轻松注册&#xff0c;推荐一个网站获得20元 网络账本 —免费的网络记帐本&#xff0c;今天你记账了吗&#xff1f; 倍新咨询—投资咨询专家 在线炒外汇—免费订阅外汇月刊 学不好英语&#xff0c;不是你的错。因为学习内容太枯燥乏味&#xff01; 为…

查询ecshop网站代码排查方法_你的手机号都注册或绑定了那些app和网站?这里教你几个查询方法...

现在各大app套路百出&#xff0c;以前可以用邮箱来注册&#xff0c;现在只能用手机号注册&#xff0c;而且还得接收验证码。不像国外那些网站&#xff0c;一个邮箱就可以注册一大堆app和网站。有些app注册的太久连自己都忘记了。还有些网站app会泄露用户信息&#xff0c;导致骚…

index加载显示servlet数据_可视化动态网站线形图加载

首先是左边的折线图模块更改的位置准备左面的视图对象准备属性&#xff0c;注意get和set方法创建对应的服务层接口和实现类左面线形图的接口方法接口实现类编写代码接上面的代码接上面的代码接上面的代码测试类测试数据的形成测试结果我们用在线的JSON工具查看一下创建一个Serv…