📄 engine.js
字号:
if (ex.message == undefined) ex.message = ""; dwr.engine._handleError(dwr.engine._receivedBatch, ex); if (searchBatch) { dwr.engine._receivedBatch = null; dwr.engine.batch.remove(dwr.engine._batches[batchId]); } }, /** * Called by the server when we need to set a new script session id * @param {Object} newSessionId The new script session id to be used from now */ handleNewScriptSession:function(newSessionId) { if (dwr.engine._scriptSessionId != null) { dwr.engine._debug("Server side script session id timed out. New session automatically created"); } dwr.engine._scriptSessionId = newSessionId; }, /** * Called by the server when we need to set a new script session id * @param {Object} newSessionId The new script session id to be used from now */ handleNewWindowName:function(windowName) { dwr.engine._debug("Setting new window name: " + windowName); if (window.name != null && window.name != "") { dwr.engine._debug("- Warning: This will override existing name of: " + window.name); } window.name = windowName; }, /** * Execute some script in a different window * @param {Object} windowName The name of the window in which to eval the script * @param {Object} script The script to eval elsewhere */ handleForeign:function(windowName, script) { var foreign = window.open(null, windowName); if (foreign != null) { if (foreign.dwr != null) { foreign.dwr.engine._eval(script); } else { dwr.engine._debug("Found window, but DWR did not exist in it"); } } else { dwr.engine._debug("Could not find window"); } }, /** * Called by the server: Reverse ajax should not be used * @private * @param {Object} ex * @param {int} batchId */ pollCometDisabled:function(ex, batchId){ dwr.engine.setActiveReverseAjax(false); var searchBatch = (dwr.engine._receivedBatch == null && batchId != null); if (searchBatch) { dwr.engine._receivedBatch = dwr.engine._batches[batchId]; } if (ex.message == undefined) { ex.message = ""; } dwr.engine._handleError(dwr.engine._receivedBatch, ex); if (searchBatch) { dwr.engine._receivedBatch = null; dwr.engine.batch.remove(dwr.engine._batches[batchId]); } }, /** * Called by the server: Create a new object of a mapped class * @private * @param {string} dwrClassName the name of the mapped class * @param {Object} memberMap the object's data members */ newObject:function(dwrClassName, memberMap){ var classfunc = dwr.engine._mappedClasses[dwrClassName]; if (classfunc && classfunc.createFromMap) { return classfunc.createFromMap(memberMap); } else { memberMap.$dwrClassName = dwrClassName; return memberMap; } } }; /** * Functions to serialize a data set into a list of parameters */ dwr.engine.serialize = { /** * ActiveX objects to use when we want to convert an xml string into a DOM object */ domDocument:[ "Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM" ], /** * A holder for functions that we have serialized for remote calling. */ remoteFunctions:{}, /** * The ID of the next function that we serialize */ funcId:0, /** * Convert a text representation of XML into a DOM element * @param {String} xml An xml string */ toDomElement:function(xml) { return dwr.engine.serialize.toDomDocument(xml).documentElement; }, /** * Convert a text representation of XML into a DOM document * @param {String} xml An xml string */ toDomDocument:function(xml) { var dom; if (window.DOMParser) { var parser = new DOMParser(); dom = parser.parseFromString(xml, "text/xml"); if (!dom.documentElement || dom.documentElement.tagName == "parsererror") { var message = dom.documentElement.firstChild.data; message += "\n" + dom.documentElement.firstChild.nextSibling.firstChild.data; throw message; } return dom; } else if (window.ActiveXObject) { dom = dwr.engine.util.newActiveXObject(dwr.engine.serialize.domDocument); dom.loadXML(xml); // What happens on parse fail with IE? return dom; } else { var div = document.createElement("div"); div.innerHTML = xml; return div; } }, /** * Marshall a data item * @private * @param batch A map of variables to how they have been marshalled * @param referto An array of already marshalled variables to prevent recurrsion * @param data The data to be marshalled * @param name The name of the data being marshalled */ convert:function(batch, referto, data, name, depth) { if (data == null) { batch.map[name] = "null:null"; return; } switch (typeof data) { case "boolean": batch.map[name] = "boolean:" + data; break; case "number": batch.map[name] = "number:" + data; break; case "string": batch.map[name] = "string:" + encodeURIComponent(data); break; case "object": var ref = dwr.engine.serialize.lookup(referto, data, name); var objstr = Object.prototype.toString.call(data); if (data.$dwrByRef) batch.map[name] = dwr.engine.serialize.convertByReference(batch, referto, data, name, depth + 1); else if (ref != null) batch.map[name] = ref; else if (objstr == "[object String]") batch.map[name] = "string:" + encodeURIComponent(data); else if (objstr == "[object Boolean]") batch.map[name] = "boolean:" + data; else if (objstr == "[object Number]") batch.map[name] = "number:" + data; else if (objstr == "[object Date]") batch.map[name] = "date:" + data.getTime(); else if (objstr == "[object Array]") batch.map[name] = dwr.engine.serialize.convertArray(batch, referto, data, name, depth + 1); else if (data && data.tagName && data.tagName.toLowerCase() == "input" && data.type && data.type.toLowerCase() == "file") { batch.fileUpload = true; batch.map[name] = data; } else { // This check for an HTML is not complete, but is there a better way? // Maybe we should add: data.hasChildNodes typeof "function" == true if (data.nodeName && data.nodeType) { batch.map[name] = dwr.engine.serialize.convertXml(batch, referto, data, name, depth + 1); } else { batch.map[name] = dwr.engine.serialize.convertObject(batch, referto, data, name, depth + 1); } } break; case "function": // Ignore functions unless they are directly passed in if (depth == 0) { batch.map[name] = dwr.engine.serialize.convertByReference(batch, referto, data, name, depth + 1); } break; default: dwr.engine._handleWarning(null, { name:"dwr.engine.unexpectedType", message:"Unexpected type: " + typeof data + ", attempting default converter." }); batch.map[name] = "default:" + data; break; } }, /** * Marshall an object by reference * @private * @see dwr.engine.serialize.convert() for parameter details */ convertByReference:function(batch, referto, data, name, depth) { var funcId = "f" + dwr.engine.serialize.funcId; dwr.engine.serialize.remoteFunctions[funcId] = data; dwr.engine.serialize.funcId++; return "byref:" + funcId; }, /** * Marshall an array * @private * @see dwr.engine.serialize.convert() for parameter details */ convertArray:function(batch, referto, data, name, depth) { var childName, i; if (dwr.engine.isIE <= 7) { // Use array joining on IE1-7 (fastest) var buf = ["array:["]; for (i = 0; i < data.length; i++) { if (i != 0) buf.push(","); batch.paramCount++; childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; dwr.engine.serialize.convert(batch, referto, data[i], childName, depth + 1); buf.push("reference:"); buf.push(childName); } buf.push("]"); reply = buf.join(""); } else { // Use string concat on other browsers (fastest) var reply = "array:["; for (i = 0; i < data.length; i++) { if (i != 0) reply += ","; batch.paramCount++; childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; dwr.engine.serialize.convert(batch, referto, data[i], childName, depth + 1); reply += "reference:"; reply += childName; } reply += "]"; } return reply; }, /** * Marshall an object by value * @private * @see dwr.engine.serialize.convert() for parameter details */ convertObject:function(batch, referto, data, name, depth) { // treat objects as an associative arrays var reply = "Object_" + dwr.engine.serialize.getObjectClassName(data) + ":{"; var elementset = (data.constructor && data.constructor.$dwrClassMembers ? data.constructor.$dwrClassMembers : data); var element; for (element in elementset) { if (typeof data[element] != "function") { batch.paramCount++; var childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; dwr.engine.serialize.convert(batch, referto, data[element], childName, depth + 1); reply += encodeURIComponent(element) + ":reference:" + childName + ", "; } } if (reply.substring(reply.length - 2) == ", ") { reply = reply.substring(0, reply.length - 2); } reply += "}"; return reply; }, /** * Marshall an object * @private * @see dwr.engine.serialize.convert() for parameter details */ convertXml:function(batch, referto, data, name, depth) { var output; if (window.XMLSerializer) output = new XMLSerializer().serializeToString(data); else if (data.toXml) output = data.toXml; else output = data.innerHTML; return "xml:" + encodeURIComponent(output); }, /** * Have we already converted this object? * @private * @see dwr.engine.serialize.convert() for parameter details */ lookup:function(referto, data, name) { var lookup; // Can't use a map: getahead.org/ajax/javascript-gotchas for (var i = 0; i < referto.length; i++) { if (referto[i].data == data) { lookup = referto[i]; break; } } if (lookup) { return "reference:" + lookup.name; } referto.push({ data:data, name:name }); return null; }, /** * Returns the classname of supplied argument obj. Similar to typeof, but * which returns the name of the constructor that created the object rather * than 'object' * @private * @param {Object} obj The object to detect the type of * @return The name of the object */ getObjectClassName:function(obj) { // Different handling depending on if, and what type of, class-mapping is used if (obj.$dwrClassName) return obj.$dwrClassName; // Light class-mapping uses the classname from a property on the instance else if (obj.constructor && obj.constructor.$dwrClassName) return obj.constructor.$dwrClassName; // Full class-mapping uses the classname from a property on the constructor function else return "Object"; } }; /** * Functions to handle the various remoting transport */ dwr.engine.transport = { /** * Actually send the block of data in the batch object. * @private * @param {Object} batch */ send:function(batch) { dwr.engine.batch.prepareToSend(batch); // Work out if we are going cross domain var isCrossDomain = false; if (batch.path == null) { batch.path = dwr.engine._pathToDwrServlet; } if (batch.path.indexOf("http://") == 0 || batch.path.indexOf("https://") == 0) { var dwrShortPath = dwr.engine._pathToDwrServlet.split("/", 3).join("/"); var hrefShortPath = window.location.href.split("/", 3).join("/"); isCrossDomain = (dwrShortPath != hrefShortPath); } if (batch.fileUpload) { if (isCrossDomain) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -