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

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.io.ScriptSrcIO");
  9. dojo.require("dojo.io.BrowserIO");
  10. dojo.require("dojo.undo.browser");
  11. dojo.io.ScriptSrcTransport = new function () {
  12. this.preventCache = false;
  13. this.maxUrlLength = 1000;
  14. this.inFlightTimer = null;
  15. this.DsrStatusCodes = {Continue:100, Ok:200, Error:500};
  16. this.startWatchingInFlight = function () {
  17. if (!this.inFlightTimer) {
  18. this.inFlightTimer = setInterval("dojo.io.ScriptSrcTransport.watchInFlight();", 100);
  19. }
  20. };
  21. this.watchInFlight = function () {
  22. var totalCount = 0;
  23. var doneCount = 0;
  24. for (var param in this._state) {
  25. totalCount++;
  26. var currentState = this._state[param];
  27. if (currentState.isDone) {
  28. doneCount++;
  29. delete this._state[param];
  30. } else {
  31. if (!currentState.isFinishing) {
  32. var listener = currentState.kwArgs;
  33. try {
  34. if (currentState.checkString && eval("typeof(" + currentState.checkString + ") != 'undefined'")) {
  35. currentState.isFinishing = true;
  36. this._finish(currentState, "load");
  37. doneCount++;
  38. delete this._state[param];
  39. } else {
  40. if (listener.timeoutSeconds && listener.timeout) {
  41. if (currentState.startTime + (listener.timeoutSeconds * 1000) < (new Date()).getTime()) {
  42. currentState.isFinishing = true;
  43. this._finish(currentState, "timeout");
  44. doneCount++;
  45. delete this._state[param];
  46. }
  47. } else {
  48. if (!listener.timeoutSeconds) {
  49. doneCount++;
  50. }
  51. }
  52. }
  53. }
  54. catch (e) {
  55. currentState.isFinishing = true;
  56. this._finish(currentState, "error", {status:this.DsrStatusCodes.Error, response:e});
  57. }
  58. }
  59. }
  60. }
  61. if (doneCount >= totalCount) {
  62. clearInterval(this.inFlightTimer);
  63. this.inFlightTimer = null;
  64. }
  65. };
  66. this.canHandle = function (kwArgs) {
  67. return dojo.lang.inArray(["text/javascript", "text/json", "application/json"], (kwArgs["mimetype"].toLowerCase())) && (kwArgs["method"].toLowerCase() == "get") && !(kwArgs["formNode"] && dojo.io.formHasFile(kwArgs["formNode"])) && (!kwArgs["sync"] || kwArgs["sync"] == false) && !kwArgs["file"] && !kwArgs["multipart"];
  68. };
  69. this.removeScripts = function () {
  70. var scripts = document.getElementsByTagName("script");
  71. for (var i = 0; scripts && i < scripts.length; i++) {
  72. var scriptTag = scripts[i];
  73. if (scriptTag.className == "ScriptSrcTransport") {
  74. var parent = scriptTag.parentNode;
  75. parent.removeChild(scriptTag);
  76. i--;
  77. }
  78. }
  79. };
  80. this.bind = function (kwArgs) {
  81. var url = kwArgs.url;
  82. var query = "";
  83. if (kwArgs["formNode"]) {
  84. var ta = kwArgs.formNode.getAttribute("action");
  85. if ((ta) && (!kwArgs["url"])) {
  86. url = ta;
  87. }
  88. var tp = kwArgs.formNode.getAttribute("method");
  89. if ((tp) && (!kwArgs["method"])) {
  90. kwArgs.method = tp;
  91. }
  92. query += dojo.io.encodeForm(kwArgs.formNode, kwArgs.encoding, kwArgs["formFilter"]);
  93. }
  94. if (url.indexOf("#") > -1) {
  95. dojo.debug("Warning: dojo.io.bind: stripping hash values from url:", url);
  96. url = url.split("#")[0];
  97. }
  98. var urlParts = url.split("?");
  99. if (urlParts && urlParts.length == 2) {
  100. url = urlParts[0];
  101. query += (query ? "&" : "") + urlParts[1];
  102. }
  103. if (kwArgs["backButton"] || kwArgs["back"] || kwArgs["changeUrl"]) {
  104. dojo.undo.browser.addToHistory(kwArgs);
  105. }
  106. var id = kwArgs["apiId"] ? kwArgs["apiId"] : "id" + this._counter++;
  107. var content = kwArgs["content"];
  108. var jsonpName = kwArgs.jsonParamName;
  109. if (kwArgs.sendTransport || jsonpName) {
  110. if (!content) {
  111. content = {};
  112. }
  113. if (kwArgs.sendTransport) {
  114. content["dojo.transport"] = "scriptsrc";
  115. }
  116. if (jsonpName) {
  117. content[jsonpName] = "dojo.io.ScriptSrcTransport._state." + id + ".jsonpCall";
  118. }
  119. }
  120. if (kwArgs.postContent) {
  121. query = kwArgs.postContent;
  122. } else {
  123. if (content) {
  124. query += ((query) ? "&" : "") + dojo.io.argsFromMap(content, kwArgs.encoding, jsonpName);
  125. }
  126. }
  127. if (kwArgs["apiId"]) {
  128. kwArgs["useRequestId"] = true;
  129. }
  130. var state = {"id":id, "idParam":"_dsrid=" + id, "url":url, "query":query, "kwArgs":kwArgs, "startTime":(new Date()).getTime(), "isFinishing":false};
  131. if (!url) {
  132. this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"url.none"});
  133. return;
  134. }
  135. if (content && content[jsonpName]) {
  136. state.jsonp = content[jsonpName];
  137. state.jsonpCall = function (data) {
  138. if (data["Error"] || data["error"]) {
  139. if (dojo["json"] && dojo["json"]["serialize"]) {
  140. dojo.debug(dojo.json.serialize(data));
  141. }
  142. dojo.io.ScriptSrcTransport._finish(this, "error", data);
  143. } else {
  144. dojo.io.ScriptSrcTransport._finish(this, "load", data);
  145. }
  146. };
  147. }
  148. if (kwArgs["useRequestId"] || kwArgs["checkString"] || state["jsonp"]) {
  149. this._state[id] = state;
  150. }
  151. if (kwArgs["checkString"]) {
  152. state.checkString = kwArgs["checkString"];
  153. }
  154. state.constantParams = (kwArgs["constantParams"] == null ? "" : kwArgs["constantParams"]);
  155. if (kwArgs["preventCache"] || (this.preventCache == true && kwArgs["preventCache"] != false)) {
  156. state.nocacheParam = "dojo.preventCache=" + new Date().valueOf();
  157. } else {
  158. state.nocacheParam = "";
  159. }
  160. var urlLength = state.url.length + state.query.length + state.constantParams.length + state.nocacheParam.length + this._extraPaddingLength;
  161. if (kwArgs["useRequestId"]) {
  162. urlLength += state.idParam.length;
  163. }
  164. if (!kwArgs["checkString"] && kwArgs["useRequestId"] && !state["jsonp"] && !kwArgs["forceSingleRequest"] && urlLength > this.maxUrlLength) {
  165. if (url > this.maxUrlLength) {
  166. this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"url.tooBig"});
  167. return;
  168. } else {
  169. this._multiAttach(state, 1);
  170. }
  171. } else {
  172. var queryParams = [state.constantParams, state.nocacheParam, state.query];
  173. if (kwArgs["useRequestId"] && !state["jsonp"]) {
  174. queryParams.unshift(state.idParam);
  175. }
  176. var finalUrl = this._buildUrl(state.url, queryParams);
  177. state.finalUrl = finalUrl;
  178. this._attach(state.id, finalUrl);
  179. }
  180. this.startWatchingInFlight();
  181. };
  182. this._counter = 1;
  183. this._state = {};
  184. this._extraPaddingLength = 16;
  185. this._buildUrl = function (url, nameValueArray) {
  186. var finalUrl = url;
  187. var joiner = "?";
  188. for (var i = 0; i < nameValueArray.length; i++) {
  189. if (nameValueArray[i]) {
  190. finalUrl += joiner + nameValueArray[i];
  191. joiner = "&";
  192. }
  193. }
  194. return finalUrl;
  195. };
  196. this._attach = function (id, url) {
  197. var element = document.createElement("script");
  198. element.type = "text/javascript";
  199. element.src = url;
  200. element.id = id;
  201. element.className = "ScriptSrcTransport";
  202. document.getElementsByTagName("head")[0].appendChild(element);
  203. };
  204. this._multiAttach = function (state, part) {
  205. if (state.query == null) {
  206. this._finish(state, "error", {status:this.DsrStatusCodes.Error, statusText:"query.null"});
  207. return;
  208. }
  209. if (!state.constantParams) {
  210. state.constantParams = "";
  211. }
  212. var queryMax = this.maxUrlLength - state.idParam.length - state.constantParams.length - state.url.length - state.nocacheParam.length - this._extraPaddingLength;
  213. var isDone = state.query.length < queryMax;
  214. var currentQuery;
  215. if (isDone) {
  216. currentQuery = state.query;
  217. state.query = null;
  218. } else {
  219. var ampEnd = state.query.lastIndexOf("&", queryMax - 1);
  220. var eqEnd = state.query.lastIndexOf("=", queryMax - 1);
  221. if (ampEnd > eqEnd || eqEnd == queryMax - 1) {
  222. currentQuery = state.query.substring(0, ampEnd);
  223. state.query = state.query.substring(ampEnd + 1, state.query.length);
  224. } else {
  225. currentQuery = state.query.substring(0, queryMax);
  226. var queryName = currentQuery.substring((ampEnd == -1 ? 0 : ampEnd + 1), eqEnd);
  227. state.query = queryName + "=" + state.query.substring(queryMax, state.query.length);
  228. }
  229. }
  230. var queryParams = [currentQuery, state.idParam, state.constantParams, state.nocacheParam];
  231. if (!isDone) {
  232. queryParams.push("_part=" + part);
  233. }
  234. var url = this._buildUrl(state.url, queryParams);
  235. this._attach(state.id + "_" + part, url);
  236. };
  237. this._finish = function (state, callback, event) {
  238. if (callback != "partOk" && !state.kwArgs[callback] && !state.kwArgs["handle"]) {
  239. if (callback == "error") {
  240. state.isDone = true;
  241. throw event;
  242. }
  243. } else {
  244. switch (callback) {
  245.   case "load":
  246. var response = event ? event.response : null;
  247. if (!response) {
  248. response = event;
  249. }
  250. state.kwArgs[(typeof state.kwArgs.load == "function") ? "load" : "handle"]("load", response, event, state.kwArgs);
  251. state.isDone = true;
  252. break;
  253.   case "partOk":
  254. var part = parseInt(event.response.part, 10) + 1;
  255. if (event.response.constantParams) {
  256. state.constantParams = event.response.constantParams;
  257. }
  258. this._multiAttach(state, part);
  259. state.isDone = false;
  260. break;
  261.   case "error":
  262. state.kwArgs[(typeof state.kwArgs.error == "function") ? "error" : "handle"]("error", event.response, event, state.kwArgs);
  263. state.isDone = true;
  264. break;
  265.   default:
  266. state.kwArgs[(typeof state.kwArgs[callback] == "function") ? callback : "handle"](callback, event, event, state.kwArgs);
  267. state.isDone = true;
  268. }
  269. }
  270. };
  271. dojo.io.transports.addTransport("ScriptSrcTransport");
  272. };
  273. window.onscriptload = function (event) {
  274. var state = null;
  275. var transport = dojo.io.ScriptSrcTransport;
  276. if (transport._state[event.id]) {
  277. state = transport._state[event.id];
  278. } else {
  279. var tempState;
  280. for (var param in transport._state) {
  281. tempState = transport._state[param];
  282. if (tempState.finalUrl && tempState.finalUrl == event.id) {
  283. state = tempState;
  284. break;
  285. }
  286. }
  287. if (state == null) {
  288. var scripts = document.getElementsByTagName("script");
  289. for (var i = 0; scripts && i < scripts.length; i++) {
  290. var scriptTag = scripts[i];
  291. if (scriptTag.getAttribute("class") == "ScriptSrcTransport" && scriptTag.src == event.id) {
  292. state = transport._state[scriptTag.id];
  293. break;
  294. }
  295. }
  296. }
  297. if (state == null) {
  298. throw "No matching state for onscriptload event.id: " + event.id;
  299. }
  300. }
  301. var callbackName = "error";
  302. switch (event.status) {
  303.   case dojo.io.ScriptSrcTransport.DsrStatusCodes.Continue:
  304. callbackName = "partOk";
  305. break;
  306.   case dojo.io.ScriptSrcTransport.DsrStatusCodes.Ok:
  307. callbackName = "load";
  308. break;
  309. }
  310. transport._finish(state, callbackName, event);
  311. };