/* * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。 * * 指定登记&发行网站: https://www.zhiqim.com/ 欢迎加盟知启蒙,[编程有你,知启蒙一路随行]。 * * 本文采用《知启蒙登记发行许可证》,除非符合许可证,否则不可使用该文件! * 1、您可以免费使用、修改、合并、出版发行和分发,再授权软件、软件副本及衍生软件; * 2、您用于商业用途时,必须在原作者指定的登记网站,按原作者要求进行登记; * 3、您在使用、修改、合并、出版发行和分发时,必须包含版权声明、许可声明,及保留原作者的著作权、商标和专利等知识产权; * 4、您在互联网、移动互联网等大众网络下发行和分发再授权软件、软件副本及衍生软件时,必须在原作者指定的发行网站进行发行和分发; * 5、您可以在以下链接获取一个完整的许可证副本。 * * 许可证链接:http://zhiqim.org/licenses/zhiqim_register_publish_license.htm * 发行和交流站点:http://www.zhiqim.com * * 除非法律需要或书面同意,软件由原始码方式提供,无任何明示或暗示的保证和条件。详见完整许可证的权限和限制。 */ +(function(Z) { /**************************************************/ //定义浏览器类型 /**************************************************/ Z.B = Z.Browser = { mobile: /mobile/.test(Z.ua), iphone: /iphone/.test(Z.ua), ipad: /ipad/.test(Z.ua), win64: /wow64/.test(Z.ua), firefox: /firefox/.test(Z.ua), webkit: /webkit/.test(Z.ua), safari: /safari/.test(Z.ua), chrome: /chrome/.test(Z.ua), opera: /opera/.test(Z.ua), mozilla: /mozilla/.test(Z.ua) && !/compatible/.test(Z.ua), msie: (/msie/.test(Z.ua) || /trident/.test(Z.ua)) && !/opera/.test(Z.ua), msieOnly: /msie/.test(Z.ua), msie11: /trident\/7/.test(Z.ua), msie10: /msie 10/.test(Z.ua), msie9: /msie 9/.test(Z.ua), msie8: /msie 8/.test(Z.ua), msie7: /msie 7/.test(Z.ua), msie6: /msie 6/.test(Z.ua), msieVer: /msie/.test(Z.ua)?parseInt(Z.ua.match(/msie (\d+)/)[1]):100 }; if (Z.B.msieVer <= 8) {//IE8以内创建HTML5新规定的元素 var html5ne = ["abbr", "article", "aside", "datalist", "details", "dialog", "eventsource", "figure", "footer", "header", "hgroup", "main", "mark", "menu", "meter", "nav", "output", "progress", "section", "time", "audio", "canvas", "video"]; var nei= html5ne.length; while (nei--){ document.createElement(html5ne[nei]); } } /**************************************************/ //定义文档和节点相关方法 /**************************************************/ Z.D = Z.Document = { id: function(id, doc) { doc = doc || document; return doc.getElementById(id); }, has: function(id, doc) { doc = doc || document; return doc.getElementById(id) != null; }, create: function(tag, doc) { doc = doc || document; return doc.createElement(tag); }, names: function(name, doc) { doc = doc || document; return doc.getElementsByName(name); }, tagNames: function(name, doc) { doc = doc || document; return doc.getElementsByTagName(name); }, classNames: function(name, doc) { doc = doc || document; if (doc.getElementsByClassName) {//支持方法 return doc.getElementsByClassName(name); } var elems = []; Z.each(this.tagNames("*"), function(elem) { Z.each(elem.className.split(" "), function(clazz) { if (clazz == name){ elems.push(elem); } }); }); return elems; }, attrs: function(name, value, doc) { doc = doc || document; var elems = []; Z.each(this.tagNames("*"), function(elem) { if (value == Z.EL.get(elem, name)){ elems.push(elem); } }); return elems; }, scrollTop: function(doc) { doc = doc || document; return doc.body.scrollTop + doc.documentElement.scrollTop; }, scrollLeft: function(doc) { doc = doc || document; return doc.body.scrollLeft + doc.documentElement.scrollLeft; }, scrollWidth: function(doc) {//可滚动展示宽度=(clientWidth
中点击事件,id=2事件时stop,则id=1的id就不会被触发 if (e && e.stopPropagation){ e.stopPropagation(); }else if (window.event){ window.event.cancelBubble = true; } return false; }, forbidden: function(e) {//停止冒泡和取消缺省事件 Z.E.stop(e); Z.E.cancel(e); }, clientX: function(e) {//点击位置相对于浏览器的X坐标 return this.event(e).clientX; }, clientY: function(e) {//点击位置相对于浏览器的Y坐标 return this.event(e).clientY; }, screenX: function(e) {//点击位置相对于屏幕的X坐标 return this.event(e).clientX; }, screenY: function(e) {//点击位置相对于屏幕的Y坐标 return this.event(e).clientY; }, wheelDelta: function(e) {//滚轮增量 return Z.B.firefox?(-this.event(e).detail*40):this.event(e).wheelDelta; }, /***************************************************/ //判断按键,支持退格,复制粘贴等 /***************************************************/ isCtrl: function(e) {//按住控制键 return Z.E.event(e).ctrlKey; }, isEsc: function(e) {//退出 return Z.E.key(e) === 27; }, isBackspace: function(e) {//退格 return Z.E.key(e) === 8; }, isEnter: function(e) {//回车 return Z.E.key(e) === 13; }, isCtrlC: function(e) {//Ctrl+C return Z.E.isCtrl(e) && Z.E.key(e) == 67; }, isCtrlV: function(e) {//Ctrl+V return Z.E.isCtrl(e) && Z.E.key(e) == 86; } }; /**************************************************/ //定义元素操作 /**************************************************/ Z.EL = Z.Element = { PX:["top", "bottom", "left", "right", "width", "height", "min-width", "max-width", "min-height", "max-height", "line-height", "text-indent", "minWidth", "maxWidth", "minHeight", "maxHeight", "lineHeight", "textIndent", "margin-top", "margin-bottom", "margin-left", "margin-right", "padding-top", "padding-bottom", "padding-left", "padding-right", "font-size", "marginTop", "marginBottom", "marginLeft", "marginRight", "paddingTop", "paddingBottom", "padding-Left", "paddingRight", "fontSize"], has: function(elem, name) {//是否有属性 if (!elem || !elem.nodeType) return false; if (name in elem) return true; else if (elem.hasAttribute && elem.hasAttribute(name)) return true; return false; }, get: function(elem, name) {//获取属性 if (!elem || !elem.nodeType) return null; if (name in elem) return elem[name]; else if (elem.getAttribute) return elem.getAttribute(name); return null; }, set: function(elem, name, value) {//设置属性 if (!elem || !elem.nodeType) return; if (name in elem) elem[name] = value; else if (elem.setAttribute) elem.setAttribute(name, value); }, equals: function(elem, name, value) {//判断属性值是否等于指定值 if (!elem || !elem.nodeType) return false; return Z.EL.get(elem, name) == value; }, style: function(elem, style) {//设置样式 if (!this.has(elem, "style")) return; if (style === Z.u){//未传参数 return elem.style; } var obj = Z.AR.toObject(style, ";"); for (var key in obj){ elem.style[key] = obj[key]; } }, css: function(elem, name, value) {//读样式或写样式 if (!this.has(elem, "style")) return; if (name == "opacity") {//opacity单独对待 return this.opacity(elem, value); } if (arguments.length == 2) {//2个参数时表示读参数 if (elem.style[name]){ return elem.style[name]; } if (elem.currentStyle){ return elem.currentStyle[name]; } if (document.defaultView){ return document.defaultView.getComputedStyle(elem, null)[name]; } return ""; } else if (arguments.length == 3) {//3个参数时表示写参数 //检查top,bottom,left,right,width,height支持数字 if (Z.AR.contains(Z.EL.PX, name)){ value = (Z.T.isNumber(value) || Z.V.isInteger(value) || Z.V.isFloat(value))?value+"px":value; } elem.style[name] = value; } }, cssNum: function(elem, name) { return Z.S.prefixNum(this.css(elem, name)); }, opacity: function(elem, value) { if (!this.has(elem, "style")) return; if (value === Z.u) { if ("opacity" in elem.style){ return elem.style.opacity?parseFloat(elem.style.opacity):0; }else{ var filter = elem.style["filter"]; var opMatch = (!filter)?null:filter.match(/opacity=([\d.]*)[\)\,\s]/i); if (!opMatch || opMatch.length < 2) return 0; return opMatch[1] / 100; } } else if (Z.T.isNumber(value) || Z.V.isFloat(value)) {//数字或者数字型字符串 value = +value; if ("opacity" in elem.style){ elem.style.opacity = value; }else{ elem.style["filter"] = "alpha(opacity=" + value*100 + ")"; } } }, className: function(elem, className) { if (!this.has(elem, "className")) return null; if (className === Z.u){//未传参数 return elem.className; } elem.className = className; }, addClass: function(elem, className) { if (!this.has(elem, "className")) return; var classArr = Z.AR.toArray(elem.className, Z.R.SPACE); if (Z.AR.contains(classArr, className)) return; classArr.push(className); elem.className = Z.AR.toString(classArr, " "); }, removeClass: function(elem, className) { if (!this.has(elem, "className")) return; var classArrRemove = Z.AR.toArray(className, Z.R.SPACE); var classNameElem = elem.className; classArrRemove.map(function(clName) { clName = clName.trim(); if (classNameElem.indexOf(clName) === -1) return; classNameElem = classNameElem.replace(clName, "").replace(/\s\s/g, " "); }); elem.className = classNameElem.trim(); }, hasClass: function(elem, className) { if (!this.has(elem, "className")) return false; var classArr = Z.AR.toArray(elem.className, Z.R.SPACE); return Z.AR.contains(classArr, className); }, toggleClass: function(elem, className) { this.hasClass(elem, className)?this.removeClass(elem, className):this.addClass(elem, className); }, select: function(elem) { if (!elem || !elem.nodeType) return; elem.select(); }, selection: function(elem) { if (!this.has(elem, "value")) return ""; var value = this.get(elem, "value"); if (Z.V.isEmpty(value)) return ""; if (!("selectionStart" in elem)) return ""; var start = elem.selectionStart; var end = elem.selectionEnd; return value.substring(start, end); }, isSelection: function(elem) { return Z.V.isNotEmpty(this.selection(elem)); }, focus: function(elem) { if (!elem || !elem.nodeType) return; elem.focus(); }, focusEnd: function(elem, len) {//元素焦点捕捉 if (!elem || !elem.nodeType) return; len = len || 0; if (Z.B.msieOnly) { var range = elem.createTextRange(); (len == 0)?range.collapse(false):range.move("character", len); range.select(); } else { len = (len == 0)?elem.value.length:len; elem.setSelectionRange(len, len); elem.focus(); } }, parent: function(elem) {//元素父元素 if (!elem || !elem.nodeType) return null; var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parentIndex: function(elem) {//元素子节点在父元素的索引 var ind = 0; while(elem = elem.previousSibling){ if (elem.nodeType == 1) ind++; } return ind; }, childs: function(elem) {//元素子节点 if (!elem || !elem.nodeType) return null; return elem.childNodes; }, children: function(elem) {//元素子元素 if (!elem || !elem.nodeType) return null; return elem.children; }, html: function(elem, value) {//设置元素HTML代码或获取HTML代码 if (!elem || !elem.nodeType) return; if (value === Z.u) return elem.innerHTML; else elem.innerHTML = value; }, htmls: function(elem, value) {//替换元素或获取outerHTML代码 if (!elem || !elem.nodeType) return; if (value === Z.u) return elem.outerHTML; else elem.outerHTML = value; }, htmlc: function(elem, value) {//设置元素HTML代码或获取HTML代码 if (!elem || !elem.nodeType) return; if (value === Z.u) return elem.innerHTML; elem.innerHTML = value; //1.八项指定内容加载,其中四项是相对定位 if (Z.Input && Z.Input.load) {//输入框验证 Z.Input.load(elem); } if (Z.ButtonGroup && Z.ButtonGroup.load) {//按钮组 Z.ButtonGroup.load(elem); } if (Z.Checkbox && Z.Checkbox.load) {//多选按钮 Z.Checkbox.load(elem); } if (Z.Radio && Z.Radio.load) {//单选按钮 Z.Radio.load(elem); } if (Z.Select && Z.Select.load) {//选择框 Z.Select.load(elem); } if (Z.Dropdown && Z.Dropdown.load) {//下拉列表 Z.Dropdown.load(elem); } if (Z.Textarea && Z.Textarea.load) {//选择框 Z.Textarea.load(elem); } if (Z.CallFrame && Z.CallFrame.load) {//表单iframe调用 Z.CallFrame.load(); } //2.两项全局更新的,AJAX内容会影响外部布局 if (Z.Tooltip && Z.Tooltip.load) {//提示框 Z.Tooltip.load(); } if (Z.Clipboard && Z.Clipboard.onload) {//复制按钮 Z.Clipboard.onload(); } //3.判断是否有要求处理 var $allScript = elem.querySelectorAll('script'); for (var i=0;i<$allScript.length;i++) { // 获取 js 代码 var $script = $allScript[i]; var jsString = $script.innerHTML; var jsSrc = $script.getAttribute('src'); // 判断是引入还是书写 if (Z.V.isEmptyBlank(jsString) && (jsSrc === null || Z.V.isEmptyBlank(jsString))) continue; // 定义新 script 节点 var $newScript = document.createElement('script'); // 赋值 script 的属性值 var attrs = $script.attributes; for (var j=0;j", ""], optgroup: [1, ""], legend: [1, "
", "
"], thead: [1, "", "
"], tbody: [1, "", "
"], tfoot: [1, "", "
"], colgroup: [1, "", "
"], caption: [1, "", "
"], tr: [2, "", "
"], td: [3, "", "
"], th: [3, "", "
"], col: [2, "", "
"], area: [1, "", "" ], _default: [0, "", ""] }, createElement: function(html) {//创建HTML节点,返回一个类数组,可能是数组或NodeList或HTMLCollection if (!html) {//1.参数无效返回空数组 return []; } if (html.nodeType) {//2.本身是节点返回数组只包括本身 return [html]; } if (Z.T.isNumber(html)) {//3.如果是数字转为字符串 html += ""; } if (!Z.T.isString(html)) {//4.不是字符串不支持,返回空数组 return []; } if (!Z.R.HTML.test(html)) {//5.判断是否是HTML,如果不是则创建文本节点,返回数组包括本身 return [document.createTextNode(html)]; } //6.适配标签成XHTML样式,对如
, 等无结尾的
进行适配 html = html.replace(Z.R.HTML_XHTML_TAG, "<$1>"); //7.读取标签,并根据标签查询标签需要的特殊封装层次,这一步很重要,如需要在中,其他的在
中即可 var tag = (Z.R.HTML_TAG_NAME.exec(html) || ["", ""])[1].toLowerCase(), wrap = Z.H.wrapMap[tag] || Z.H.wrapMap._default, depth = wrap[0], div = document.createElement("div"); //8.把HTML加到定义的div节点上,再根据封装层次取出节点 div.innerHTML = wrap[1] + html + wrap[2]; while (depth--){ div = div.lastChild; } return div.childNodes; }, displayCache: {}, displayDefault: function(tag) {//查询标签缺省的display值,查过之后存储到缓存中 if (this.displayCache[tag]) {//1.已有检查的返回 return this.displayCache[tag]; } //2.增加到body中查找是否能读取display var body = document.body; var elem = Z.D.create(tag); body.appendChild(elem); var display = Z.EL.css(elem, "display"); body.removeChild(elem); if (display !== "" && display !== "none") { this.displayCache[tag] = display; return display; } //3.新建iframe中读取display var iframe = Z.D.create("iframe"); iframe.frameBorder = iframe.width = iframe.height = 0; body.appendChild(iframe); var iframeDoc = (iframe.contentWindow || iframe.contentDocument ).document; iframeDoc.write((document.compatMode === "CSS1Compat"?"":"") + ""); iframeDoc.close(); elem = iframeDoc.createElement(tag); iframeDoc.body.appendChild(elem); display = this.css(elem, "display"); body.removeChild(iframe); this.displayCache[tag] = display; return display; } }; /**************************************************/ //定义地址的增删等操作 /**************************************************/ Z.L = Z.Location = { protocol: location.href.match(/^https/i)?"https":"http", reload: function(target) {//刷新 target = target || window; target.location.reload(); }, access: function(url, target) {//访问 Z.A.assertNotEmptyBlank(url, "Z.Location的所有函数url不能为空"); target = target || window; if (target === "open") { var $form = Z("
").appendTo("body"); $form.attr({"action": url, "method": "post", "target": "blank"})[0].submit(); $form.remove(); } else if (target.name && target.name == "zCallFrame") {//Frame调用 url += ((url.indexOf("?")==-1)?"?":"&") + "zCallFrame=true"; target.location.href = url; } else target.location.href = url; }, check: function(url, name, form, target) {//检查 Z.A.assertNotEmptyBlank(url, "Z.Location的所有函数url不能为空"); if (form) {//第三个参数,可选form/target if (!(form instanceof HTMLFormElement) && target == null) { target = form; form = null; } } var value = Z.FM.getChecked(name, form); if (!value) return; url += (url.indexOf("?")==-1)?"?":"&"; url += name+"="+encodeURIComponent(value); Z.L.access(url, target); }, confirm: function(url, message, name, form, target) {//确认 Z.A.assertNotEmptyBlank(url, "Z.Location的所有函数url不能为空"); if (form) {//第四个参数,可选form/target if (!(form instanceof HTMLFormElement) && target == null) { target = form; form = null; } } if (name) {//有指定选择项,把选项名和值加到URL中 var value = Z.FM.getChecked(name, form); if (!value) return; url += (url.indexOf("?")==-1)?"?":"&"; url += name+"="+encodeURIComponent(value); } Z.confirm(message, function(){ Z.L.access(url, target); }); }, href: function(param, param2) {//多参数访问 if (Z.T.isString(param)) {//简单模式,两个参数和access一样 Z.L.access(param, param2); } else if (Z.T.isPlainObject(param)) {//对象模式,支持多参数 var url = param.url || null; var message = param.message || null; var name = param.name || null; var form = param.form || null; var target = param2 || param.target || null; if (name == null) Z.L.access(url, target); else if (message == null) Z.L.check(url, name, form, target); else Z.L.confirm(url, message, name, form, target); } else {//仅支持字符串和线对象两种方式 Z.alert("Z.L.href函数第一个参数必须是字符串或纯对象"); } } }; /**************************************************/ //定义Cookie相关方法 /**************************************************/ Z.CK = Z.Cookie = { all: function() { return document.cookie; }, add: function(name, value, expires, path, domain, secure) { if (!cookie || !cookie.name || Z.V.isEmptyBlank(cookie.name)) return; var name = escape(Z.S.trim(cookie.name)); var value = escape(cookie.value || ""); var ck = name + "=" + value; if (Z.T.isNumber(cookie.expires) || Z.V.isInteger(cookie.expires)) { var date = new Date(); date.setTime(date.getTime() + (+cookie.expires * 1000)); ck += ";expires=" + date.toGMTString(); } ck += (cookie.path)?";path=" + cookie.path:""; ck += (cookie.domain)?";domain=" + cookie.domain:""; ck += (cookie.secure===true)?";secure":""; document.cookie = ck; }, remove: function(name) { var date = new Date(); date.setTime(date.getTime() - 10 * 1000); document.cookie = name+"=value;expires=" + date.toGMTString(); }, get: function(name) { if (Z.V.isEmptyBlank(name)) return ""; name = escape(Z.S.trim(name)); var cookies = Z.AR.toArray(document.cookie, ";"); for(var i=0;i