zhiqim_static.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200
  1. /*
  2. * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。
  3. *
  4. * 指定登记&发行网站: https://www.zhiqim.com/ 欢迎加盟知启蒙,[编程有你,知启蒙一路随行]。
  5. *
  6. * 本文采用《知启蒙登记发行许可证》,除非符合许可证,否则不可使用该文件!
  7. * 1、您可以免费使用、修改、合并、出版发行和分发,再授权软件、软件副本及衍生软件;
  8. * 2、您用于商业用途时,必须在原作者指定的登记网站,按原作者要求进行登记;
  9. * 3、您在使用、修改、合并、出版发行和分发时,必须包含版权声明、许可声明,及保留原作者的著作权、商标和专利等知识产权;
  10. * 4、您在互联网、移动互联网等大众网络下发行和分发再授权软件、软件副本及衍生软件时,必须在原作者指定的发行网站进行发行和分发;
  11. * 5、您可以在以下链接获取一个完整的许可证副本。
  12. *
  13. * 许可证链接:http://zhiqim.org/licenses/zhiqim_register_publish_license.htm * 发行和交流站点:http://www.zhiqim.com
  14. *
  15. * 除非法律需要或书面同意,软件由原始码方式提供,无任何明示或暗示的保证和条件。详见完整许可证的权限和限制。
  16. */
  17. +(function(Z)
  18. {
  19. /**************************************************/
  20. //定义浏览器类型
  21. /**************************************************/
  22. Z.B = Z.Browser =
  23. {
  24. mobile: /mobile/.test(Z.ua),
  25. iphone: /iphone/.test(Z.ua),
  26. ipad: /ipad/.test(Z.ua),
  27. win64: /wow64/.test(Z.ua),
  28. firefox: /firefox/.test(Z.ua),
  29. webkit: /webkit/.test(Z.ua),
  30. safari: /safari/.test(Z.ua),
  31. chrome: /chrome/.test(Z.ua),
  32. opera: /opera/.test(Z.ua),
  33. mozilla: /mozilla/.test(Z.ua) && !/compatible/.test(Z.ua),
  34. msie: (/msie/.test(Z.ua) || /trident/.test(Z.ua)) && !/opera/.test(Z.ua),
  35. msieOnly: /msie/.test(Z.ua),
  36. msie11: /trident\/7/.test(Z.ua),
  37. msie10: /msie 10/.test(Z.ua),
  38. msie9: /msie 9/.test(Z.ua),
  39. msie8: /msie 8/.test(Z.ua),
  40. msie7: /msie 7/.test(Z.ua),
  41. msie6: /msie 6/.test(Z.ua),
  42. msieVer: /msie/.test(Z.ua)?parseInt(Z.ua.match(/msie (\d+)/)[1]):100
  43. };
  44. if (Z.B.msieVer <= 8)
  45. {//IE8以内创建HTML5新规定的元素
  46. var html5ne = ["abbr", "article", "aside", "datalist", "details", "dialog", "eventsource", "figure", "footer", "header", "hgroup",
  47. "main", "mark", "menu", "meter", "nav", "output", "progress", "section", "time",
  48. "audio", "canvas", "video"];
  49. var nei= html5ne.length;
  50. while (nei--){
  51. document.createElement(html5ne[nei]);
  52. }
  53. }
  54. /**************************************************/
  55. //定义文档和节点相关方法
  56. /**************************************************/
  57. Z.D = Z.Document =
  58. {
  59. id: function(id, doc)
  60. {
  61. doc = doc || document;
  62. return doc.getElementById(id);
  63. },
  64. has: function(id, doc)
  65. {
  66. doc = doc || document;
  67. return doc.getElementById(id) != null;
  68. },
  69. create: function(tag, doc)
  70. {
  71. doc = doc || document;
  72. return doc.createElement(tag);
  73. },
  74. names: function(name, doc)
  75. {
  76. doc = doc || document;
  77. return doc.getElementsByName(name);
  78. },
  79. tagNames: function(name, doc)
  80. {
  81. doc = doc || document;
  82. return doc.getElementsByTagName(name);
  83. },
  84. classNames: function(name, doc)
  85. {
  86. doc = doc || document;
  87. if (doc.getElementsByClassName)
  88. {//支持方法
  89. return doc.getElementsByClassName(name);
  90. }
  91. var elems = [];
  92. Z.each(this.tagNames("*"), function(elem)
  93. {
  94. Z.each(elem.className.split(" "), function(clazz)
  95. {
  96. if (clazz == name){
  97. elems.push(elem);
  98. }
  99. });
  100. });
  101. return elems;
  102. },
  103. attrs: function(name, value, doc)
  104. {
  105. doc = doc || document;
  106. var elems = [];
  107. Z.each(this.tagNames("*"), function(elem)
  108. {
  109. if (value == Z.EL.get(elem, name)){
  110. elems.push(elem);
  111. }
  112. });
  113. return elems;
  114. },
  115. scrollTop: function(doc)
  116. {
  117. doc = doc || document;
  118. return doc.body.scrollTop + doc.documentElement.scrollTop;
  119. },
  120. scrollLeft: function(doc)
  121. {
  122. doc = doc || document;
  123. return doc.body.scrollLeft + doc.documentElement.scrollLeft;
  124. },
  125. scrollWidth: function(doc)
  126. {//可滚动展示宽度=(clientWidth<offsetWidth)?offsetWidth:clientWidth;
  127. doc = doc || document;
  128. return Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth);
  129. },
  130. scrollHeight: function(doc)
  131. {//可滚动展示高度=(clientHeight<offsetHeight)?offsetHeight:clientHeight;
  132. doc = doc || document;
  133. return Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight);
  134. },
  135. clientWidth: function(doc)
  136. {//窗口可视宽度(看得见的宽度)
  137. doc = doc || document;
  138. return doc.documentElement.clientWidth || doc.body.clientWidth;
  139. },
  140. clientHeight: function(doc)
  141. {//窗口可视高度(看得见的宽度)
  142. doc = doc || document;
  143. return doc.documentElement.clientHeight || doc.body.clientHeight;
  144. },
  145. offsetWidth: function(doc)
  146. {//可操作宽度(由元素决定,和窗口无关)
  147. doc = doc || document;
  148. return Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth);
  149. },
  150. offsetHeight: function(doc)
  151. {//可操作高度(由元素决定,和窗口无关)
  152. doc = doc || document;
  153. return Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight);
  154. },
  155. clearSelection: function()
  156. {//清除选中区域
  157. window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();
  158. }
  159. };
  160. /**************************************************/
  161. //定义事件的增删等操作
  162. /**************************************************/
  163. Z.E = Z.Event =
  164. {
  165. KEY: {
  166. ESC: 27, ENTER: 13,
  167. LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46
  168. },
  169. add: function(target, name, listener, $this)
  170. {
  171. listener = $this?Z.bind(listener, $this):listener;
  172. if (target.addEventListener){
  173. target.addEventListener(name, listener, false);
  174. }else if (target.attachEvent){
  175. target.attachEvent("on"+name, listener);
  176. }else{
  177. target["on"+name] = listener;
  178. }
  179. },
  180. remove: function(target, name, listener, $this)
  181. {
  182. listener = $this?Z.bind(listener, $this):listener;
  183. if (target.removeEventListener){
  184. target.removeEventListener(name, listener, false);
  185. }else if (target.detachEvent){
  186. target.detachEvent("on"+name, listener);
  187. }else{
  188. target["on"+name] = null;
  189. }
  190. },
  191. event: function(e)
  192. {
  193. return e || window.event;
  194. },
  195. key: function(e)
  196. {
  197. e = this.event(e);
  198. return e.which || e.keyCode;
  199. },
  200. target: function(e)
  201. {
  202. e = this.event(e);
  203. return e.target || e.srcElement;
  204. },
  205. current: function(e)
  206. {
  207. e = this.event(e);
  208. return e.currentTarget || e.srcElement;
  209. },
  210. cancel: function(e)
  211. {//取消缺省事件,如form.submit事件时,可取消submit缺省的动作
  212. if (e && e.preventDefault){
  213. e.preventDefault();
  214. }else if (window.event){
  215. window.event.returnValue = false;
  216. }
  217. return false;
  218. },
  219. stop: function(e)
  220. {//停止冒泡,冒泡事件从里到外,如<div id="1"><div id="2"></div></div>中点击事件,id=2事件时stop,则id=1的id就不会被触发
  221. if (e && e.stopPropagation){
  222. e.stopPropagation();
  223. }else if (window.event){
  224. window.event.cancelBubble = true;
  225. }
  226. return false;
  227. },
  228. forbidden: function(e)
  229. {//停止冒泡和取消缺省事件
  230. Z.E.stop(e);
  231. Z.E.cancel(e);
  232. },
  233. clientX: function(e)
  234. {//点击位置相对于浏览器的X坐标
  235. return this.event(e).clientX;
  236. },
  237. clientY: function(e)
  238. {//点击位置相对于浏览器的Y坐标
  239. return this.event(e).clientY;
  240. },
  241. screenX: function(e)
  242. {//点击位置相对于屏幕的X坐标
  243. return this.event(e).clientX;
  244. },
  245. screenY: function(e)
  246. {//点击位置相对于屏幕的Y坐标
  247. return this.event(e).clientY;
  248. },
  249. wheelDelta: function(e)
  250. {//滚轮增量
  251. return Z.B.firefox?(-this.event(e).detail*40):this.event(e).wheelDelta;
  252. },
  253. /***************************************************/
  254. //判断按键,支持退格,复制粘贴等
  255. /***************************************************/
  256. isCtrl: function(e)
  257. {//按住控制键
  258. return Z.E.event(e).ctrlKey;
  259. },
  260. isEsc: function(e)
  261. {//退出
  262. return Z.E.key(e) === 27;
  263. },
  264. isBackspace: function(e)
  265. {//退格
  266. return Z.E.key(e) === 8;
  267. },
  268. isEnter: function(e)
  269. {//回车
  270. return Z.E.key(e) === 13;
  271. },
  272. isCtrlC: function(e)
  273. {//Ctrl+C
  274. return Z.E.isCtrl(e) && Z.E.key(e) == 67;
  275. },
  276. isCtrlV: function(e)
  277. {//Ctrl+V
  278. return Z.E.isCtrl(e) && Z.E.key(e) == 86;
  279. }
  280. };
  281. /**************************************************/
  282. //定义元素操作
  283. /**************************************************/
  284. Z.EL = Z.Element =
  285. {
  286. PX:["top", "bottom", "left", "right", "width", "height",
  287. "min-width", "max-width", "min-height", "max-height", "line-height", "text-indent",
  288. "minWidth", "maxWidth", "minHeight", "maxHeight", "lineHeight", "textIndent",
  289. "margin-top", "margin-bottom", "margin-left", "margin-right", "padding-top", "padding-bottom", "padding-left", "padding-right", "font-size",
  290. "marginTop", "marginBottom", "marginLeft", "marginRight", "paddingTop", "paddingBottom", "padding-Left", "paddingRight", "fontSize"],
  291. has: function(elem, name)
  292. {//是否有属性
  293. if (!elem || !elem.nodeType)
  294. return false;
  295. if (name in elem)
  296. return true;
  297. else if (elem.hasAttribute && elem.hasAttribute(name))
  298. return true;
  299. return false;
  300. },
  301. get: function(elem, name)
  302. {//获取属性
  303. if (!elem || !elem.nodeType)
  304. return null;
  305. if (name in elem)
  306. return elem[name];
  307. else if (elem.getAttribute)
  308. return elem.getAttribute(name);
  309. return null;
  310. },
  311. set: function(elem, name, value)
  312. {//设置属性
  313. if (!elem || !elem.nodeType)
  314. return;
  315. if (name in elem)
  316. elem[name] = value;
  317. else if (elem.setAttribute)
  318. elem.setAttribute(name, value);
  319. },
  320. equals: function(elem, name, value)
  321. {//判断属性值是否等于指定值
  322. if (!elem || !elem.nodeType)
  323. return false;
  324. return Z.EL.get(elem, name) == value;
  325. },
  326. style: function(elem, style)
  327. {//设置样式
  328. if (!this.has(elem, "style"))
  329. return;
  330. if (style === Z.u){//未传参数
  331. return elem.style;
  332. }
  333. var obj = Z.AR.toObject(style, ";");
  334. for (var key in obj){
  335. elem.style[key] = obj[key];
  336. }
  337. },
  338. css: function(elem, name, value)
  339. {//读样式或写样式
  340. if (!this.has(elem, "style"))
  341. return;
  342. if (name == "opacity")
  343. {//opacity单独对待
  344. return this.opacity(elem, value);
  345. }
  346. if (arguments.length == 2)
  347. {//2个参数时表示读参数
  348. if (elem.style[name]){
  349. return elem.style[name];
  350. }
  351. if (elem.currentStyle){
  352. return elem.currentStyle[name];
  353. }
  354. if (document.defaultView){
  355. return document.defaultView.getComputedStyle(elem, null)[name];
  356. }
  357. return "";
  358. }
  359. else if (arguments.length == 3)
  360. {//3个参数时表示写参数
  361. //检查top,bottom,left,right,width,height支持数字
  362. if (Z.AR.contains(Z.EL.PX, name)){
  363. value = (Z.T.isNumber(value) || Z.V.isInteger(value) || Z.V.isFloat(value))?value+"px":value;
  364. }
  365. elem.style[name] = value;
  366. }
  367. },
  368. cssNum: function(elem, name)
  369. {
  370. return Z.S.prefixNum(this.css(elem, name));
  371. },
  372. opacity: function(elem, value)
  373. {
  374. if (!this.has(elem, "style"))
  375. return;
  376. if (value === Z.u)
  377. {
  378. if ("opacity" in elem.style){
  379. return elem.style.opacity?parseFloat(elem.style.opacity):0;
  380. }else{
  381. var filter = elem.style["filter"];
  382. var opMatch = (!filter)?null:filter.match(/opacity=([\d.]*)[\)\,\s]/i);
  383. if (!opMatch || opMatch.length < 2)
  384. return 0;
  385. return opMatch[1] / 100;
  386. }
  387. }
  388. else if (Z.T.isNumber(value) || Z.V.isFloat(value))
  389. {//数字或者数字型字符串
  390. value = +value;
  391. if ("opacity" in elem.style){
  392. elem.style.opacity = value;
  393. }else{
  394. elem.style["filter"] = "alpha(opacity=" + value*100 + ")";
  395. }
  396. }
  397. },
  398. className: function(elem, className)
  399. {
  400. if (!this.has(elem, "className"))
  401. return null;
  402. if (className === Z.u){//未传参数
  403. return elem.className;
  404. }
  405. elem.className = className;
  406. },
  407. addClass: function(elem, className)
  408. {
  409. if (!this.has(elem, "className"))
  410. return;
  411. var classArr = Z.AR.toArray(elem.className, Z.R.SPACE);
  412. if (Z.AR.contains(classArr, className))
  413. return;
  414. classArr.push(className);
  415. elem.className = Z.AR.toString(classArr, " ");
  416. },
  417. removeClass: function(elem, className)
  418. {
  419. if (!this.has(elem, "className"))
  420. return;
  421. var classArrRemove = Z.AR.toArray(className, Z.R.SPACE);
  422. var classNameElem = elem.className;
  423. classArrRemove.map(function(clName)
  424. {
  425. clName = clName.trim();
  426. if (classNameElem.indexOf(clName) === -1)
  427. return;
  428. classNameElem = classNameElem.replace(clName, "").replace(/\s\s/g, " ");
  429. });
  430. elem.className = classNameElem.trim();
  431. },
  432. hasClass: function(elem, className)
  433. {
  434. if (!this.has(elem, "className"))
  435. return false;
  436. var classArr = Z.AR.toArray(elem.className, Z.R.SPACE);
  437. return Z.AR.contains(classArr, className);
  438. },
  439. toggleClass: function(elem, className)
  440. {
  441. this.hasClass(elem, className)?this.removeClass(elem, className):this.addClass(elem, className);
  442. },
  443. select: function(elem)
  444. {
  445. if (!elem || !elem.nodeType)
  446. return;
  447. elem.select();
  448. },
  449. selection: function(elem)
  450. {
  451. if (!this.has(elem, "value"))
  452. return "";
  453. var value = this.get(elem, "value");
  454. if (Z.V.isEmpty(value))
  455. return "";
  456. if (!("selectionStart" in elem))
  457. return "";
  458. var start = elem.selectionStart;
  459. var end = elem.selectionEnd;
  460. return value.substring(start, end);
  461. },
  462. isSelection: function(elem)
  463. {
  464. return Z.V.isNotEmpty(this.selection(elem));
  465. },
  466. focus: function(elem)
  467. {
  468. if (!elem || !elem.nodeType)
  469. return;
  470. elem.focus();
  471. },
  472. focusEnd: function(elem, len)
  473. {//元素焦点捕捉
  474. if (!elem || !elem.nodeType)
  475. return;
  476. len = len || 0;
  477. if (Z.B.msieOnly)
  478. {
  479. var range = elem.createTextRange();
  480. (len == 0)?range.collapse(false):range.move("character", len);
  481. range.select();
  482. }
  483. else
  484. {
  485. len = (len == 0)?elem.value.length:len;
  486. elem.setSelectionRange(len, len);
  487. elem.focus();
  488. }
  489. },
  490. parent: function(elem)
  491. {//元素父元素
  492. if (!elem || !elem.nodeType)
  493. return null;
  494. var parent = elem.parentNode;
  495. return parent && parent.nodeType !== 11 ? parent : null;
  496. },
  497. parentIndex: function(elem)
  498. {//元素子节点在父元素的索引
  499. var ind = 0;
  500. while(elem = elem.previousSibling){
  501. if (elem.nodeType == 1)
  502. ind++;
  503. }
  504. return ind;
  505. },
  506. childs: function(elem)
  507. {//元素子节点
  508. if (!elem || !elem.nodeType)
  509. return null;
  510. return elem.childNodes;
  511. },
  512. children: function(elem)
  513. {//元素子元素
  514. if (!elem || !elem.nodeType)
  515. return null;
  516. return elem.children;
  517. },
  518. html: function(elem, value)
  519. {//设置元素HTML代码或获取HTML代码
  520. if (!elem || !elem.nodeType)
  521. return;
  522. if (value === Z.u)
  523. return elem.innerHTML;
  524. else
  525. elem.innerHTML = value;
  526. },
  527. htmls: function(elem, value)
  528. {//替换元素或获取outerHTML代码
  529. if (!elem || !elem.nodeType)
  530. return;
  531. if (value === Z.u)
  532. return elem.outerHTML;
  533. else
  534. elem.outerHTML = value;
  535. },
  536. htmlc: function(elem, value)
  537. {//设置元素HTML代码或获取HTML代码
  538. if (!elem || !elem.nodeType)
  539. return;
  540. if (value === Z.u)
  541. return elem.innerHTML;
  542. elem.innerHTML = value;
  543. //1.八项指定内容加载,其中四项是相对定位
  544. if (Z.Input && Z.Input.load)
  545. {//输入框验证
  546. Z.Input.load(elem);
  547. }
  548. if (Z.ButtonGroup && Z.ButtonGroup.load)
  549. {//按钮组
  550. Z.ButtonGroup.load(elem);
  551. }
  552. if (Z.Checkbox && Z.Checkbox.load)
  553. {//多选按钮
  554. Z.Checkbox.load(elem);
  555. }
  556. if (Z.Radio && Z.Radio.load)
  557. {//单选按钮
  558. Z.Radio.load(elem);
  559. }
  560. if (Z.Select && Z.Select.load)
  561. {//选择框
  562. Z.Select.load(elem);
  563. }
  564. if (Z.Dropdown && Z.Dropdown.load)
  565. {//下拉列表
  566. Z.Dropdown.load(elem);
  567. }
  568. if (Z.Textarea && Z.Textarea.load)
  569. {//选择框
  570. Z.Textarea.load(elem);
  571. }
  572. if (Z.CallFrame && Z.CallFrame.load)
  573. {//表单iframe调用
  574. Z.CallFrame.load();
  575. }
  576. //2.两项全局更新的,AJAX内容会影响外部布局
  577. if (Z.Tooltip && Z.Tooltip.load)
  578. {//提示框
  579. Z.Tooltip.load();
  580. }
  581. if (Z.Clipboard && Z.Clipboard.onload)
  582. {//复制按钮
  583. Z.Clipboard.onload();
  584. }
  585. //3.判断是否有<script></script>要求处理
  586. var $allScript = elem.querySelectorAll('script');
  587. for (var i=0;i<$allScript.length;i++)
  588. {
  589. // 获取 js 代码
  590. var $script = $allScript[i];
  591. var jsString = $script.innerHTML;
  592. var jsSrc = $script.getAttribute('src');
  593. // 判断是引入还是书写
  594. if (Z.V.isEmptyBlank(jsString) && (jsSrc === null || Z.V.isEmptyBlank(jsString)))
  595. continue;
  596. // 定义新 script 节点
  597. var $newScript = document.createElement('script');
  598. // 赋值 script 的属性值
  599. var attrs = $script.attributes;
  600. for (var j=0;j<attrs.length;j++) {
  601. $newScript[attrs[j].name] = attrs[j].value;
  602. }
  603. $newScript.innerHTML = jsString;
  604. $script.insertAdjacentElement('afterend', $newScript);
  605. // 删除原有 script 节点
  606. $script.parentNode.removeChild($script);
  607. }
  608. },
  609. text: function(elem, value)
  610. {//设置元素文本或获取文件
  611. if (!elem || !elem.nodeType)
  612. return;
  613. if (value === Z.u)
  614. {
  615. if (this.has(elem, "innerText"))
  616. return elem.innerText;
  617. else
  618. return elem.textContent;
  619. }
  620. else
  621. {
  622. if (this.has(elem, "innerText"))
  623. elem.innerText = value;
  624. else
  625. elem.textContent = value;
  626. }
  627. },
  628. append: function(elem, child)
  629. {
  630. if (!elem || !elem.nodeType)
  631. return;
  632. if (Z.T.isElement(child))
  633. return elem.appendChild(child);
  634. else if (Z.T.isString(child))
  635. elem.insertAdjacentHTML("beforeend", child);
  636. },
  637. prepend: function(elem, child)
  638. {
  639. if (!elem || !elem.nodeType || elem.nodeType != 1)
  640. return;
  641. if (Z.T.isElement(child))
  642. return elem.insertBefore(child, elem.firstNode);
  643. else if (Z.T.isString(child))
  644. elem.insertAdjacentHTML("afterbegin", child);
  645. },
  646. before: function(elem, newElem)
  647. {
  648. if (!elem || !elem.nodeType || !elem.parentNode)
  649. return;
  650. if (Z.T.isElement(newElem))
  651. elem.parentNode.insertBefore(newElem, elem);
  652. else if (Z.T.isString(newElem))
  653. elem.insertAdjacentHTML("beforebegin", newElem);
  654. },
  655. after: function(elem, newElem)
  656. {
  657. if (!elem || !elem.nodeType || !elem.parentNode)
  658. return;
  659. if (Z.T.isElement(newElem))
  660. elem.parentNode.insertBefore(newElem, elem.nextSibling);
  661. else if (Z.T.isString(newElem))
  662. elem.insertAdjacentHTML("afterend", newElem);
  663. },
  664. replace: function(elem, newElem)
  665. {
  666. if (!elem || !elem.nodeType || !elem.parentNode)
  667. return;
  668. elem.parentNode.replaceChild(newElem, elem);
  669. },
  670. remove: function(elem, name)
  671. {
  672. if (!elem || !elem.nodeType)
  673. return;
  674. if (!name)
  675. {//删除节点
  676. var parentNode = elem.parentNode;
  677. if (parentNode != null)
  678. parentNode.removeChild(elem);
  679. }
  680. else
  681. {//删除属性
  682. if (elem.hasAttribute(name))
  683. elem.removeAttribute(name);
  684. else
  685. elem[name] = "";
  686. }
  687. },
  688. offsetLeft: function(elem)
  689. {
  690. return (!Z.B.firefox)?elem.offsetLeft:this.offsetFirefox(elem, "offsetLeft", "borderLeftWidth");
  691. },
  692. offsetTop: function(elem)
  693. {
  694. return (!Z.B.firefox)?elem.offsetTop:this.offsetFirefox(elem, "offsetTop", "borderTopWidth");
  695. },
  696. offsetLeftBody: function(elem)
  697. {
  698. if (Z.B.webkit)
  699. return this.offsetBodyWebkit(elem, "offsetLeft", "borderLeftWidth");
  700. else if (Z.B.msieVer <= 8)
  701. return this.offsetBodyIE(elem, "offsetLeft", "borderLeftWidth");
  702. else
  703. return this.offsetBodyFirefox(elem, "offsetLeft");
  704. },
  705. offsetTopBody: function(elem)
  706. {
  707. if (Z.B.webkit)
  708. return this.offsetBodyWebkit(elem, "offsetTop", "borderTopWidth");
  709. else if (Z.B.msieVer <= 8)
  710. return this.offsetBodyIE(elem, "offsetTop", "borderTopWidth");
  711. else
  712. return this.offsetBodyFirefox(elem, "offsetTop");
  713. }
  714. };
  715. /**************************************************/
  716. //定义元素私有方法
  717. /**************************************************/
  718. Z.EL.siblingByTd = function(td, type)
  719. {
  720. if ("offsetLeft" == type)
  721. {//找左边TD
  722. var sibling = td.previousSibling;
  723. if (sibling instanceof Text)
  724. sibling = td.previousSibling.previousSibling;
  725. return sibling;
  726. }
  727. else
  728. {//找上边TD
  729. var ind = this.parentIndex(td);
  730. var parentElem = td.parentNode;
  731. var sibling = parentElem.previousSibling;
  732. if (sibling instanceof Text)
  733. sibling = parentElem.previousSibling.previousSibling;
  734. if (sibling)
  735. return sibling.childNodes[ind];
  736. return sibling;
  737. }
  738. };
  739. Z.EL.offsetFirefox = function(elem, type, border)
  740. {
  741. var td = elem.offsetParent;
  742. if (!(td instanceof HTMLTableCellElement) || this.css(td, "borderCollapse") === "separate")
  743. {//不是表格单元格或表格边框是分隔的,直接减去边框
  744. return elem[type] - this.cssNum(td, border);
  745. }
  746. //表格单元格边框是合并的情况,取自己边框或相邻边框或表格边框最大值
  747. var tdBorderWidth = this.cssNum(td, border);
  748. var tbBorderWidth = this.cssNum(td.offsetParent, border);
  749. var cssName = ("offsetLeft" == type)?"borderRightWidth":"borderBottomWidth";
  750. var sibling = this.siblingByTd(td, type);
  751. var sbBorderWidth = sibling?this.cssNum(sibling, cssName):tbBorderWidth;
  752. return elem[type] - Math.max(tdBorderWidth, sbBorderWidth);
  753. };
  754. Z.EL.offsetBodyFirefox = function(elem, type, border)
  755. {//火狐最简单
  756. var value = elem[type];
  757. while(elem.offsetParent && elem.offsetParent.tagName != "BODY" && elem.offsetParent.tagName != "HTML")
  758. {
  759. elem = elem.offsetParent;
  760. value += elem[type];
  761. if (border){
  762. value += Z.S.prefixNum(this.css(elem, border));
  763. }
  764. }
  765. if (Z.EL.css(elem,"position") == "fixed")
  766. {//定位为fixed的情况
  767. if (type == "offsetLeft"){
  768. value += Z.body().scrollLeft + document.documentElement.scrollLeft;
  769. } else if (type == "offsetTop"){
  770. value += Z.body().scrollTop + document.documentElement.scrollTop;
  771. }
  772. }
  773. return value;
  774. };
  775. Z.EL.offsetBodyIE = function(elem, type, border)
  776. {//IE较复杂:1.标记有定位的需要增加边框
  777. if (!(elem.offsetParent instanceof HTMLTableCellElement))
  778. {//不在表格中
  779. return this.offsetBodyFirefox(elem, type, border);
  780. }
  781. var cssName = ("offsetLeft" == type)?"borderRightWidth":"borderBottomWidth";
  782. var value = elem[type];
  783. var elem = elem.offsetParent;
  784. while(elem)
  785. {
  786. value += elem[type];
  787. if (!(elem instanceof HTMLTableCellElement))
  788. {//不是单元格直接增加边框
  789. value += Z.S.prefixNum(this.css(elem, border));
  790. elem = elem.offsetParent;
  791. continue;
  792. }
  793. //表格单元格
  794. var borderCollapse = this.css(elem.offsetParent, "borderCollapse");
  795. var tdBorderWidth = this.cssNum(elem, border);
  796. if (borderCollapse == "separate")
  797. {//单元格边框不合并,只计算自己的边框即可
  798. value += tdBorderWidth;
  799. }
  800. else
  801. {//单元格边框是合并的,需要检查对面的边框,取边框和对面边框最大值的1/2。如果靠最左最上则为本身边框和表格边框最大值的1/2
  802. var tbBorderWidth = this.cssNum(elem.offsetParent, border);
  803. var sibling = this.siblingByTd(elem, type);
  804. var sbBorderWidth = sibling?this.cssNum(sibling, cssName):tbBorderWidth;
  805. value += Math.max(tdBorderWidth, sbBorderWidth) / 2;
  806. }
  807. value += elem.offsetParent[type];
  808. elem = elem.offsetParent.offsetParent;
  809. }
  810. return value;
  811. };
  812. Z.EL.offsetBodyWebkit = function(elem, type, border)
  813. {//webkit
  814. if (!(elem.offsetParent instanceof HTMLTableCellElement))
  815. {//不在表格中
  816. return this.offsetBodyFirefox(elem, type, border);
  817. }
  818. var cssName = ("offsetLeft" == type)?"borderRightWidth":"borderBottomWidth";
  819. var value = elem[type];
  820. var elem = elem.offsetParent;
  821. while(elem)
  822. {
  823. value += elem[type];
  824. if (!(elem instanceof HTMLTableCellElement))
  825. {//不是单元格直接增加边框
  826. value += this.cssNum(elem, border);
  827. elem = elem.offsetParent;
  828. continue;
  829. }
  830. //表格单元格
  831. var borderCollapse = this.css(elem.offsetParent, "borderCollapse");
  832. var tdBorderWidth = this.cssNum(elem, border);
  833. var tbBorderWidth = this.cssNum(elem.offsetParent, border);
  834. if (borderCollapse == "separate")
  835. {//单元格边框不合并,只计算自己的边框和表格边框即可
  836. value += tdBorderWidth;
  837. value += tbBorderWidth;
  838. }
  839. else
  840. {//单元格边框是合并的,需要检查对面的边框,取最大值的边框的1/2+表格边框的1/2。如果靠最左最上则为本身边框和表格边框的最大值
  841. var sibling = this.siblingByTd(elem, type);
  842. if (sibling){
  843. var sbBorderWidth = this.cssNum(sibling, cssName);
  844. value += Math.max(sbBorderWidth, tdBorderWidth) / 2;
  845. value += tbBorderWidth / 2;
  846. }else{
  847. value += Math.max(tdBorderWidth, tbBorderWidth);
  848. }
  849. }
  850. value += elem.offsetParent[type];
  851. elem = elem.offsetParent.offsetParent;
  852. }
  853. return value;
  854. };
  855. /*****************************************************************/
  856. //定义HTML标签封装,1.通过HTML文本创建元素列表,2.查标签缺省display值
  857. /*****************************************************************/
  858. Z.H = Z.Html =
  859. {
  860. wrapMap:
  861. {
  862. option: [1, "<select multiple='multiple'>", "</select>"],
  863. optgroup: [1, "<select multiple='multiple'>", "</select>"],
  864. legend: [1, "<fieldset>", "</fieldset>"],
  865. thead: [1, "<table>", "</table>"],
  866. tbody: [1, "<table>", "</table>"],
  867. tfoot: [1, "<table>", "</table>"],
  868. colgroup: [1, "<table>", "</table>"],
  869. caption: [1, "<table>", "</table>"],
  870. tr: [2, "<table><tbody>", "</tbody></table>"],
  871. td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
  872. th: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
  873. col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
  874. area: [1, "<map>", "</map>" ],
  875. _default: [0, "", ""]
  876. },
  877. createElement: function(html)
  878. {//创建HTML节点,返回一个类数组,可能是数组或NodeList或HTMLCollection
  879. if (!html)
  880. {//1.参数无效返回空数组
  881. return [];
  882. }
  883. if (html.nodeType)
  884. {//2.本身是节点返回数组只包括本身
  885. return [html];
  886. }
  887. if (Z.T.isNumber(html))
  888. {//3.如果是数字转为字符串
  889. html += "";
  890. }
  891. if (!Z.T.isString(html))
  892. {//4.不是字符串不支持,返回空数组
  893. return [];
  894. }
  895. if (!Z.R.HTML.test(html))
  896. {//5.判断是否是HTML,如果不是则创建文本节点,返回数组包括本身
  897. return [document.createTextNode(html)];
  898. }
  899. //6.适配标签成XHTML样式,对如<br>, <input>等无结尾的</br>进行适配
  900. html = html.replace(Z.R.HTML_XHTML_TAG, "<$1></$2>");
  901. //7.读取标签,并根据标签查询标签需要的特殊封装层次,这一步很重要,如<tr>需要在<table><tbody>中,其他的在<div>中即可
  902. var tag = (Z.R.HTML_TAG_NAME.exec(html) || ["", ""])[1].toLowerCase(),
  903. wrap = Z.H.wrapMap[tag] || Z.H.wrapMap._default,
  904. depth = wrap[0],
  905. div = document.createElement("div");
  906. //8.把HTML加到定义的div节点上,再根据封装层次取出节点
  907. div.innerHTML = wrap[1] + html + wrap[2];
  908. while (depth--){
  909. div = div.lastChild;
  910. }
  911. return div.childNodes;
  912. },
  913. displayCache: {},
  914. displayDefault: function(tag)
  915. {//查询标签缺省的display值,查过之后存储到缓存中
  916. if (this.displayCache[tag])
  917. {//1.已有检查的返回
  918. return this.displayCache[tag];
  919. }
  920. //2.增加到body中查找是否能读取display
  921. var body = document.body;
  922. var elem = Z.D.create(tag);
  923. body.appendChild(elem);
  924. var display = Z.EL.css(elem, "display");
  925. body.removeChild(elem);
  926. if (display !== "" && display !== "none")
  927. {
  928. this.displayCache[tag] = display;
  929. return display;
  930. }
  931. //3.新建iframe中读取display
  932. var iframe = Z.D.create("iframe");
  933. iframe.frameBorder = iframe.width = iframe.height = 0;
  934. body.appendChild(iframe);
  935. var iframeDoc = (iframe.contentWindow || iframe.contentDocument ).document;
  936. iframeDoc.write((document.compatMode === "CSS1Compat"?"<!doctype html>":"") + "<html><body>");
  937. iframeDoc.close();
  938. elem = iframeDoc.createElement(tag);
  939. iframeDoc.body.appendChild(elem);
  940. display = this.css(elem, "display");
  941. body.removeChild(iframe);
  942. this.displayCache[tag] = display;
  943. return display;
  944. }
  945. };
  946. /**************************************************/
  947. //定义地址的增删等操作
  948. /**************************************************/
  949. Z.L = Z.Location =
  950. {
  951. protocol: location.href.match(/^https/i)?"https":"http",
  952. reload: function(target)
  953. {//刷新
  954. target = target || window;
  955. target.location.reload();
  956. },
  957. access: function(url, target)
  958. {//访问
  959. Z.A.assertNotEmptyBlank(url, "Z.Location的所有函数url不能为空");
  960. target = target || window;
  961. if (target === "open")
  962. {
  963. var $form = Z("<form></form>").appendTo("body");
  964. $form.attr({"action": url, "method": "post", "target": "blank"})[0].submit();
  965. $form.remove();
  966. }
  967. else if (target.name && target.name == "zCallFrame")
  968. {//Frame调用
  969. url += ((url.indexOf("?")==-1)?"?":"&") + "zCallFrame=true";
  970. target.location.href = url;
  971. }
  972. else
  973. target.location.href = url;
  974. },
  975. check: function(url, name, form, target)
  976. {//检查
  977. Z.A.assertNotEmptyBlank(url, "Z.Location的所有函数url不能为空");
  978. if (form)
  979. {//第三个参数,可选form/target
  980. if (!(form instanceof HTMLFormElement) && target == null)
  981. {
  982. target = form;
  983. form = null;
  984. }
  985. }
  986. var value = Z.FM.getChecked(name, form);
  987. if (!value)
  988. return;
  989. url += (url.indexOf("?")==-1)?"?":"&";
  990. url += name+"="+encodeURIComponent(value);
  991. Z.L.access(url, target);
  992. },
  993. confirm: function(url, message, name, form, target)
  994. {//确认
  995. Z.A.assertNotEmptyBlank(url, "Z.Location的所有函数url不能为空");
  996. if (form)
  997. {//第四个参数,可选form/target
  998. if (!(form instanceof HTMLFormElement) && target == null)
  999. {
  1000. target = form;
  1001. form = null;
  1002. }
  1003. }
  1004. if (name)
  1005. {//有指定选择项,把选项名和值加到URL中
  1006. var value = Z.FM.getChecked(name, form);
  1007. if (!value)
  1008. return;
  1009. url += (url.indexOf("?")==-1)?"?":"&";
  1010. url += name+"="+encodeURIComponent(value);
  1011. }
  1012. Z.confirm(message, function(){
  1013. Z.L.access(url, target);
  1014. });
  1015. },
  1016. href: function(param, param2)
  1017. {//多参数访问
  1018. if (Z.T.isString(param))
  1019. {//简单模式,两个参数和access一样
  1020. Z.L.access(param, param2);
  1021. }
  1022. else if (Z.T.isPlainObject(param))
  1023. {//对象模式,支持多参数
  1024. var url = param.url || null;
  1025. var message = param.message || null;
  1026. var name = param.name || null;
  1027. var form = param.form || null;
  1028. var target = param2 || param.target || null;
  1029. if (name == null)
  1030. Z.L.access(url, target);
  1031. else if (message == null)
  1032. Z.L.check(url, name, form, target);
  1033. else
  1034. Z.L.confirm(url, message, name, form, target);
  1035. }
  1036. else
  1037. {//仅支持字符串和线对象两种方式
  1038. Z.alert("Z.L.href函数第一个参数必须是字符串或纯对象");
  1039. }
  1040. }
  1041. };
  1042. /**************************************************/
  1043. //定义Cookie相关方法
  1044. /**************************************************/
  1045. Z.CK = Z.Cookie =
  1046. {
  1047. all: function()
  1048. {
  1049. return document.cookie;
  1050. },
  1051. add: function(name, value, expires, path, domain, secure)
  1052. {
  1053. if (!cookie || !cookie.name || Z.V.isEmptyBlank(cookie.name))
  1054. return;
  1055. var name = escape(Z.S.trim(cookie.name));
  1056. var value = escape(cookie.value || "");
  1057. var ck = name + "=" + value;
  1058. if (Z.T.isNumber(cookie.expires) || Z.V.isInteger(cookie.expires))
  1059. {
  1060. var date = new Date();
  1061. date.setTime(date.getTime() + (+cookie.expires * 1000));
  1062. ck += ";expires=" + date.toGMTString();
  1063. }
  1064. ck += (cookie.path)?";path=" + cookie.path:"";
  1065. ck += (cookie.domain)?";domain=" + cookie.domain:"";
  1066. ck += (cookie.secure===true)?";secure":"";
  1067. document.cookie = ck;
  1068. },
  1069. remove: function(name)
  1070. {
  1071. var date = new Date();
  1072. date.setTime(date.getTime() - 10 * 1000);
  1073. document.cookie = name+"=value;expires=" + date.toGMTString();
  1074. },
  1075. get: function(name)
  1076. {
  1077. if (Z.V.isEmptyBlank(name))
  1078. return "";
  1079. name = escape(Z.S.trim(name));
  1080. var cookies = Z.AR.toArray(document.cookie, ";");
  1081. for(var i=0;i<cookies.length;i++)
  1082. {
  1083. var cookie = Z.AR.toArray(cookies, "=");
  1084. if(cookie[0] == name)
  1085. return unescape(cookie[1]);
  1086. }
  1087. return "";
  1088. }
  1089. };
  1090. //END
  1091. })(zhiqim);