ContentPane.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:13k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.widget.ContentPane");
  9. dojo.require("dojo.widget.*");
  10. dojo.require("dojo.io.*");
  11. dojo.require("dojo.widget.HtmlWidget");
  12. dojo.require("dojo.string");
  13. dojo.require("dojo.string.extras");
  14. dojo.require("dojo.html.style");
  15. dojo.widget.defineWidget("dojo.widget.ContentPane", dojo.widget.HtmlWidget, function () {
  16. this._styleNodes = [];
  17. this._onLoadStack = [];
  18. this._onUnloadStack = [];
  19. this._callOnUnload = false;
  20. this._ioBindObj;
  21. this.scriptScope;
  22. this.bindArgs = {};
  23. }, {isContainer:true, adjustPaths:true, href:"", extractContent:true, parseContent:true, cacheContent:true, preload:false, refreshOnShow:false, handler:"", executeScripts:false, scriptSeparation:true, loadingMessage:"Loading...", isLoaded:false, postCreate:function (args, frag, parentComp) {
  24. if (this.handler !== "") {
  25. this.setHandler(this.handler);
  26. }
  27. if (this.isShowing() || this.preload) {
  28. this.loadContents();
  29. }
  30. }, show:function () {
  31. if (this.refreshOnShow) {
  32. this.refresh();
  33. } else {
  34. this.loadContents();
  35. }
  36. dojo.widget.ContentPane.superclass.show.call(this);
  37. }, refresh:function () {
  38. this.isLoaded = false;
  39. this.loadContents();
  40. }, loadContents:function () {
  41. if (this.isLoaded) {
  42. return;
  43. }
  44. if (dojo.lang.isFunction(this.handler)) {
  45. this._runHandler();
  46. } else {
  47. if (this.href != "") {
  48. this._downloadExternalContent(this.href, this.cacheContent && !this.refreshOnShow);
  49. }
  50. }
  51. }, setUrl:function (url) {
  52. this.href = url;
  53. this.isLoaded = false;
  54. if (this.preload || this.isShowing()) {
  55. this.loadContents();
  56. }
  57. }, abort:function () {
  58. var bind = this._ioBindObj;
  59. if (!bind || !bind.abort) {
  60. return;
  61. }
  62. bind.abort();
  63. delete this._ioBindObj;
  64. }, _downloadExternalContent:function (url, useCache) {
  65. this.abort();
  66. this._handleDefaults(this.loadingMessage, "onDownloadStart");
  67. var self = this;
  68. this._ioBindObj = dojo.io.bind(this._cacheSetting({url:url, mimetype:"text/html", handler:function (type, data, xhr) {
  69. delete self._ioBindObj;
  70. if (type == "load") {
  71. self.onDownloadEnd.call(self, url, data);
  72. } else {
  73. var e = {responseText:xhr.responseText, status:xhr.status, statusText:xhr.statusText, responseHeaders:xhr.getAllResponseHeaders(), text:"Error loading '" + url + "' (" + xhr.status + " " + xhr.statusText + ")"};
  74. self._handleDefaults.call(self, e, "onDownloadError");
  75. self.onLoad();
  76. }
  77. }}, useCache));
  78. }, _cacheSetting:function (bindObj, useCache) {
  79. for (var x in this.bindArgs) {
  80. if (dojo.lang.isUndefined(bindObj[x])) {
  81. bindObj[x] = this.bindArgs[x];
  82. }
  83. }
  84. if (dojo.lang.isUndefined(bindObj.useCache)) {
  85. bindObj.useCache = useCache;
  86. }
  87. if (dojo.lang.isUndefined(bindObj.preventCache)) {
  88. bindObj.preventCache = !useCache;
  89. }
  90. if (dojo.lang.isUndefined(bindObj.mimetype)) {
  91. bindObj.mimetype = "text/html";
  92. }
  93. return bindObj;
  94. }, onLoad:function (e) {
  95. this._runStack("_onLoadStack");
  96. this.isLoaded = true;
  97. }, onUnLoad:function (e) {
  98. dojo.deprecated(this.widgetType + ".onUnLoad, use .onUnload (lowercased load)", 0.5);
  99. }, onUnload:function (e) {
  100. this._runStack("_onUnloadStack");
  101. delete this.scriptScope;
  102. if (this.onUnLoad !== dojo.widget.ContentPane.prototype.onUnLoad) {
  103. this.onUnLoad.apply(this, arguments);
  104. }
  105. }, _runStack:function (stName) {
  106. var st = this[stName];
  107. var err = "";
  108. var scope = this.scriptScope || window;
  109. for (var i = 0; i < st.length; i++) {
  110. try {
  111. st[i].call(scope);
  112. }
  113. catch (e) {
  114. err += "n" + st[i] + " failed: " + e.description;
  115. }
  116. }
  117. this[stName] = [];
  118. if (err.length) {
  119. var name = (stName == "_onLoadStack") ? "addOnLoad" : "addOnUnLoad";
  120. this._handleDefaults(name + " failuren " + err, "onExecError", "debug");
  121. }
  122. }, addOnLoad:function (obj, func) {
  123. this._pushOnStack(this._onLoadStack, obj, func);
  124. }, addOnUnload:function (obj, func) {
  125. this._pushOnStack(this._onUnloadStack, obj, func);
  126. }, addOnUnLoad:function () {
  127. dojo.deprecated(this.widgetType + ".addOnUnLoad, use addOnUnload instead. (lowercased Load)", 0.5);
  128. this.addOnUnload.apply(this, arguments);
  129. }, _pushOnStack:function (stack, obj, func) {
  130. if (typeof func == "undefined") {
  131. stack.push(obj);
  132. } else {
  133. stack.push(function () {
  134. obj[func]();
  135. });
  136. }
  137. }, destroy:function () {
  138. this.onUnload();
  139. dojo.widget.ContentPane.superclass.destroy.call(this);
  140. }, onExecError:function (e) {
  141. }, onContentError:function (e) {
  142. }, onDownloadError:function (e) {
  143. }, onDownloadStart:function (e) {
  144. }, onDownloadEnd:function (url, data) {
  145. data = this.splitAndFixPaths(data, url);
  146. this.setContent(data);
  147. }, _handleDefaults:function (e, handler, messType) {
  148. if (!handler) {
  149. handler = "onContentError";
  150. }
  151. if (dojo.lang.isString(e)) {
  152. e = {text:e};
  153. }
  154. if (!e.text) {
  155. e.text = e.toString();
  156. }
  157. e.toString = function () {
  158. return this.text;
  159. };
  160. if (typeof e.returnValue != "boolean") {
  161. e.returnValue = true;
  162. }
  163. if (typeof e.preventDefault != "function") {
  164. e.preventDefault = function () {
  165. this.returnValue = false;
  166. };
  167. }
  168. this[handler](e);
  169. if (e.returnValue) {
  170. switch (messType) {
  171.   case true:
  172.   case "alert":
  173. alert(e.toString());
  174. break;
  175.   case "debug":
  176. dojo.debug(e.toString());
  177. break;
  178.   default:
  179. if (this._callOnUnload) {
  180. this.onUnload();
  181. }
  182. this._callOnUnload = false;
  183. if (arguments.callee._loopStop) {
  184. dojo.debug(e.toString());
  185. } else {
  186. arguments.callee._loopStop = true;
  187. this._setContent(e.toString());
  188. }
  189. }
  190. }
  191. arguments.callee._loopStop = false;
  192. }, splitAndFixPaths:function (s, url) {
  193. var titles = [], scripts = [], tmp = [];
  194. var match = [], requires = [], attr = [], styles = [];
  195. var str = "", path = "", fix = "", tagFix = "", tag = "", origPath = "";
  196. if (!url) {
  197. url = "./";
  198. }
  199. if (s) {
  200. var regex = /<title[^>]*>([sS]*?)</title>/i;
  201. while (match = regex.exec(s)) {
  202. titles.push(match[1]);
  203. s = s.substring(0, match.index) + s.substr(match.index + match[0].length);
  204. }
  205. if (this.adjustPaths) {
  206. var regexFindTag = /<[a-z][a-z0-9]*[^>]*s(?:(?:src|href|style)=[^>])+[^>]*>/i;
  207. var regexFindAttr = /s(src|href|style)=(['"]?)([w()[]/.,\'"-:;#=&?s@]+?)2/i;
  208. var regexProtocols = /^(?:[#]|(?:(?:https?|ftps?|file|javascript|mailto|news):))/;
  209. while (tag = regexFindTag.exec(s)) {
  210. str += s.substring(0, tag.index);
  211. s = s.substring((tag.index + tag[0].length), s.length);
  212. tag = tag[0];
  213. tagFix = "";
  214. while (attr = regexFindAttr.exec(tag)) {
  215. path = "";
  216. origPath = attr[3];
  217. switch (attr[1].toLowerCase()) {
  218.   case "src":
  219.   case "href":
  220. if (regexProtocols.exec(origPath)) {
  221. path = origPath;
  222. } else {
  223. path = (new dojo.uri.Uri(url, origPath).toString());
  224. }
  225. break;
  226.   case "style":
  227. path = dojo.html.fixPathsInCssText(origPath, url);
  228. break;
  229.   default:
  230. path = origPath;
  231. }
  232. fix = " " + attr[1] + "=" + attr[2] + path + attr[2];
  233. tagFix += tag.substring(0, attr.index) + fix;
  234. tag = tag.substring((attr.index + attr[0].length), tag.length);
  235. }
  236. str += tagFix + tag;
  237. }
  238. s = str + s;
  239. }
  240. regex = /(?:<(style)[^>]*>([sS]*?)</style>|<link ([^>]*rel=['"]?stylesheet['"]?[^>]*)>)/i;
  241. while (match = regex.exec(s)) {
  242. if (match[1] && match[1].toLowerCase() == "style") {
  243. styles.push(dojo.html.fixPathsInCssText(match[2], url));
  244. } else {
  245. if (attr = match[3].match(/href=(['"]?)([^'">]*)1/i)) {
  246. styles.push({path:attr[2]});
  247. }
  248. }
  249. s = s.substring(0, match.index) + s.substr(match.index + match[0].length);
  250. }
  251. var regex = /<script([^>]*)>([sS]*?)</script>/i;
  252. var regexSrc = /src=(['"]?)([^"']*)1/i;
  253. var regexDojoJs = /.*(bdojob.js(?:.uncompressed.js)?)$/;
  254. var regexInvalid = /(?:var )?bdjConfigb(?:[s]*=[s]*{[^}]+}|.[w]*[s]*=[s]*[^;n]*)?;?|dojo.hostenv.writeIncludes(s*);?/g;
  255. var regexRequires = /dojo.(?:(?:require(?:After)?(?:If)?)|(?:widget.(?:manager.)?registerWidgetPackage)|(?:(?:hostenv.)?setModulePrefix|registerModulePath)|defineNamespace)((['"]).*?1)s*;?/;
  256. while (match = regex.exec(s)) {
  257. if (this.executeScripts && match[1]) {
  258. if (attr = regexSrc.exec(match[1])) {
  259. if (regexDojoJs.exec(attr[2])) {
  260. dojo.debug("Security note! inhibit:" + attr[2] + " from  being loaded again.");
  261. } else {
  262. scripts.push({path:attr[2]});
  263. }
  264. }
  265. }
  266. if (match[2]) {
  267. var sc = match[2].replace(regexInvalid, "");
  268. if (!sc) {
  269. continue;
  270. }
  271. while (tmp = regexRequires.exec(sc)) {
  272. requires.push(tmp[0]);
  273. sc = sc.substring(0, tmp.index) + sc.substr(tmp.index + tmp[0].length);
  274. }
  275. if (this.executeScripts) {
  276. scripts.push(sc);
  277. }
  278. }
  279. s = s.substr(0, match.index) + s.substr(match.index + match[0].length);
  280. }
  281. if (this.extractContent) {
  282. match = s.match(/<body[^>]*>s*([sS]+)s*</body>/im);
  283. if (match) {
  284. s = match[1];
  285. }
  286. }
  287. if (this.executeScripts && this.scriptSeparation) {
  288. var regex = /(<[a-zA-Z][a-zA-Z0-9]*s[^>]*?S=)((['"])[^>]*scriptScope[^>]*>)/;
  289. var regexAttr = /([s'";:(])scriptScope(.*)/;
  290. str = "";
  291. while (tag = regex.exec(s)) {
  292. tmp = ((tag[3] == "'") ? """ : "'");
  293. fix = "";
  294. str += s.substring(0, tag.index) + tag[1];
  295. while (attr = regexAttr.exec(tag[2])) {
  296. tag[2] = tag[2].substring(0, attr.index) + attr[1] + "dojo.widget.byId(" + tmp + this.widgetId + tmp + ").scriptScope" + attr[2];
  297. }
  298. str += tag[2];
  299. s = s.substr(tag.index + tag[0].length);
  300. }
  301. s = str + s;
  302. }
  303. }
  304. return {"xml":s, "styles":styles, "titles":titles, "requires":requires, "scripts":scripts, "url":url};
  305. }, _setContent:function (cont) {
  306. this.destroyChildren();
  307. for (var i = 0; i < this._styleNodes.length; i++) {
  308. if (this._styleNodes[i] && this._styleNodes[i].parentNode) {
  309. this._styleNodes[i].parentNode.removeChild(this._styleNodes[i]);
  310. }
  311. }
  312. this._styleNodes = [];
  313. try {
  314. var node = this.containerNode || this.domNode;
  315. while (node.firstChild) {
  316. dojo.html.destroyNode(node.firstChild);
  317. }
  318. if (typeof cont != "string") {
  319. node.appendChild(cont);
  320. } else {
  321. node.innerHTML = cont;
  322. }
  323. }
  324. catch (e) {
  325. e.text = "Couldn't load content:" + e.description;
  326. this._handleDefaults(e, "onContentError");
  327. }
  328. }, setContent:function (data) {
  329. this.abort();
  330. if (this._callOnUnload) {
  331. this.onUnload();
  332. }
  333. this._callOnUnload = true;
  334. if (!data || dojo.html.isNode(data)) {
  335. this._setContent(data);
  336. this.onResized();
  337. this.onLoad();
  338. } else {
  339. if (typeof data.xml != "string") {
  340. this.href = "";
  341. data = this.splitAndFixPaths(data);
  342. }
  343. this._setContent(data.xml);
  344. for (var i = 0; i < data.styles.length; i++) {
  345. if (data.styles[i].path) {
  346. this._styleNodes.push(dojo.html.insertCssFile(data.styles[i].path, dojo.doc(), false, true));
  347. } else {
  348. this._styleNodes.push(dojo.html.insertCssText(data.styles[i]));
  349. }
  350. }
  351. if (this.parseContent) {
  352. for (var i = 0; i < data.requires.length; i++) {
  353. try {
  354. eval(data.requires[i]);
  355. }
  356. catch (e) {
  357. e.text = "ContentPane: error in package loading calls, " + (e.description || e);
  358. this._handleDefaults(e, "onContentError", "debug");
  359. }
  360. }
  361. }
  362. var _self = this;
  363. function asyncParse() {
  364. if (_self.executeScripts) {
  365. _self._executeScripts(data.scripts);
  366. }
  367. if (_self.parseContent) {
  368. var node = _self.containerNode || _self.domNode;
  369. var parser = new dojo.xml.Parse();
  370. var frag = parser.parseElement(node, null, true);
  371. dojo.widget.getParser().createSubComponents(frag, _self);
  372. }
  373. _self.onResized();
  374. _self.onLoad();
  375. }
  376. if (dojo.hostenv.isXDomain && data.requires.length) {
  377. dojo.addOnLoad(asyncParse);
  378. } else {
  379. asyncParse();
  380. }
  381. }
  382. }, setHandler:function (handler) {
  383. var fcn = dojo.lang.isFunction(handler) ? handler : window[handler];
  384. if (!dojo.lang.isFunction(fcn)) {
  385. this._handleDefaults("Unable to set handler, '" + handler + "' not a function.", "onExecError", true);
  386. return;
  387. }
  388. this.handler = function () {
  389. return fcn.apply(this, arguments);
  390. };
  391. }, _runHandler:function () {
  392. var ret = true;
  393. if (dojo.lang.isFunction(this.handler)) {
  394. this.handler(this, this.domNode);
  395. ret = false;
  396. }
  397. this.onLoad();
  398. return ret;
  399. }, _executeScripts:function (scripts) {
  400. var self = this;
  401. var tmp = "", code = "";
  402. for (var i = 0; i < scripts.length; i++) {
  403. if (scripts[i].path) {
  404. dojo.io.bind(this._cacheSetting({"url":scripts[i].path, "load":function (type, scriptStr) {
  405. dojo.lang.hitch(self, tmp = ";" + scriptStr);
  406. }, "error":function (type, error) {
  407. error.text = type + " downloading remote script";
  408. self._handleDefaults.call(self, error, "onExecError", "debug");
  409. }, "mimetype":"text/plain", "sync":true}, this.cacheContent));
  410. code += tmp;
  411. } else {
  412. code += scripts[i];
  413. }
  414. }
  415. try {
  416. if (this.scriptSeparation) {
  417. delete this.scriptScope;
  418. this.scriptScope = new (new Function("_container_", code + "; return this;"))(self);
  419. } else {
  420. var djg = dojo.global();
  421. if (djg.execScript) {
  422. djg.execScript(code);
  423. } else {
  424. var djd = dojo.doc();
  425. var sc = djd.createElement("script");
  426. sc.appendChild(djd.createTextNode(code));
  427. (this.containerNode || this.domNode).appendChild(sc);
  428. }
  429. }
  430. }
  431. catch (e) {
  432. e.text = "Error running scripts from content:n" + e.description;
  433. this._handleDefaults(e, "onExecError", "debug");
  434. }
  435. }});