
注意:如果正在寻找可与React一起使用的AJAX库,请参阅React 的 AJAX 库。
这就是没有库来简化它的 AJAX 的样子。
<!DOCTYPE html>
<!-- basic_ajax.html -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Basic AJAX Example</title>
<style>
pre {
white-space: normal;
}
</style>
<script type="text/javascript">
function getFile(file) {
var xmlobj;
if (typeof XMLHttpRequest != "undefined") {
xmlobj = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
for (var i = 0; i < aVersions.length; i++) {
try {
xmlobj = new ActiveXObject(aVersions[i]);
break;
} catch (err) {
}
}
}
if(xmlobj) {
xmlobj.onreadystatechange = function () {
if (xmlobj.readyState == 4 && xmlobj.status == 200) {
document.getElementById("html").innerText = xmlobj.responseText;
}
}
xmlobj.open("get", file, true);
xmlobj.send(null);
}
return false;
}
</script>
</head>
<body>
<pre id="html"></pre>
<a οnclick="return getFile('Lorem.txt');" href="#">Get the Lorem.txt file</a>
</body>
</html>
这是使用后面的 AJAX 库 (ajaxlib.js) 的上述文件。
<!DOCTYPE html>
<!-- ajax_lib.html -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>AJAX Library Example</title>
<style>
pre {
white-space: normal;
}
</style>
<script src="ajaxlib.js"></script>
</head>
<body>
<pre id="txt"></pre>
<a οnclick="return ajax({
path: 'Lorem.txt',
onsuccess: function(responseText) {
document.getElementById('txt').innerText = responseText;
}
});" href="#">Get the Lorem.txt file using ajaxlib.js</a>
</body>
</html>
ajaxlib.js
以下是 AJAX 中常用的函数。该ajax函数提交 AJAX 请求。该buildFormData函数返回一个FormData对象或一个由表单对象构建的字符串,用于帖子正文(data:函数ajax()请求对象)。它还可以在指定参数时计算表单中数据的大小true。returnSizeOnly确保设置表单的enctype属性,否则该buildFormData函数将无法与"multipart/form-data"表单一起使用。
该ajax函数调用请求对象的方法函数(如果指定)并传入上传完成的百分比,以便为用户显示进度指示器。
该代码已在 IE6 及 Chrome、Safari 和 Firefox 等较新的浏览器上测试过。
// ajaxlib.js
// add additional, custom fields here if so desired;
// returnSizeOnly=true will calculate the size of the form's data
function buildFormData(form, returnSizeOnly) {
var size = 0;
var params = new Array();
var fd;
if (!returnSizeOnly && form.enctype.toLowerCase() == "multipart/form-data" && typeof FormData != "undefined") {
fd = new FormData();
}
var len = form.elements.length;
for (var i = 0; i < len; i++) {
var field = form.elements[i];
if (field.name && field.name.length > 0) {
switch (field.type) {
case "select-one":
case "select-multiple":
if (field.name.length) {
var j, optLen;
for (j = 0, optLen = field.options.length; j < optLen; j++) {
option = field.options[j];
if (option.selected) {
var optValue = "";
if (option.hasAttribute) {
optValue = (option.hasAttribute("value") ? option.value : option.text);
} else {
optValue = (option.attributes["value"].specified ? option.value : option.text);
}
if (fd) {
fd.append(field.name, optValue);
}
else {
params.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(optValue));
}
size += optValue.length;
}
}
}
break;
case "submit":
case "reset":
case "button":
case undefined:
break;
case "file":
for (var j = 0; j < field.files.length; j++) {
if (fd) {
fd.append(field.name, field.files[j], field.files[j].name)
}
size += field.files[j].size;
}
break;
case "checkbox":
case "radio":
if (!field.checked) {
break;
}
default:
if (fd) {
fd.append(field.name, field.value)
}
else {
params.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
}
size += field.value.length;
}
}
}
return (returnSizeOnly ? size : (fd ? fd : params.join("&")));
}
/*
request = {
verb: "GET POST PUT DELETE etc.",
path: "",
contentType: "application/json; charset=utf-8, application/x-www-form-urlencoded; charset=utf-8, etc.",
headers: {"header1":"value1","header2":"value2"},
data: "string" or FormData,
onprogress: function,
onsuccess: function,
onfailure: function
};
*/
function ajax(request) {
if (typeof request != "object") { request = {}; }
var func = "function";
var undef = "undefined";
var xmlobj;
if (typeof XMLHttpRequest != undef) { // must use typeof operator for compatibility reasons
xmlobj = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
for (var i = 0; i < aVersions.length; i++) {
try {
xmlobj = new ActiveXObject(aVersions[i]);
break;
} catch (err) {
//void
}
}
}
var hasFailure = (typeof request.onfailure == func);
if (!xmlobj) {
if (hasFailure) {
request.onfailure(0, ""); // send a status of zero for this error
}
return false;
}
var hasProgess = (typeof request.onprogress == func);
if (hasProgess) {
xmlobj.onprogress = function (event) {
if (event.lengthComputable) {
request.onprogress(Math.floor(event.loaded / event.total * 100));
}
};
xmlobj.upload.onprogress = function (event) {
request.onprogress(Math.floor(event.loaded / event.total * 100));
};
}
xmlobj.onreadystatechange = function () {
if (xmlobj.readyState == 4) {
if (hasProgess) {
request.onprogress(false);
}
if (xmlobj.status == 200) {
if (typeof request.onsuccess == func) {
request.onsuccess((request.responseType && request.responseType == "arraybuffer") ? xmlobj.response : xmlobj.responseText, xmlobj.getResponseHeader("Content-Type") || "");
}
}
else if (hasFailure) {
request.onfailure(xmlobj.status, xmlobj.statusText);
}
}
};
xmlobj.open(request.verb || "get", request.path || window.document.location.pathname, true);
if (request.responseType) {
xmlobj.responseType = request.responseType;
}
if (request.contentType) {
if (typeof FormData == undef || !(request.data instanceof FormData)) {
xmlobj.setRequestHeader("Content-Type", request.contentType);
}
}
if (request.headers) {
for (var n in request.headers) {
xmlobj.setRequestHeader(n, request.headers[n]);
}
}
xmlobj.send(request.data || null);
return false; // to prevent forms and links from submitting
}
以下是使用上述 AJAX 库的示例代码。
// get the current page
var request = {
onsuccess: function (responseText) { alert(responseText); }
};
ajax(request);
// get /api/customers data
var request = {
path: "/api/customers",
onsuccess: function (responseText) { var customers = JSON.parse(responseText); }
};
ajax(request);
// post a form
var form = document.getElementById("form-id");
function progress(percent) {
var progressBar = document.getElementById("progress-bar");
progressBar.style.backgroundColor = "red";
progressBar.style.height = "16px";
if(percent) {
progressBar.innerText = progressBar.style.width = percent + "%";
}
else {
progressBar.innerText = progressBar.style.width = "";
}
}
function success(responseText) {
alert(responseText);
}
var request = {
verb: form.method,
path: form.action,
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data: buildFormData(form),
headers: {"Authorization":"auth token","referer":"http://localhost/index.html"},
onprogress: progress,
onsuccess: success
};
ajax(request);
// post a multipart/form-data form
var form = document.getElementById("form-id");
function progress(percent) {
var progressBar = document.getElementById("progress-bar");
progressBar.style.backgroundColor = "green";
progressBar.style.height = "20px";
if(percent) {
progressBar.innerText = progressBar.style.width = percent + "%";
}
else {
progressBar.innerText = progressBar.style.width = "";
}
}
function success(responseText) {
alert(responseText);
}
function failure(status, text) {
alert(status + ": " + text);
}
var request = {
verb: form.method,
path: form.action,
data: buildFormData(form),
onprogress: progress,
onsuccess: success,
onfailure: failure
};
ajax(request);
// post json and get json returned
ajax({
verb: "post",
path: "/api/addcustomer",
contentType: "application/json",
data: JSON.stringify({ firstname: form.firstname, lastname: form.lastname }),
onprogress: function(percent) { /* do something */ },
onsuccess: function(responseText) { var obj = JSON.parse(responseText); },
onfailure: function(status, text) { alert(status + ": " + text); }
});
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="ajaxlib.js"></script> <!--download from above-->
</head>
<body>
<pre id="html"></pre>
<a οnclick="return ajax({ onsuccess: function (res) { document.getElementById('html').innerText = res; } });" href="#">get the current page</a>
<form enctype="multipart/form-data" action="/" method="post" οnsubmit="return ajax({
verb: this.method,
path: this.action,
contentType: this.enctype,
data: buildFormData(this),
onprogress: function (percent) {
if (percent)
document.getElementById('progress').style.width = percent + '%';
else
document.getElementById('progress').style.width = 0;
},
onsuccess: function (res) {
alert(res);
},
onfailure: function(status, text) {
alert(status + ' ' + text);
}
});">
<input type="text" name="name" />
<input type="file" name="file" multiple />
<input type="submit" value="post to home page" />
</form>
<div id="progress" style="width:0;height:16px;background-color:red;"></div>
</body>
</html>
这是一个简单的Node.js服务器,它提供静态文件并回显发布到它的数据。它对于测试 AJAX 代码很有用。了解有关 Node.js 的更多信息。
var fs = require("fs");
const http = require("http");
const server = http.createServer().listen(8000);
console.log("listening on port 8000");
server.on("request", function (request, response) {
if (request.method == "POST") {
var body = "";
request.on("data", function (data) {
body += data.toString();
});
request.on("end", function () {
console.log(body);
var bodyArray = body.split('&');
var obj = {};
for(var i = 0; i < bodyArray.length; i++) {
var temp = bodyArray[i].split('=');
if(temp.length == 2)
obj[temp[0]] = decodeURIComponent(temp[1].replace(/\+/g, "%20"));
else
obj[temp[0]] = null;
}
// ECHO THE DATA BACK TO THE CLIENT
response.writeHead(200, {"Content-Type":"application/json"});
response.write(JSON.stringify(obj));
response.end();
});
}
else if (request.method == "GET") { // SERVE STATIC HTML FILES
console.log(request.url);
var file = request.url.substring(1, request.url.length);
if(file.length == 0)
file = "index.html";
fs.readFile(file, function (err, data) {
if (!err) {
response.writeHead(200, {"Content-Type":"text/html"});
response.end(data.toString('utf8'));
}
else {
response.writeHead(404, {"Content-Type":"text/plain"});
response.end(`path ${request.url} not found`);
}
});
}
else {
response.writeHead(405, {"Content-Type":"text/plain"});
response.end(`method ${request.method} not allowed`);
}
});
该文件与上述 node.js 服务器一起使用。
<!DOCTYPE html>
<!-- ajax_lib_form.html -->
<html lang="en">
<head>
<title>AJAX Library Example Form</title>
<script src="ajaxlib.js"></script>
<script type="text/javascript">
function submitForm(form) {
return ajax({
verb: form.method,
path: form.action,
contentType: form.enctype,
data: buildFormData(form),
onsuccess: function(responseText) {
document.getElementById('txt').innerText = responseText; // this server will return JSON
},
onprogress: function(percentage) {
if (percentage) {
document.getElementById('percent').innerText = percentage + '%';
}
},
onfailure: function(errorCode, errorText) {
alert(errorCode + ': ' + errorText);
}
});
}
</script>
</head>
<body>
<pre id="txt"></pre>
<form action="/" method="POST" enctype="application/x-www-form-urlencoded" οnsubmit="return submitForm(this);">
<input type="text" name="name" placeholder="enter name" /><br />
<input type="text" name="address" placeholder="enter address" /><br />
<input type="text" name="state" placeholder="enter state" /><br />
<input type="text" name="zip" placeholder="enter zip" /><br />
<input type="submit" />
</form>
<div id="percent"></div>
</body>
</html>
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。