📄 najax.js
字号:
var NAJAX_ERROR_USER = 0x400;var NAJAX_ERROR_TIMEOUT = 0x401;var najax = {};najax.errorHandler = null;najax.callbacks = {};najax.callbacks.table = {};najax.callbacks.count = 0;najax.events = {};najax.events.table = [];najax.events.postTable = [];najax.events.timeout = 5000;najax.events.startInterval = 250;najax.events.refreshInterval = 2000;najax.events.status = 0;najax.observers = [];najax.asyncCall = function() {};najax.callSuspender = function(){ return { suspend : function() { this.suspended = true; }, suspended : false }};najax.getError = function(errorCode, errorMessage){ return { code : errorCode, message : errorMessage }};najax.getXmlHttp = function(){ var xmlHttp = null; try { xmlHttp = new XMLHttpRequest(); } catch (e) { var progIds = ['MSXML2.XMLHTTP', 'Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0']; var success = false; for (var iterator = 0; (iterator < progIds.length) && ( ! success); iterator ++) { try { xmlHttp = new ActiveXObject(progIds[iterator]); success = true; } catch (e) {} } if ( ! success ) { return null; } } return xmlHttp;};najax.clone = function(target, source){ var wipeKeys = []; for (var key in target.__meta) { if (typeof(source[key]) == 'undefined') { wipeKeys.push(key); } } if (wipeKeys.length > 0) { for (var iterator = 0; iterator < wipeKeys.length; iterator ++) { target[wipeKeys[iterator]] = null; } } for (var key in source.__meta) { if (source[key] == null) { target[key] = null; } else { target[key] = source[key]; } } target.__meta = source.__meta; target.__size = source.__size; target.__timeout = source.__timeout;};najax.serialize = function(data){ if (data == null) { return 'N;'; } var type = typeof(data); var code = ''; if (type == 'boolean') { code += 'b:' + (data ? 1 : 0) + ';'; } else if (type == 'number') { if (Math.round(data) == data) { code += 'i:' + data + ';'; } else { code += 'd:' + data + ';'; } } else if (type == 'string') { var length = data.length; for (var iterator = 0; iterator < data.length; iterator ++) { var asciiCode = data.charCodeAt(iterator); if ((asciiCode >= 0x00000080) && (asciiCode <= 0x000007FF)) { length += 1; } else if ((asciiCode >= 0x00000800) && (asciiCode <= 0x0000FFFF)) { length += 2; } else if ((asciiCode >= 0x00010000) && (asciiCode <= 0x001FFFFF)) { length += 3; } else if ((asciiCode >= 0x00200000) && (asciiCode <= 0x03FFFFFF)) { length += 4; } else if ((asciiCode >= 0x04000000) && (asciiCode <= 0x7FFFFFFF)) { length += 5; } } code += 's:' + length + ':"' + data + '";'; } else if (type == 'object') { if (typeof(data.__class) == 'undefined') { var length = 0; if ( (typeof(data.length) == 'number') && (data.length > 0) && (typeof(data[0]) != 'undefined')) { for (var iterator = 0; iterator < data.length; iterator ++) { code += najax.serialize(iterator); code += najax.serialize(data[iterator]); } length = data.length; } else { for (var key in data) { if (/^[0-9]+$/.test(key)) { code += najax.serialize(parseInt(key)); } else { code += najax.serialize(key); } code += najax.serialize(data[key]); length ++; } } code = 'a:' + length + ':{' + code + '}'; } else { code += 'O:' + data.__class.length + ':"' + data.__class + '":' + data.__size + ':{'; if (data.__meta != null) { for (var key in data.__meta) { code += najax.serialize(key); code += najax.serialize(data[key]); } } code += '}'; } } else { code = 'N;' } return code;};najax.setErrorHandler = function(handler){ if ( (handler != null) && (typeof(handler) == 'function')) { najax.errorHandler = handler; return true; } return false;};najax.restoreErrorHandler = function(){ najax.errorHandler = null; return true;};najax.throwException = function(error, throwArguments){ if (typeof(throwArguments) != 'undefined') { var sender = throwArguments[0]; var method = throwArguments[1]; method = 'on' + method.charAt(0).toUpperCase() + method.substr(1) + 'Error'; if (najax.invokeMethod(sender, method, [error])) { return false; } } if ( (najax.errorHandler != null) && (typeof(najax.errorHandler) == 'function')) { najax.errorHandler(error); return false; } throw error;};najax.invokeMethod = function(obj, method, invokeArguments){ if ( (obj == null) || (typeof(obj) != 'object')) { return false; } var type = eval('typeof(obj.' + method + ')'); if (type == 'function') { var invokeCode = 'obj.' + method + '('; if (typeof(invokeArguments) != 'undefined') { for (var iterator = 0; iterator < invokeArguments.length; iterator ++) { invokeCode += 'invokeArguments[' + iterator + ']'; if (iterator < invokeArguments.length - 1) { invokeCode += ', '; } } } invokeCode += ')'; return eval(invokeCode); } return false;};najax.call = function(obj, method, callArguments){ if ( (obj == null) || (typeof(obj) != 'object') || (typeof(obj.__class) != 'string')) { return false; } var methodCallback = null; var methodArgs = []; for (var iterator = 0; iterator < callArguments.length; iterator ++) { methodArgs.push(callArguments[iterator]); } if ( (methodArgs.length > 0) && (typeof(methodArgs[methodArgs.length - 1]) == 'function')) { methodCallback = methodArgs[methodArgs.length - 1]; methodArgs.pop(); } var xmlHttp = najax.getXmlHttp(); var requestBody = { source : obj, className : obj.__class, method : method, arguments : methodArgs }; najax.notifyObservers('call', requestBody); requestBody.source = najax.serialize(requestBody.source); requestBody.arguments = najax.serialize(requestBody.arguments); requestBody = najax.serialize(requestBody); var url = obj.__url; if (url.indexOf('?') < 0) { url += '?'; } else { url += '&'; } url += 'najaxCall=true'; if (methodCallback != null) { xmlHttp.open('POST', url, true); } else { xmlHttp.open('POST', url, false); } var callId = null; var callTimeout = obj.getTimeout(); if (callTimeout != null) { callId = najax.callbacks.count; } najax.callbacks.count ++; var callResult = true; var requestCompleted = function() { if (typeof(callResult) == 'object') { if (callResult.suspended) { return false; } } if (callId != null) { if (eval('najax.callbacks.table.call' + callId + '.timeout')) { return false; } eval('window.clearTimeout(najax.callbacks.table.call' + callId + '.id)'); eval('najax.callbacks.table.call' + callId + ' = null'); } if (xmlHttp.status != 200) { return najax.throwException(najax.getError(xmlHttp.status, xmlHttp.statusText), [obj, method]); } else { if (xmlHttp.responseText == null) { return najax.throwException(najax.getError(xmlHttp.status, 'Empty response.'), [obj, method]); } if (xmlHttp.responseText.length < 1) { return najax.throwException(najax.getError(xmlHttp.status, 'Empty response.'), [obj, method]); } try { eval('var najaxResponse = ' + xmlHttp.responseText + ';'); } catch(e) { return najax.throwException(najax.getError(xmlHttp.status, 'Invalid response.'), [obj, method]); } if (typeof(najaxResponse.exception) != 'undefined') { return najax.throwException(najax.getError(NAJAX_ERROR_USER, najaxResponse.exception), [obj, method]); } if (najax.notifyObservers('callCompleted', najaxResponse)) { obj.__clone(najaxResponse.returnObject); if (typeof(najaxResponse.output) != 'undefined') { obj.__output = najaxResponse.output; } else { obj.__output = null; } return { returnValue : najaxResponse.returnValue }; } } return false; }; try { xmlHttp.setRequestHeader('Content-Length', requestBody.length); xmlHttp.setRequestHeader('Content-Type', 'text/plain; charset=UTF-8'); xmlHttp.setRequestHeader('Accept-Charset', 'UTF-8');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -