?? aa.js
字號:
/*
Copyright 2005 Vitaliy Shevchuk (shevit@users.sourceforge.net)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
AjaxAnywhere.defaultInstanceName = "default";
// constructor;
function AjaxAnywhere() {
this.id = AjaxAnywhere.defaultInstanceName;
this.formName = null;
this.notSupported = false;
this.delayBeforeContentUpdate = true;
this.delayInMillis = 100;
if (window.XMLHttpRequest) {
this.req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
this.req = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
this.req = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e1) {
this.notSupported = true;
/* XMLHTTPRequest not supported */
}
}
}
if (this.req == null || typeof this.req == "undefined")
this.notSupported = true;
}
/**
* Stores substitutes SubmitButton names in to redo sustitution if a button was eventually inside a refresh zone.
*/
AjaxAnywhere.prototype.substitutedSubmitButtons = new Array();
AjaxAnywhere.prototype.substitutedSubmitButtonsInfo = new Object();
/**
* Returns a Form object that corresponds to formName property of this AjaxAnywhere class instance.
*/
AjaxAnywhere.prototype.findForm = function () {
var form;
if (this.formName != null)
form = document.forms[this.formName];
else if (document.forms.length > 0)
form = document.forms[0];
if (typeof form != "object")
alert("AjaxAnywhere error: Form with name [" + this.formName + "] not found");
return form;
}
/**
* Binds this instance to window object using "AjaxAnywhere."+this.id as a key.
*/
AjaxAnywhere.prototype.bindById = function () {
var key = "AjaxAnywhere." + this.id;
window[key] = this;
}
/**
* Finds an instance by id.
*/
AjaxAnywhere.findInstance = function(id) {
var key = "AjaxAnywhere." + id;
return window[key];
}
/**
* This function is used to submit all form fields by AJAX request to the server.
* If the form is submited with <input type=submit|image>, submitButton should be a reference to the DHTML object. Otherwise - undefined.
*/
AjaxAnywhere.prototype.submitAJAX = function(additionalPostData, submitButton) {
if (this.notSupported)
return this.onSubmitAjaxNotSupported(additionalPostData, submitButton);
if (additionalPostData == null || typeof additionalPostData == "undefined")
additionalPostData = "";
this.bindById();
var form = this.findForm();
var actionAttrNode = form.attributes["action"];
var url = actionAttrNode == null?null:actionAttrNode.nodeValue;
if ((url == null) || (url == ""))
url = location.href;
var pos = url.indexOf("#");
if (pos!=-1)
url = url.substring(0,pos);
if ((url == null) || (url == ""))
url = location.href;
pos = url.indexOf("#");
if (pos!=-1)
url = url.substring(0,pos);
var zones = this.getZonesToReload(url, submitButton);
if (zones == null) {
// submit in tradiditional way :
this.submitOld(form,submitButton)
return;
}
this.dropPreviousRequest();
this.req.open("POST", url, true);
this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
this.req.setRequestHeader("Accept", "text/xml");
var postData = this.preparePostData(submitButton);
if (zones != "")
postData = '&aazones=' + encodeURIComponent(zones) + "&" + postData + "&" + additionalPostData;
else
postData += "&" + additionalPostData;
this.sendPreparedRequest(postData);
}
/**
* sends a GET request to the server.
*/
AjaxAnywhere.prototype.getAJAX = function(url, zonesToRefresh) {
if (this.notSupported)
return this.onGetAjaxNotSupported(url);
this.bindById();
if (zonesToRefresh == null || typeof zonesToRefresh == "undefined")
zonesToRefresh = "";
var urlDependentZones = this.getZonesToReload(url);
if (urlDependentZones == null) {
location.href = url;
return;
}
if (urlDependentZones.length != 0)
zonesToRefresh += "," + urlDependentZones;
this.dropPreviousRequest();
url += (url.indexOf("?") != -1) ? "&" : "?";
url += "aaxmlrequest=true&aa_rand=" + Math.random();
// avoid caching
if (zonesToRefresh != null && zonesToRefresh != "")
url += '&aazones=' + encodeURIComponent(zonesToRefresh);
this.req.open("GET", url, true);
this.req.setRequestHeader("Accept", "text/xml");
this.sendPreparedRequest("");
}
/**
* @private
*/
AjaxAnywhere.prototype.sendPreparedRequest = function (postData) {
var callbackKey = this.id + "_callbackFunction";
if (typeof window[callbackKey] == "undefined")
window[callbackKey] = new Function("AjaxAnywhere.findInstance(\"" + this.id + "\").callback(); ");
this.req.onreadystatechange = window[callbackKey];
this.showLoadingMessage();
this.req.send(postData);
}
/**
* Used internally by AjaxAnywhere. Aborts previous request if not completed.
*/
AjaxAnywhere.prototype.dropPreviousRequest = function() {
if (this.req.readyState != 0 && this.req.readyState != 4) {
// abort previous request if not completed
this.req.abort();
this.handlePrevousRequestAborted();
}
}
/**
* Internally used to prepare Post data.
* If the form is submited with <input type=submit|image>, submitButton is a reference to the DHTML object. Otherwise - undefined.
*/
AjaxAnywhere.prototype.preparePostData = function(submitButton) {
var form = this.findForm();
var result = "&aaxmlrequest=true";
for (var i = 0; i < form.elements.length; i++) {
var el = form.elements[i];
if (el.tagName.toLowerCase() == "select") {
for (var j = 0; j < el.options.length; j++) {
var op = el.options[j];
if (op.selected)
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(op.value);
}
} else if (el.tagName.toLowerCase() == "textarea") {
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.tagName.toLowerCase() == "input") {
if (el.type.toLowerCase() == "checkbox" || el.type.toLowerCase() == "radio") {
if (el.checked)
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.type.toLowerCase() == "submit") {
if (el == submitButton) // is "el" the submit button that fired the form submit?
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.type.toLowerCase() != "button") {
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
}
}
}
if (typeof submitButton != 'undefined' && submitButton != null && submitButton.type.toLowerCase() == "image") {
if (submitButton.name == null || submitButton.name == "" || typeof submitButton.name == "undefined")
result += "&x=1&y=1"; // .x and .y coordinates calculation is not supported.
else
result += "&" + encodeURIComponent(submitButton.name) + ".x=1&" +
encodeURIComponent(submitButton.name) + ".y=1";
}
return result;
}
/**
* Pauses the thread of execution for the specified number of milliseconds
* @private
*/
function delay(millis) {
date = new Date();
var curDate = null;
do {
curDate = new Date();
}
while (curDate - date < millis);
}
/**
* A callback. internally used
*/
AjaxAnywhere.prototype.callback = function() {
if (this.req.readyState == 4) {
this.onBeforeResponseProcessing();
this.hideLoadingMessage();
if (this.req.status == 200) {
if (this.req.getResponseHeader('content-type').toLowerCase().substring(0, 8) != 'text/xml')
alert("AjaxAnywhere error : content-type in not text/xml : [" + this.req.getResponseHeader('content-type') + "]");
var docs = this.req.responseXML.getElementsByTagName("document");
var redirects = this.req.responseXML.getElementsByTagName("redirect");
var zones = this.req.responseXML.getElementsByTagName("zone");
var exceptions = this.req.responseXML.getElementsByTagName("exception");
var scripts = this.req.responseXML.getElementsByTagName("script");
var images = this.req.responseXML.getElementsByTagName("image");
if (redirects.length != 0) {
var newURL = redirects[0].firstChild.data;
location.href = newURL;
}
if (docs.length != 0) {
var newContent = docs[0].firstChild.data;
//cleanup ressources
delete this.req;
document.close();
document.write(newContent);
document.close();
}
if (images.length != 0) {
var preLoad = new Array(images.length);
for (var i = 0; i < images.length; i++) {
var img = images[i].firstChild;
if (img != null) {
preLoad[i] = new Image();
preLoad[i].src = img.data;
}
}
if (this.delayBeforeContentUpdate) {
delay(this.delayInMillis);
}
}
if (zones.length != 0) {
for (var i = 0; i < zones.length; i++) {
var zoneNode = zones[i];
var name = zoneNode.getAttribute("name");
var id = zoneNode.getAttribute("id");
var html = "";
for (var childIndex = 0; childIndex < zoneNode.childNodes.length; childIndex++) {
html += zoneNode.childNodes[childIndex].data
}
var zoneHolder = name!=null?
document.getElementById("aazone." + name):
document.getElementById(id);
if (zoneHolder != null && typeof(zoneHolder) != "undefined") {
zoneHolder.innerHTML = html;
}
}
}
if (exceptions.length != 0) {
var e = exceptions[0];
var type = e.getAttribute("type");
var stackTrace = e.firstChild.data;
this.handleException(type, stackTrace);
}
if (scripts.length != 0) {
for (var $$$$i = 0; $$$$i < scripts.length; $$$$i++) {
// use $$$$i variable to avoid collision with "i" inside user script
var script = scripts[$$$$i].firstChild;
if (script != null) {
script = script.data;
if (script.indexOf("document.write") != -1) {
this.handleException("document.write", "This script contains document.write(), which is not compatible with AjaxAnywhere : \n\n" + script);
} else {
eval("var aaInstanceId = \""+this.id+"\"; \n"+script);
}
}
}
var globals = this.getGlobalScriptsDeclarationsList(script);
if (globals != null)
for (var i in globals) {
var objName = globals[i];
try {
window[objName] = eval(objName);
} catch(e) {
}
}
}
} else {
if (this.req.status != 0)
this.handleHttpErrorCode(this.req.status);
}
this.restoreSubstitutedSubmitButtons();
this.onAfterResponseProcessing();
}
}
/**
* Default sample loading message show function. Overrride it if you like.
*/
AjaxAnywhere.prototype.showLoadingMessage = function() {
var div = document.getElementById("AA_" + this.id + "_loading_div");
if (div == null) {
div = document.createElement("DIV");
document.body.appendChild(div);
div.id = "AA_" + this.id + "_loading_div";
div.innerHTML = " Loading...";
div.style.position = "absolute";
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -