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

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.IframeIO");
  9. dojo.require("dojo.io.BrowserIO");
  10. dojo.require("dojo.uri.*");
  11. dojo.io.createIFrame = function (fname, onloadstr, uri) {
  12. if (window[fname]) {
  13. return window[fname];
  14. }
  15. if (window.frames[fname]) {
  16. return window.frames[fname];
  17. }
  18. var r = dojo.render.html;
  19. var cframe = null;
  20. var turi = uri;
  21. if (!turi) {
  22. if (djConfig["useXDomain"] && !djConfig["dojoIframeHistoryUrl"]) {
  23. dojo.debug("dojo.io.createIFrame: When using cross-domain Dojo builds," + " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl" + " to the path on your domain to iframe_history.html");
  24. }
  25. turi = (djConfig["dojoIframeHistoryUrl"] || dojo.uri.moduleUri("dojo", "../iframe_history.html")) + "#noInit=true";
  26. }
  27. var ifrstr = ((r.ie) && (dojo.render.os.win)) ? "<iframe name="" + fname + "" src="" + turi + "" onload="" + onloadstr + "">" : "iframe";
  28. cframe = document.createElement(ifrstr);
  29. with (cframe) {
  30. name = fname;
  31. setAttribute("name", fname);
  32. id = fname;
  33. }
  34. dojo.body().appendChild(cframe);
  35. window[fname] = cframe;
  36. with (cframe.style) {
  37. if (!r.safari) {
  38. position = "absolute";
  39. }
  40. left = top = "0px";
  41. height = width = "1px";
  42. visibility = "hidden";
  43. }
  44. if (!r.ie) {
  45. dojo.io.setIFrameSrc(cframe, turi, true);
  46. cframe.onload = new Function(onloadstr);
  47. }
  48. return cframe;
  49. };
  50. dojo.io.IframeTransport = new function () {
  51. var _this = this;
  52. this.currentRequest = null;
  53. this.requestQueue = [];
  54. this.iframeName = "dojoIoIframe";
  55. this.fireNextRequest = function () {
  56. try {
  57. if ((this.currentRequest) || (this.requestQueue.length == 0)) {
  58. return;
  59. }
  60. var cr = this.currentRequest = this.requestQueue.shift();
  61. cr._contentToClean = [];
  62. var fn = cr["formNode"];
  63. var content = cr["content"] || {};
  64. if (cr.sendTransport) {
  65. content["dojo.transport"] = "iframe";
  66. }
  67. if (fn) {
  68. if (content) {
  69. for (var x in content) {
  70. if (!fn[x]) {
  71. var tn;
  72. if (dojo.render.html.ie) {
  73. tn = document.createElement("<input type='hidden' name='" + x + "' value='" + content[x] + "'>");
  74. fn.appendChild(tn);
  75. } else {
  76. tn = document.createElement("input");
  77. fn.appendChild(tn);
  78. tn.type = "hidden";
  79. tn.name = x;
  80. tn.value = content[x];
  81. }
  82. cr._contentToClean.push(x);
  83. } else {
  84. fn[x].value = content[x];
  85. }
  86. }
  87. }
  88. if (cr["url"]) {
  89. cr._originalAction = fn.getAttribute("action");
  90. fn.setAttribute("action", cr.url);
  91. }
  92. if (!fn.getAttribute("method")) {
  93. fn.setAttribute("method", (cr["method"]) ? cr["method"] : "post");
  94. }
  95. cr._originalTarget = fn.getAttribute("target");
  96. fn.setAttribute("target", this.iframeName);
  97. fn.target = this.iframeName;
  98. fn.submit();
  99. } else {
  100. var query = dojo.io.argsFromMap(this.currentRequest.content);
  101. var tmpUrl = cr.url + (cr.url.indexOf("?") > -1 ? "&" : "?") + query;
  102. dojo.io.setIFrameSrc(this.iframe, tmpUrl, true);
  103. }
  104. }
  105. catch (e) {
  106. this.iframeOnload(e);
  107. }
  108. };
  109. this.canHandle = function (kwArgs) {
  110. return ((dojo.lang.inArray(["text/plain", "text/html", "text/javascript", "text/json", "application/json"], kwArgs["mimetype"])) && (dojo.lang.inArray(["post", "get"], kwArgs["method"].toLowerCase())) && (!((kwArgs["sync"]) && (kwArgs["sync"] == true))));
  111. };
  112. this.bind = function (kwArgs) {
  113. if (!this["iframe"]) {
  114. this.setUpIframe();
  115. }
  116. this.requestQueue.push(kwArgs);
  117. this.fireNextRequest();
  118. return;
  119. };
  120. this.setUpIframe = function () {
  121. this.iframe = dojo.io.createIFrame(this.iframeName, "dojo.io.IframeTransport.iframeOnload();");
  122. };
  123. this.iframeOnload = function (errorObject) {
  124. if (!_this.currentRequest) {
  125. _this.fireNextRequest();
  126. return;
  127. }
  128. var req = _this.currentRequest;
  129. if (req.formNode) {
  130. var toClean = req._contentToClean;
  131. for (var i = 0; i < toClean.length; i++) {
  132. var key = toClean[i];
  133. if (dojo.render.html.safari) {
  134. var fNode = req.formNode;
  135. for (var j = 0; j < fNode.childNodes.length; j++) {
  136. var chNode = fNode.childNodes[j];
  137. if (chNode.name == key) {
  138. var pNode = chNode.parentNode;
  139. pNode.removeChild(chNode);
  140. break;
  141. }
  142. }
  143. } else {
  144. var input = req.formNode[key];
  145. req.formNode.removeChild(input);
  146. req.formNode[key] = null;
  147. }
  148. }
  149. if (req["_originalAction"]) {
  150. req.formNode.setAttribute("action", req._originalAction);
  151. }
  152. if (req["_originalTarget"]) {
  153. req.formNode.setAttribute("target", req._originalTarget);
  154. req.formNode.target = req._originalTarget;
  155. }
  156. }
  157. var contentDoc = function (iframe_el) {
  158. var doc = iframe_el.contentDocument || ((iframe_el.contentWindow) && (iframe_el.contentWindow.document)) || ((iframe_el.name) && (document.frames[iframe_el.name]) && (document.frames[iframe_el.name].document)) || null;
  159. return doc;
  160. };
  161. var value;
  162. var success = false;
  163. if (errorObject) {
  164. this._callError(req, "IframeTransport Request Error: " + errorObject);
  165. } else {
  166. var ifd = contentDoc(_this.iframe);
  167. try {
  168. var cmt = req.mimetype;
  169. if ((cmt == "text/javascript") || (cmt == "text/json") || (cmt == "application/json")) {
  170. var js = ifd.getElementsByTagName("textarea")[0].value;
  171. if (cmt == "text/json" || cmt == "application/json") {
  172. js = "(" + js + ")";
  173. }
  174. value = dj_eval(js);
  175. } else {
  176. if (cmt == "text/html") {
  177. value = ifd;
  178. } else {
  179. value = ifd.getElementsByTagName("textarea")[0].value;
  180. }
  181. }
  182. success = true;
  183. }
  184. catch (e) {
  185. this._callError(req, "IframeTransport Error: " + e);
  186. }
  187. }
  188. try {
  189. if (success && dojo.lang.isFunction(req["load"])) {
  190. req.load("load", value, req);
  191. }
  192. }
  193. catch (e) {
  194. throw e;
  195. }
  196. finally {
  197. _this.currentRequest = null;
  198. _this.fireNextRequest();
  199. }
  200. };
  201. this._callError = function (req, message) {
  202. var errObj = new dojo.io.Error(message);
  203. if (dojo.lang.isFunction(req["error"])) {
  204. req.error("error", errObj, req);
  205. }
  206. };
  207. dojo.io.transports.addTransport("IframeTransport");
  208. };