parse.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. (function() {
  2. UE = window.UE || {};
  3. var isIE = !!window.ActiveXObject;
  4. //定义utils工具
  5. var utils = {
  6. removeLastbs: function(url) {
  7. return url.replace(/\/$/, "");
  8. },
  9. extend: function(t, s) {
  10. var a = arguments,
  11. notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false,
  12. len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length;
  13. for (var i = 1; i < len; i++) {
  14. var x = a[i];
  15. for (var k in x) {
  16. if (!notCover || !t.hasOwnProperty(k)) {
  17. t[k] = x[k];
  18. }
  19. }
  20. }
  21. return t;
  22. },
  23. isIE: isIE,
  24. cssRule: isIE
  25. ? function(key, style, doc) {
  26. var indexList, index;
  27. doc = doc || document;
  28. if (doc.indexList) {
  29. indexList = doc.indexList;
  30. } else {
  31. indexList = doc.indexList = {};
  32. }
  33. var sheetStyle;
  34. if (!indexList[key]) {
  35. if (style === undefined) {
  36. return "";
  37. }
  38. sheetStyle = doc.createStyleSheet(
  39. "",
  40. (index = doc.styleSheets.length)
  41. );
  42. indexList[key] = index;
  43. } else {
  44. sheetStyle = doc.styleSheets[indexList[key]];
  45. }
  46. if (style === undefined) {
  47. return sheetStyle.cssText;
  48. }
  49. sheetStyle.cssText = sheetStyle.cssText + "\n" + (style || "");
  50. }
  51. : function(key, style, doc) {
  52. doc = doc || document;
  53. var head = doc.getElementsByTagName("head")[0],
  54. node;
  55. if (!(node = doc.getElementById(key))) {
  56. if (style === undefined) {
  57. return "";
  58. }
  59. node = doc.createElement("style");
  60. node.id = key;
  61. head.appendChild(node);
  62. }
  63. if (style === undefined) {
  64. return node.innerHTML;
  65. }
  66. if (style !== "") {
  67. node.innerHTML = node.innerHTML + "\n" + style;
  68. } else {
  69. head.removeChild(node);
  70. }
  71. },
  72. domReady: function(onready) {
  73. var doc = window.document;
  74. if (doc.readyState === "complete") {
  75. onready();
  76. } else {
  77. if (isIE) {
  78. (function() {
  79. if (doc.isReady) return;
  80. try {
  81. doc.documentElement.doScroll("left");
  82. } catch (error) {
  83. setTimeout(arguments.callee, 0);
  84. return;
  85. }
  86. onready();
  87. })();
  88. window.attachEvent("onload", function() {
  89. onready();
  90. });
  91. } else {
  92. doc.addEventListener(
  93. "DOMContentLoaded",
  94. function() {
  95. doc.removeEventListener(
  96. "DOMContentLoaded",
  97. arguments.callee,
  98. false
  99. );
  100. onready();
  101. },
  102. false
  103. );
  104. window.addEventListener(
  105. "load",
  106. function() {
  107. onready();
  108. },
  109. false
  110. );
  111. }
  112. }
  113. },
  114. each: function(obj, iterator, context) {
  115. if (obj == null) return;
  116. if (obj.length === +obj.length) {
  117. for (var i = 0, l = obj.length; i < l; i++) {
  118. if (iterator.call(context, obj[i], i, obj) === false) return false;
  119. }
  120. } else {
  121. for (var key in obj) {
  122. if (obj.hasOwnProperty(key)) {
  123. if (iterator.call(context, obj[key], key, obj) === false)
  124. return false;
  125. }
  126. }
  127. }
  128. },
  129. inArray: function(arr, item) {
  130. var index = -1;
  131. this.each(arr, function(v, i) {
  132. if (v === item) {
  133. index = i;
  134. return false;
  135. }
  136. });
  137. return index;
  138. },
  139. pushItem: function(arr, item) {
  140. if (this.inArray(arr, item) == -1) {
  141. arr.push(item);
  142. }
  143. },
  144. trim: function(str) {
  145. return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, "");
  146. },
  147. indexOf: function(array, item, start) {
  148. var index = -1;
  149. start = this.isNumber(start) ? start : 0;
  150. this.each(array, function(v, i) {
  151. if (i >= start && v === item) {
  152. index = i;
  153. return false;
  154. }
  155. });
  156. return index;
  157. },
  158. hasClass: function(element, className) {
  159. className = className
  160. .replace(/(^[ ]+)|([ ]+$)/g, "")
  161. .replace(/[ ]{2,}/g, " ")
  162. .split(" ");
  163. for (var i = 0, ci, cls = element.className; (ci = className[i++]); ) {
  164. if (!new RegExp("\\b" + ci + "\\b", "i").test(cls)) {
  165. return false;
  166. }
  167. }
  168. return i - 1 == className.length;
  169. },
  170. addClass: function(elm, classNames) {
  171. if (!elm) return;
  172. classNames = this.trim(classNames).replace(/[ ]{2,}/g, " ").split(" ");
  173. for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) {
  174. if (!new RegExp("\\b" + ci + "\\b").test(cls)) {
  175. cls += " " + ci;
  176. }
  177. }
  178. elm.className = utils.trim(cls);
  179. },
  180. removeClass: function(elm, classNames) {
  181. classNames = this.isArray(classNames)
  182. ? classNames
  183. : this.trim(classNames).replace(/[ ]{2,}/g, " ").split(" ");
  184. for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) {
  185. cls = cls.replace(new RegExp("\\b" + ci + "\\b"), "");
  186. }
  187. cls = this.trim(cls).replace(/[ ]{2,}/g, " ");
  188. elm.className = cls;
  189. !cls && elm.removeAttribute("className");
  190. },
  191. on: function(element, type, handler) {
  192. var types = this.isArray(type) ? type : type.split(/\s+/),
  193. k = types.length;
  194. if (k)
  195. while (k--) {
  196. type = types[k];
  197. if (element.addEventListener) {
  198. element.addEventListener(type, handler, false);
  199. } else {
  200. if (!handler._d) {
  201. handler._d = {
  202. els: []
  203. };
  204. }
  205. var key = type + handler.toString(),
  206. index = utils.indexOf(handler._d.els, element);
  207. if (!handler._d[key] || index == -1) {
  208. if (index == -1) {
  209. handler._d.els.push(element);
  210. }
  211. if (!handler._d[key]) {
  212. handler._d[key] = function(evt) {
  213. return handler.call(evt.srcElement, evt || window.event);
  214. };
  215. }
  216. element.attachEvent("on" + type, handler._d[key]);
  217. }
  218. }
  219. }
  220. element = null;
  221. },
  222. off: function(element, type, handler) {
  223. var types = this.isArray(type) ? type : type.split(/\s+/),
  224. k = types.length;
  225. if (k)
  226. while (k--) {
  227. type = types[k];
  228. if (element.removeEventListener) {
  229. element.removeEventListener(type, handler, false);
  230. } else {
  231. var key = type + handler.toString();
  232. try {
  233. element.detachEvent(
  234. "on" + type,
  235. handler._d ? handler._d[key] : handler
  236. );
  237. } catch (e) {}
  238. if (handler._d && handler._d[key]) {
  239. var index = utils.indexOf(handler._d.els, element);
  240. if (index != -1) {
  241. handler._d.els.splice(index, 1);
  242. }
  243. handler._d.els.length == 0 && delete handler._d[key];
  244. }
  245. }
  246. }
  247. },
  248. loadFile: (function() {
  249. var tmpList = [];
  250. function getItem(doc, obj) {
  251. try {
  252. for (var i = 0, ci; (ci = tmpList[i++]); ) {
  253. if (ci.doc === doc && ci.url == (obj.src || obj.href)) {
  254. return ci;
  255. }
  256. }
  257. } catch (e) {
  258. return null;
  259. }
  260. }
  261. return function(doc, obj, fn) {
  262. var item = getItem(doc, obj);
  263. if (item) {
  264. if (item.ready) {
  265. fn && fn();
  266. } else {
  267. item.funs.push(fn);
  268. }
  269. return;
  270. }
  271. tmpList.push({
  272. doc: doc,
  273. url: obj.src || obj.href,
  274. funs: [fn]
  275. });
  276. if (!doc.body) {
  277. var html = [];
  278. for (var p in obj) {
  279. if (p == "tag") continue;
  280. html.push(p + '="' + obj[p] + '"');
  281. }
  282. doc.write(
  283. "<" + obj.tag + " " + html.join(" ") + " ></" + obj.tag + ">"
  284. );
  285. return;
  286. }
  287. if (obj.id && doc.getElementById(obj.id)) {
  288. return;
  289. }
  290. var element = doc.createElement(obj.tag);
  291. delete obj.tag;
  292. for (var p in obj) {
  293. element.setAttribute(p, obj[p]);
  294. }
  295. element.onload = element.onreadystatechange = function() {
  296. if (!this.readyState || /loaded|complete/.test(this.readyState)) {
  297. item = getItem(doc, obj);
  298. if (item.funs.length > 0) {
  299. item.ready = 1;
  300. for (var fi; (fi = item.funs.pop()); ) {
  301. fi();
  302. }
  303. }
  304. element.onload = element.onreadystatechange = null;
  305. }
  306. };
  307. element.onerror = function() {
  308. throw Error(
  309. "The load " + (obj.href || obj.src) + " fails,check the url"
  310. );
  311. };
  312. doc.getElementsByTagName("head")[0].appendChild(element);
  313. };
  314. })()
  315. };
  316. utils.each(
  317. ["String", "Function", "Array", "Number", "RegExp", "Object", "Boolean"],
  318. function(v) {
  319. utils["is" + v] = function(obj) {
  320. return Object.prototype.toString.apply(obj) == "[object " + v + "]";
  321. };
  322. }
  323. );
  324. var parselist = {};
  325. UE.parse = {
  326. register: function(parseName, fn) {
  327. parselist[parseName] = fn;
  328. },
  329. load: function(opt) {
  330. utils.each(parselist, function(v) {
  331. v.call(opt, utils);
  332. });
  333. }
  334. };
  335. uParse = function(selector, opt) {
  336. utils.domReady(function() {
  337. var contents;
  338. if (document.querySelectorAll) {
  339. contents = document.querySelectorAll(selector);
  340. } else {
  341. if (/^#/.test(selector)) {
  342. contents = [document.getElementById(selector.replace(/^#/, ""))];
  343. } else if (/^\./.test(selector)) {
  344. var contents = [];
  345. utils.each(document.getElementsByTagName("*"), function(node) {
  346. if (
  347. node.className &&
  348. new RegExp("\\b" + selector.replace(/^\./, "") + "\\b", "i").test(
  349. node.className
  350. )
  351. ) {
  352. contents.push(node);
  353. }
  354. });
  355. } else {
  356. contents = document.getElementsByTagName(selector);
  357. }
  358. }
  359. utils.each(contents, function(v) {
  360. UE.parse.load(utils.extend({ root: v, selector: selector }, opt));
  361. });
  362. });
  363. };
  364. })();