/// /// /// (function (window, undefined) { /* 命名空间 */ var jc = {}; /* require */ jc.require = { url: [], success: null }; /* 判断客户端 */ jc.isMobile = !!(/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent))); /* 存放所有Ready要执行的函数 */ jc.fnInit = []; /* 存放所有Scroll要执行的函数 */ jc.fnScroll = []; /* 存放所有Resize要执行的函数 */ jc.fnResize = []; /* 存放所有UI */ jc.ui = {}; /* 存放UI所有属性 */ jc.tmpUiValue = {} /* 默认层级 */ jc.zIndex = { now: 10000, get: function () { return this.now; }, plus: function () { this.now++; return this.get(); } } /* 创建dom */ jc.createDOM = function (json) { var div = document.createElement("div"); for (var attr in json) { var curAttr = attr; if (curAttr == "classname") { curAttr = "class"; } else { curAttr = curAttr.replace(/([A-Z])/g, "-$1").toLowerCase(); } div.setAttribute(curAttr, json[attr]); } return div; } /* ui继承 */ jc.uiExtend = function (uiName, obj, asyn) { jc.tmpUiValue[uiName] = function ($element, _element, uiName) { this.$element = $element; this._element = _element; this.uiName = uiName; this.className = "J_" + this.uiName; this.isInit = false; }; for (var attr in obj) { jc.tmpUiValue[uiName].prototype[attr] = obj[attr]; } if (asyn) { if ($.isReady) { jc.uiInit(uiName); } else { jc.log("[" + uiName + "] is not asyn"); } } }; /* 异步加载文件 */ jc.use = { reg: /[^a-zA-Z0-9]/g, queue: [], count: 0, cache: {}, isLoad: false, loadSuccess: function (queue) { var url = queue.url[queue.progress]; this.cache[url.replace(this.reg, '')] = true; if (queue.progress < queue.url.length - 1) { queue.progress++; this.load(queue); } else { if (queue.success) queue.success(); this.isLoad = false; if (this.count < this.queue.length - 1) { this.count++; this.load(this.queue[this.count]); } } }, load: function (queue) { var _this = this; this.isLoad = true; var element = null; var url = queue.url[queue.progress]; /* 如果之前加载过 */ if (this.cache[url.replace(this.reg, '')]) { this.loadSuccess(queue); return false; } if (url.indexOf(".js") != -1) { element = document.createElement("script"); element.src = url; element.type = "text/javascript"; } else if (url.indexOf(".css") != -1) { element = document.createElement("link"); element.href = url; element.rel = "stylesheet"; } queue.element = element; if (navigator.userAgent.indexOf('MSIE') != -1) { element.onreadystatechange = function () { if (this.readyState && this.readyState == "loading") { return; } else { element.onreadystatechange = null; _this.loadSuccess(queue); } }; } else { element.onload = element.onerror = function () { _this.loadSuccess(queue); } } document.getElementsByTagName("head")[0].appendChild(element); }, get: function (url, success) { if (!url || !url.length) { if (success) success(); return false; } this.queue.push({ url: $.isArray(url) ? url : [url], success: success, progress: 0, error: [] }); if (!this.isLoad) { this.load(this.queue[this.count]); } } }; /* 判断UI是否存在 返回个数 */ jc.hasUI = function (uiName) { if (typeof uiName != "string" || !jc.ui[uiName]) return 0; if (jc.ui[uiName].length) return jc.ui[uiName].length; } /* 寻找目标插件 */ jc.uiUpdate = function () { /* 判断本页面是否启用懒加载 */ if (document.body.getAttribute("data-lazyload")) { jc.lazyload.init(); }; /* 取出所有的DIV元素 */ var element = document.querySelectorAll ? document.body.querySelectorAll('div[data-ui]') : document.body.getElementsByTagName("div"); for (var i = 0, l = element.length; i < l; i++) { var curElement = element[i]; /* 如果已存在ui */ if (curElement.isSetup) continue; jc.uiSetup(curElement); } jc.uiInitAll(); }; /* 装载插件 */ jc.uiSetup = function (element) { var plugName = element.getAttribute("data-ui"); if (!plugName) return false; /* 如果没有这个UI 先写一个 */ if (!jc.ui[plugName]) { jc.ui[plugName] = { length: 0 } } /* 增加元素 */ var curUI = jc.ui[plugName]; /* 增加属性 看看有没有写业务 */ if (jc.tmpUiValue[plugName]) { /* 添加标识 uiFlag 作用就是 防止重复 jc.update */ element.isSetup = plugName; /* 当前暂存对象 */ var tmpUiValue = jc.tmpUiValue[plugName]; curUI[curUI.length] = new tmpUiValue($(element), element, plugName); /* 判断对象是否有 scroll 如果有就加到队列 */ if (tmpUiValue.prototype.scroll) { jc.fnScroll.push(curUI[curUI.length]); } /* 判断对象是否有 resize 如果有就加到队列 */ if (tmpUiValue.prototype.resize) { jc.fnResize.push(curUI[curUI.length]); } /* 自增 */ curUI.length++; } return plugName; } /* 初始化全部控件 */ jc.uiInitAll = function () { for (var attr in jc.ui) { jc.uiInit(attr); } } /* 初始化控件(单个) */ jc.uiInit = function (uiName) { var info = jc.tools.getWindowInfo(); var curUi = jc.ui[uiName]; /* 如果元素数量不等于0 */ if (jc.hasUI(uiName)) { for (var i = 0, l = curUi.length; i < l; i++) { /* 写上方法 */ curUi.each = function (fn) { for (var i = 0, l = this.length; i < l; i++) { if (fn) fn.call(this[i], this[i].$element); } } curUi.filter = function (term, fnName, a, b, c, d, e, f, g) {/* token=a */ var attr = $.trim(term).split("="); if (attr.length < 2) return; for (var i = 0, l = this.length; i < l; i++) { if (this[i]._element.getAttribute("data-" + $.trim(attr[0])) === $.trim(attr[1])) { if (this[i][fnName]) { this[i][fnName](a, b, c, d, e, f, g); } } } } curUi.trigger = function (fnName, a, b, c, d, e, f, g) { for (var i = 0, l = this.length; i < l; i++) { if (this[i][fnName]) this[i][fnName](a, b, c, d, e, f, g); } } var curUiOnly = curUi[i]; /* getString */ curUiOnly.getString = function (text, defalutText) { return (text || (defalutText || "")); } /* getTemplate */ curUiOnly.getTemplate = function (data, fnSuccess) { if (this.template) { var html = this.template(data); if (fnSuccess) fnSuccess(html); } else { jc.data.jsonp(window.static + "template/" + uiName + ".js", function (result) { curUiOnly.template = result; var html = curUiOnly.template(data); if (fnSuccess) fnSuccess(html); }); } } /* getString */ curUiOnly.getString = function (text, defalutText) { return (text || (defalutText || "")); } if (curUiOnly.init && !curUiOnly.isInit) { /* 如果有依赖文件先加载依赖文件 */ if (curUiOnly.use) { jc.use.get(curUiOnly.use, function () { curUiOnly.init(info); curUiOnly.isInit = true; }); } else { curUiOnly.init(info); curUiOnly.isInit = true; } } } } } /* 删除控件 */ jc.uiRemove = function (uiName, features) { if (!uiName) return false; //console.log(uiName) for (var attr in jc.ui) { var cur = jc.ui[attr]; if (uiName != attr) continue; if (!features) { delete cur; } if (typeof (features) == "object") { for (var i = 0, l = cur.length; i < l; i++) { if (cur[i]._element == features) { delete cur[i]; cur.length--; } } } } } /* 初始化控件*/ jc.fnInit.push(function () { //jc.uiSelectAll; jc.use.get(jc.require.url, function () { if (jc.require.success) jc.require.success(); jc.uiUpdate(); if (jc.uiReady) jc.uiReady(); }); }); /* 工具方法 */ jc.tools = { formatDate: function (timestamp, format) { var newDate = new Date(timestamp); var date = { "Y+": newDate.getUTCFullYear(), "M+": newDate.getMonth() + 1, "d+": newDate.getDate(), "h+": newDate.getHours(), "m+": newDate.getMinutes(), "s+": newDate.getSeconds(), "q+": Math.floor((newDate.getMonth() + 3) / 3), "S+": newDate.getMilliseconds() }; if (!format) { format = "YYYY年M月dd日"; } if (/(y+)/i.test(format)) { format = format.replace(RegExp.$1, (newDate.getFullYear() + '').substr(4 - RegExp.$1.length)); } for (var k in date) { if (new RegExp("(" + k + ")").test(format)) { format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ("00" + date[k]).substr(("" + date[k]).length)); } } return format; }, eventListener: { add: function (obj, evType, fn) { obj.addEventListener ? obj.addEventListener(evType, fn, false) : obj.attachEvent("on" + evType, fn); }, remove: function (obj, evType, fn) { obj.removeEventListener ? obj.removeEventListener(evType, fn, false) : obj.detachEvent("on" + evType, fn); } }, range: function (iNow, iMin, iMax) { if (iNow > iMax) return iMax; else if (iNow < iMin) return iMin; return iNow; }, getWindowInfo: function () { var result = { scrollTop: (document.documentElement.scrollTop || document.body.scrollTop), scrollLeft: (document.documentElement.scrollLeft || document.body.scrollLeft), scrollHeight: (document.documentElement.scrollHeight || document.body.scrollHeight), scrollWidth: (document.documentElement.scrollWidth || document.body.scrollWidth), windowWidth: (document.documentElement.clientWidth || document.body.clientWidth), windowHeight: (document.documentElement.clientHeight || document.body.clientHeight) } return result; }, hasTransform: function () { if (!window.getComputedStyle) { return false; } var el = document.createElement('p'), has3d, transforms = { 'webkitTransform': '-webkit-transform', 'OTransform': '-o-transform', 'msTransform': '-ms-transform', 'MozTransform': '-moz-transform', 'transform': 'transform' }; // Add it to the body to get the computed style. document.body.insertBefore(el, null); for (var t in transforms) { if (el.style[t] !== undefined) { el.style[t] = "translate3d(1px,1px,1px)"; has3d = window.getComputedStyle(el).getPropertyValue(transforms[t]); } } document.body.removeChild(el); return (has3d !== undefined && has3d.length > 0 && has3d !== "none"); }, setStyleToCss3Hack: function (obj, styleName, value) { styleName = styleName.charAt(0).toUpperCase() + styleName.substring(1); obj.style['Webkit' + styleName] = value; obj.style['Moz' + styleName] = value; obj.style['ms' + styleName] = value; obj.style['O' + styleName] = value; obj.style[name] = value; } }; /* 延迟加载 */ jc.lazyload = { queue: [], push: function (element) { var dataSrc = element.getAttribute("data-src"); if (!dataSrc) return; var $element = $(element); var top = $element.offset().top; var height = $(element).height(); if (this.check(top, height)) { element.src = dataSrc; } else { this.queue.push({ element: element, $element: $element, top: top, src: dataSrc, height: height, success: false }); element.style.opacity = "0"; element.style.filter = "alpha(opacity=0)"; } }, check: function (top, height) { var info = jc.tools.getWindowInfo(); if (top >= info.scrollTop - height && top < (info.scrollTop + info.windowHeight)) { return true; } else { return false; } }, listener: function () { if (this.queue.length) { for (var i = 0, l = this.queue.length; i < l; i++) { var cur = this.queue[i]; if (cur.success) continue; if (this.check(cur.top, cur.height)) { cur.element.src = cur.src; cur.$element.stop().animate({ opacity: 1 }, "slow"); cur.success = true; } } } }, init: function () { var _this = this; jc.tools.eventListener.add(window, "scroll", function () { _this.listener(); }); jc.tools.eventListener.add(window, "resize", function () { _this.listener(); }); var img = document.getElementsByTagName("img"); if (!img.length) return; for (var i = 0, l = img.length; i < l; i++) { this.push(img[i]); } } } /* hash */ jc.hash = { now: {}, getObject: function () { this.update(); return this.now; }, stringify: function (obj) { var tmp = []; obj = obj ? obj : this.now; for (var attr in obj) { if (obj[attr] == "undefined") { obj[attr] = ""; } tmp.push(attr + "=" + obj[attr]); } return tmp.join(";"); }, update: function () { var hash = window.location.hash.substr(1); var split = hash.split(";"); for (var i = 0, l = split.length; i < l; i++) { var key = split[i].split("="); if (key.length === 2) { this.now[key[0]] = key[1]; } } }, write: function () { window.location.hash = "#" + this.stringify(); }, get: function (keyName) { this.update(); return this.now[keyName] ? this.now[keyName] : ''; }, set: function (keyName, value) { this.now[keyName] = value; }, remove: function (keyName) { if (this.now[keyName]) delete this.now[keyName]; } } /* param */ jc.param = { now: {}, getObject: function () { this.update(); return this.now; }, stringify: function (obj) { var tmp = []; obj = obj ? obj : this.now; for (var attr in obj) { if (obj[attr] == "undefined") { obj[attr] = ""; } tmp.push(attr + "=" + obj[attr]); } return tmp.join("&"); }, update: function () { var hash = window.location.search.substr(1); var split = hash.split("&"); for (var i = 0, l = split.length; i < l; i++) { var key = split[i].split("="); if (key.length === 2) { this.now[key[0]] = key[1]; } } }, get: function (keyName) { this.update(); return this.now[keyName] ? this.now[keyName] : ''; }, set: function (keyName, value) { this.now[keyName] = value; }, remove: function (keyName) { if (this.now[keyName]) delete this.now[keyName]; } } /* 碰撞检测 */ jc.overlap = function (obj1, obj2) { if ($(obj1).offset().left > $(obj2).offset().left - obj1.offsetWidth && $(obj1).offset().top > $(obj2).offset().top - obj1.offsetHeight && $(obj1).offset().top < $(obj2).offset().top + obj2.offsetHeight && $(obj1).offset().left < $(obj2).offset().left + obj2.offsetWidth) { return true; } }; /* cookie */ jc.cookie = { add: function (name, value, path, days) {//四个参数,第一个是cookie的名称,第二个是值,第三个是路径, 第四个是保存天数 var expDays = days || 30; // 默认保存30天 var exp = new Date(); //new Date("December 31, 9998"); exp.setTime(exp.getTime() + expDays * 24 * 60 * 60 * 1000); document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString() + ((!path) ? ";path=/" : ";path=" + path); }, get: function (name) { var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); if (arr != null) return unescape(arr[2]); return null; }, remove: function (name, path) { var exp = new Date(); exp.setTime(exp.getTime() + (-1 * 24 * 60 * 60 * 1000)); var cval = jc.cookie.get(name); document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString() + ((!path) ? ";path=/" : ";path=" + path); } }; /* rem */ jc.rem = { nowPx: 50, state: false, _fnResize: function () { var _width = document.documentElement.clientWidth || document.body.clientWidth; var zoom = _width / 320, fontsizerem = zoom * 50; if (_width < 320) fontsizerem = 50; var root = document.getElementById("root"); if (!root) { var root = document.createElement("STYLE"); root.id = "root" root.type = "text/css"; document.head.appendChild(root); } root.innerHTML = 'html{font-size:' + fontsizerem + 'px;}'; jc.rem.nowPx = fontsizerem; }, on: function () { this.state = true; if (window.addEventListener) { window.addEventListener("resize", this._fnResize); this._fnResize(); } }, off: function () { this.state = false; if (window.removeEventListener) { window.removeEventListener("resize", this._fnResize); document.documentElement.style.cssText = ""; } }, pxToRem: function (px, def) { return (parseFloat(px) / (def ? 50 : this.nowPx)) + "rem"; }, remToPx: function (rem, def) { return (parseFloat(rem) * (def ? 50 : this.nowPx)) + "px"; }, log: function (iMin, iMax) { if ((iMin > iMax) || !iMin || !iMax || !window.console) return; var sLog = "/*\n"; for (var i = iMin; i <= iMax; i++) { sLog += "* " + i + "px == " + this.pxToRem(i) + "\n"; } console.log(sLog + "*/"); } }; /* jsonp */ jc.data = { queue: [], //队列存放 每一条信息 {url:xxxx,data:{a:1,b2,c3},success:fn}; count: 0, script: null, setup: function (str) { this.queue[this.count - 1].success(str); /* 销毁 递归 */ document.head.removeChild(this.script); this.script = null; if (this.count < this.queue.length) { var cur = this.queue[this.count]; this.load(cur.url, cur.data, cur.success); this.count++; } }, load: function (url, data, success) { this.script = document.createElement("script"); this.script.type = "text/javascript"; var attribute = []; if (typeof data == "object") { for (var attr in data) { attribute.push(attr + "=" + data[attr]); } /* 增加随机数 防止缓存 */ attribute.push("r=" + parseInt(Math.random() * 10000)); /* 增加jsonp的标识 */ attribute.push("jsonp=" + "jc.data.setup"); } this.script.src = url + (attribute.length ? "?" + attribute.join("&") : ""); document.head.appendChild(this.script); }, jsonp: function (url, data, success) { /* 处理传参 */ if ($.isFunction(data)) { success = data; data = ""; } this.queue.push({ url: url, data: data, success: success }); if (!this.script) { var cur = this.queue[this.count] this.load(cur.url, cur.data, cur.success); this.count++; } } }; /* 是否启用自定义滚动条 */ jc.fnInit.push(function () { if ($("html").niceScroll && !jc.isMobile) { $("html").niceScroll({ zindex: 9999, autohidemode: false, cursorwidth: "4px", cursorcolor: "#333", cursorborder: 0, cursoropacitymax: 0.8 }); } }); /* 处理reday事件 */ $(function () { if (!jc.fnInit.length) return; for (var i = 0, l = jc.fnInit.length; i < l; i++) { jc.fnInit[i](); } }); /* 处理resize事件 */ $(window).resize(function () { var info = jc.tools.getWindowInfo(); for (var i = 0, l = jc.fnResize.length; i < l; i++) { jc.fnResize[i].resize(info); } }); /* 处理scroll事件 */ jc.fixScollTime = null; $(window).scroll(function () { var info = jc.tools.getWindowInfo(); /* 防止快速执行 */ clearTimeout(jc.fixScollTime); jc.fixScollTime = setTimeout(function () { for (var i = 0, l = jc.fnScroll.length; i < l; i++) { jc.fnScroll[i].scroll(info); } }, 1); }); window.jc = jc; })(window);