📄 engine.js
字号:
throw new Error("Cross domain file uploads are not possible with this release of DWR"); } batch.transport = dwr.engine.transport.iframe; } else if (isCrossDomain && !dwr.engine.isJaxerServer) { batch.transport = dwr.engine.transport.scriptTag; } // else if (batch.isPoll && dwr.engine.isIE) { // batch.transport = dwr.engine.transport.htmlfile; // } else { batch.transport = dwr.engine.transport.xhr; } return batch.transport.send(batch); }, /** * A generic function to remove all remoting artifacts * @param {Object} batch The batch that has completed */ remove:function(batch) { dwr.engine.transport.iframe.remove(batch); dwr.engine.transport.xhr.remove(batch); }, /** * Called as a result of a request timeout * @private * @param {Object} batch The batch that is aborting */ abort:function(batch) { if (batch && !batch.completed) { dwr.engine.batch.remove(batch); if (batch.req) { batch.req.abort(); } dwr.engine.transport.remove(batch); dwr.engine._handleError(batch, { name:"dwr.engine.timeout", message:"Timeout" }); } }, /** * Remoting through XHR */ xhr:{ /** * The default HTTP method to use */ httpMethod:"POST", /** * The ActiveX objects to use when we want to do an XMLHttpRequest call. * TODO: We arrived at this by trial and error. Other toolkits use * different strings, maybe there is an officially correct version? */ XMLHTTP:["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], /** * Setup a batch for transfer through XHR * @param {Object} batch The batch to alter for XHR transmit */ send:function(batch) { if (batch.isPoll) { batch.map.partialResponse = dwr.engine._partialResponseYes; } // Do proxies or IE force us to use early closing mode? if (batch.isPoll && dwr.engine._pollWithXhr == "true") { batch.map.partialResponse = dwr.engine._partialResponseNo; } if (batch.isPoll && dwr.engine.isIE) { batch.map.partialResponse = dwr.engine._partialResponseNo; } if (window.XMLHttpRequest) { batch.req = new XMLHttpRequest(); } else if (window.ActiveXObject) { batch.req = dwr.engine.util.newActiveXObject(dwr.engine.transport.xhr.XMLHTTP); } // Proceed using XMLHttpRequest if (batch.async == true) { batch.req.onreadystatechange = function() { if (typeof dwr != 'undefined') { dwr.engine.transport.xhr.stateChange(batch); } }; } // If we're polling, record this for monitoring if (batch.isPoll) { dwr.engine._pollReq = batch.req; // In IE XHR is an ActiveX control so you can't augment it like this if (!dwr.engine.isIE) batch.req.batch = batch; } httpMethod = dwr.engine.transport.xhr.httpMethod; // Workaround for Safari 1.x POST bug var indexSafari = navigator.userAgent.indexOf("Safari/"); if (indexSafari >= 0) { var version = navigator.userAgent.substring(indexSafari + 7); if (parseInt(version, 10) < 400) { if (dwr.engine._allowGetForSafariButMakeForgeryEasier == "true") { httpMethod = "GET"; } else { dwr.engine._handleWarning(batch, { name: "dwr.engine.oldSafari", message: "Safari GET support disabled. See getahead.org/dwr/server/servlet and allowGetForSafariButMakeForgeryEasier." }); } } } batch.mode = batch.isPoll ? dwr.engine._ModePlainPoll : dwr.engine._ModePlainCall; var request = dwr.engine.batch.constructRequest(batch, httpMethod); try { batch.req.open(httpMethod, request.url, batch.async); try { for (var prop in batch.headers) { var value = batch.headers[prop]; if (typeof value == "string") { batch.req.setRequestHeader(prop, value); } } if (!batch.headers["Content-Type"]) { batch.req.setRequestHeader("Content-Type", "text/plain"); } } catch (ex) { dwr.engine._handleWarning(batch, ex); } batch.req.send(request.body); if (batch.async == false) { dwr.engine.transport.xhr.stateChange(batch); } } catch (ex) { dwr.engine._handleError(batch, ex); } if (batch.isPoll && batch.map.partialResponse == dwr.engine._partialResponseYes) { dwr.engine.transport.xhr.checkCometPoll(); } // This is only of any use in sync mode to return the reply data return batch.reply; }, /** * Called by XMLHttpRequest to indicate that something has happened * @private * @param {Object} batch The current remote operation */ stateChange:function(batch) { var toEval; if (batch.completed) { dwr.engine._debug("Error: _stateChange() with batch.completed"); return; } var req = batch.req; try { var readyState = req.readyState; var notReady = (req.readyState != 4); if (notReady) { return; } } catch (ex) { dwr.engine._handleWarning(batch, ex); // It's broken - clear up and forget this call dwr.engine.batch.remove(batch); return; } if (dwr.engine._unloading && !dwr.engine.isJaxerServer) { dwr.engine._debug("Ignoring reply from server as page is unloading."); return; } try { var reply = req.responseText; reply = dwr.engine._replyRewriteHandler(reply); var status = req.status; // causes Mozilla to except on page moves if (reply == null || reply == "") { dwr.engine._handleWarning(batch, { name:"dwr.engine.missingData", message:"No data received from server" }); } else if (status != 200) { dwr.engine._handleError(batch, { name:"dwr.engine.http." + status, message:req.statusText }); } else { var contentType = req.getResponseHeader("Content-Type"); if (dwr.engine.isJaxerServer) { // HACK! Jaxer does something b0rken with Content-Type contentType = "text/javascript"; } if (!contentType.match(/^text\/plain/) && !contentType.match(/^text\/javascript/)) { if (contentType.match(/^text\/html/) && typeof batch.textHtmlHandler == "function") { batch.textHtmlHandler({ status:status, responseText:reply, contentType:contentType }); } else { dwr.engine._handleWarning(batch, { name:"dwr.engine.invalidMimeType", message:"Invalid content type: '" + contentType + "'" }); } } else { // Comet replies might have already partially executed if (batch.isPoll && batch.map.partialResponse == dwr.engine._partialResponseYes) { dwr.engine.transport.xhr.processCometResponse(reply, batch); } else { if (reply.search("//#DWR") == -1) { dwr.engine._handleWarning(batch, { name:"dwr.engine.invalidReply", message:"Invalid reply from server" }); } else { toEval = reply; } } } } } catch (ex) { dwr.engine._handleWarning(batch, ex); } dwr.engine._callPostHooks(batch); // Outside of the try/catch so errors propagate normally: dwr.engine._receivedBatch = batch; if (toEval != null) toEval = toEval.replace(dwr.engine._scriptTagProtection, ""); dwr.engine._eval(toEval); dwr.engine._receivedBatch = null; dwr.engine.batch.validate(batch); if (!batch.completed) dwr.engine.batch.remove(batch); }, /** * Check for reverse Ajax activity * @private */ checkCometPoll:function() { if (dwr.engine._pollReq) { var req = dwr.engine._pollReq; var text = req.responseText; if (text != null) { dwr.engine.transport.xhr.processCometResponse(text, req.batch); } } // If the poll resources are still there, come back again if (dwr.engine._pollReq) { setTimeout(dwr.engine.transport.xhr.checkCometPoll, dwr.engine._pollCometInterval); } }, /** * Some more text might have come in, test and execute the new stuff. * This method could also be called by the iframe transport * @private * @param {Object} response from xhr.responseText * @param {Object} batch The batch that the XHR object pertains to */ processCometResponse:function(response, batch) { if (batch.charsProcessed == response.length) return; if (response.length == 0) { batch.charsProcessed = 0; return; } var firstStartTag = response.indexOf("//#DWR-START#", batch.charsProcessed); if (firstStartTag == -1) { // dwr.engine._debug("No start tag (search from " + batch.charsProcessed + "). skipping '" + response.substring(batch.charsProcessed) + "'"); batch.charsProcessed = response.length; return; } // if (firstStartTag > 0) { // dwr.engine._debug("Start tag not at start (search from " + batch.charsProcessed + "). skipping '" + response.substring(batch.charsProcessed, firstStartTag) + "'"); // } var lastEndTag = response.lastIndexOf("//#DWR-END#"); if (lastEndTag == -1) { // dwr.engine._debug("No end tag. unchanged charsProcessed=" + batch.charsProcessed); return; } // Skip the end tag too for next time, remembering CR and LF if (response.charCodeAt(lastEndTag + 11) == 13 && response.charCodeAt(lastEndTag + 12) == 10) { batch.charsProcessed = lastEndTag + 13; } else { batch.charsProcessed = lastEndTag + 11; } var exec = response.substring(firstStartTag + 13, lastEndTag); try { dwr.engine._receivedBatch = batch; dwr.engine._eval(exec); dwr.engine._receivedBatch = null; } catch (ex) { // This is one of these annoying points where we might be executing // while the window is being destroyed. If dwr == null, bail out. if (dwr != null) { dwr.engine._handleError(batch, ex); } } }, /** * Tidy-up when an XHR call is done * @param {Object} batch */ remove:function(batch) { // XHR tidyup: avoid IE handles increase if (batch.req) { // If this is a poll frame then stop comet polling if (batch.req == dwr.engine._pollReq) dwr.engine._pollReq = null; delete batch.req; } } }, /** * Functions for remoting through IFrame */ iframe:{ /** * Setup a batch for transfer through IFrame * @param {Object} batch The batch to alter for IFrame transmit */ send:function(batch) { if (batch.fileUpload) { batch.httpMethod = "POST"; batch.encType = "multipart/form-data"; } var idname = dwr.engine.transport.iframe.getId(batch); batch.div = document.createElement("div"); // Add the div to the document first, otherwise IE 6 will ignore onload handler. document.body.appendChild(batch.div); batch.div.innerHTML = "<iframe src='javascript:void(0)' frameborder='0' style='width:0px;height:0px;border:0;' id='" + idname + "' name='" + idname + "' onload='dwr.engine.transport.iframe.loadingComplete(" + batch.map.batchId + ");'></iframe>"; batch.document = document; dwr.engine.transport.iframe.beginLoader(batch, idname); }, /** * Create a unique ID so multiple iframes can fire at the same time * @param {Object} batch A source of a unique number for the batch * @return {String} a name prefix for created elements */ getId:function(batch) { return batch.isPoll ? "dwr-if-poll-" + batch.map.batchId : "dwr-if-" + batch.map.batchId; }, /** * Setup a form or construct a src attribute to use the iframe. * This is abstracted from send() because the same logic will do for htmlfile * @param {Object} batch */ beginLoader:function(batch, idname) { batch.iframe = batch.document.getElementById(idname); batch.iframe.batch = batch; batch.mode = batch.isPoll ? dwr.engine._ModeHtmlPoll : dwr.engine._ModeHtmlCall; if (batch.isPoll) dwr.engine._outstandingIFrames.push(batch.iframe);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -