JavaScript AJAX 库

注意:如果正在寻找可与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>

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
我是哈哈hh33 分钟前
【JavaScript进阶】作用域&解构&箭头函数
开发语言·前端·javascript·html
bin915344 分钟前
DeepSeek 助力 Vue 开发:打造丝滑的缩略图列表(Thumbnail List)
前端·javascript·vue.js·ecmascript·deepseek
圣心1 小时前
Ollama 快速入门
开发语言·javascript·人工智能
禾苗种树2 小时前
使用echart的dataZoom的labelFormatter自定义时间范围
前端·javascript·vue.js·echart
m0_748240912 小时前
SpringMVC 请求参数接收
前端·javascript·算法
Hermione_log2 小时前
【vue项目如何利用event-stream实现文字流式输出效果】
前端·javascript·vue.js
Little_Code3 小时前
关于uniapp使用renderJS中调用父类方法和参数的使用
前端·javascript·uni-app
qq_316837753 小时前
uniapp h5端和app端 使用 turn.js
开发语言·javascript·uni-app
程序员远仔3 小时前
【Vue.js 和 React.js 的主要区别是什么?】
前端·javascript·css·vue.js·react.js·性能优化·html5
coooliang4 小时前
Flutter 中的单例模式
javascript·flutter·单例模式