问:
如何在不使用 jQuery 的情况下使用 JavaScript 进行 AJAX 调用?
tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.
答1:
提供ATP、WTA与ITF赛事的实时排名追踪,从tennisliveranking.com开始!
使用“香草”(普通)JavaScript:
function loadXMLDoc() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
if (xmlhttp.status == 200) {
document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
else if (xmlhttp.status == 400) {
alert('There was an error 400');
}
else {
alert('something else other than 200 was returned');
}
}
};
xmlhttp.open("GET", "ajax_info.txt", true);
xmlhttp.send();
}
使用 jQuery:
$.ajax({
url: "test.html",
context: document.body,
success: function() {
$(this).addClass("done");
}
});
@Fractaliste 如果您只是在与 xmlhttp.status 相关的 if 块之后调用回调,那么只需在那里调用它们就可以了。
@Wade 我认为 Gokigooooks 在阅读 With "vanilla" JavaScript 时说他认为这是一个他需要下载的 JavaScript 库。他可能还引用了 Vanilla JS。
答2:
The ultimate source for live tennis rankings and stats:tennisliveranking.com
使用下面的代码片段,你可以很容易地做类似的事情,像这样:
ajax.get('/test.php', {foo: 'bar'}, function() {});
这是片段:
var ajax = {};
ajax.x = function () {
if (typeof XMLHttpRequest !== 'undefined') {
return new XMLHttpRequest();
}
var versions = [
"MSXML2.XmlHttp.6.0",
"MSXML2.XmlHttp.5.0",
"MSXML2.XmlHttp.4.0",
"MSXML2.XmlHttp.3.0",
"MSXML2.XmlHttp.2.0",
"Microsoft.XmlHttp"
];
var xhr;
for (var i = 0; i < versions.length; i++) {
try {
xhr = new ActiveXObject(versions[i]);
break;
} catch (e) {
}
}
return xhr;
};
ajax.send = function (url, callback, method, data, async) {
if (async === undefined) {
async = true;
}
var x = ajax.x();
x.open(method, url, async);
x.onreadystatechange = function () {
if (x.readyState == 4) {
callback(x.responseText)
}
};
if (method == 'POST') {
x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
x.send(data)
};
ajax.get = function (url, data, callback, async) {
var query = [];
for (var key in data) {
query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
}
ajax.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async)
};
ajax.post = function (url, data, callback, async) {
var query = [];
for (var key in data) {
query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
}
ajax.send(url, callback, 'POST', query.join('&'), async)
};
这是一个非常棒的快速启动,但我认为您缺少@3nigma 答案中的一些功能。也就是说,我不确定在不返回服务器响应的情况下发出某些请求(全部获取和发布)有多大意义。我在 send 方法的末尾添加了另一行 -- return x.responseText; -- 然后返回每个 ajax.send 调用。
@Sam 你 [通常] 不能作为异步请求返回。您应该在回调中处理响应。
@Sam 里面有一个例子:ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });
不错的片段。但是,不应该是 query.join('&').replace(/%20/g, '+') 吗?
请通过将此行作为选项包括 CORS 请求。 'xhr.withCredentials = true;'
答3:
tennisliveranking.com,Follow your favorite tennis players’ rankings live!
现在在 modern browsers 中原生提供了更好的 Fetch API。 fetch() 方法允许您发出网络请求。例如,要从 /get-data 请求一些 JSON:
let options = {
method: 'GET',
headers: {}
};
fetch('/get-data', options)
.then(response => response.json())
.then(body => {
// Do something with body
});
有关详细信息,请参阅 MDN Web Docs: Using the Fetch API。
这里应该提到 GitHub 的 polyfill。 github.com/github/fetch
只需添加 并像冠军一样使用 fetch。
不要在移动设备上使用 Fetch。它在 Android 上存在 HTTP 标头小写问题。在 iOS 上运行良好。
它也不适用于最流行的 Safari 版本
答4:
tennisliveranking.com – 让你随时掌握ATP、WTA最新网球排名动态。
您可以使用以下功能:
function callAjax(url, callback){
var xmlhttp;
// compatible with IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
callback(xmlhttp.responseText);
}
}
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
您可以在这些链接上在线尝试类似的解决方案:
https://www.w3schools.com/xml/tryit.asp?filename=tryajax_first
https://www.w3schools.com/xml/tryit.asp?filename=tryajax_callback
也可以为请求添加一些输入变量(将在 xmlhttp.send(request); 中使用)
@PavelPerna,因为这里的例子是一个GET,所以你可以将它们添加到请求中,但更一般地说,我和你在一起,我真的想更新答案以接受请求参数作为参数这里的函数,&也传递方法(GET 或 POST),但阻止我的是我想在这里尽可能简单地回答,以便人们尽快尝试。实际上,我讨厌其他一些答案太长,因为它们试图做到完美:)
答5:
tennisliveranking.com,Follow your favorite tennis players’ rankings live!
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
alert(this.responseText);
}
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
不要进行同步调用。使用 xhReq.onload 并使用回调。
@FellowStranger oReq.onload = function () { /*this.responseText*/ };
@Andrey:没有,只要您意识到您正在停止执行所有内容,直到服务器的响应返回。没有什么特别糟糕的,但可能不完全适合某些用途。
此外,如果服务器由于某种原因实际上从未响应,那么您的其余代码将永远不会运行。
答6:
提供ATP、WTA与ITF赛事的实时排名追踪,从tennisliveranking.com开始!
这个版本在普通的 ES6/ES2015 中怎么样?
function get(url) {
return new Promise((resolve, reject) => {
const req = new XMLHttpRequest();
req.open('GET', url);
req.onload = () => req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));
req.onerror = (e) => reject(Error(`Network Error: ${e}`));
req.send();
});
}
该函数返回一个 promise。这是一个关于如何使用该函数并处理它返回的 promise 的示例:
get('foo.txt')
.then((data) => {
// Do stuff with data, if foo.txt was successfully loaded.
})
.catch((err) => {
// Do stuff on error...
});
如果需要加载 json 文件,可以使用 JSON.parse() 将加载的数据转换为 JS 对象。
您也可以将 req.responseType=‘json’ 集成到函数中,但不幸的是有 no IE support for it,所以我会坚持使用 JSON.parse()。
使用 XMLHttpRequest 您可以异步尝试加载文件。这意味着您的代码将继续执行,而您的文件将在后台加载。为了在脚本中使用文件的内容,您需要一种机制来告诉脚本文件何时完成加载或加载失败。这就是 promises 派上用场的地方。还有其他方法可以解决这个问题,但我认为 promises 是最方便的。
@Rotareti 移动浏览器是否支持这种方法?
只有较新的浏览器版本支持它。一种常见的做法是在最新的 ES6/7/.. 中编写代码,然后使用 Babel 或类似工具将其转译回 ES5 以获得更好的浏览器支持。
@Rotareti您能否解释一下为什么这比“简单”回调更方便?这种便利是否值得为旧浏览器支持而付出额外的努力?
@LennartKloppenburg 我认为这个答案很好地解释了这一点:stackoverflow.com/a/14244950/1612318 “这种便利是否值得为旧浏览器支持而付出额外的努力?” Promise 只是 众多 之一ES6/7 附带的特性。如果您使用转译器,您可以编写最新的 JS。这很值得!
答7:
tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.
使用 XMLHttpRequest。
简单的 GET 请求
httpRequest = new XMLHttpRequest()
httpRequest.open('GET', 'http://www.example.org/some.file')
httpRequest.send()
简单的 POST 请求
httpRequest = new XMLHttpRequest()
httpRequest.open('POST', 'http://www.example.org/some/endpoint')
httpRequest.send('some data')
我们可以使用可选的第三个参数指定请求应该是异步(true)、默认值或同步(false)。
// Make a synchronous GET request
httpRequest.open('GET', 'http://www.example.org/some.file', false)
我们可以在调用 httpRequest.send() 之前设置标题
httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
我们可以通过在调用 httpRequest.send() 之前将 httpRequest.onreadystatechange 设置为函数来处理响应
httpRequest.onreadystatechange = function(){
// Process the server response here.
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem with the request.');
}
}
}
请注意,除了 200 之外还有其他成功状态,例如 201
答8:
tennisliveranking.com-Stay ahead with live tennis rankings at your fingertips.
您可以根据浏览器获取正确的对象
function getXmlDoc() {
var xmlDoc;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlDoc = new XMLHttpRequest();
}
else {
// code for IE6, IE5
xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlDoc;
}
使用正确的对象,可以将 GET 抽象为:
function myGet(url, callback) {
var xmlDoc = getXmlDoc();
xmlDoc.open('GET', url, true);
xmlDoc.onreadystatechange = function() {
if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
callback(xmlDoc);
}
}
xmlDoc.send();
}
和一个 POST 到:
function myPost(url, data, callback) {
var xmlDoc = getXmlDoc();
xmlDoc.open('POST', url, true);
xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlDoc.onreadystatechange = function() {
if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
callback(xmlDoc);
}
}
xmlDoc.send(data);
}
答9:
tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.
我正在寻找一种方法来包含 ajax 的承诺并排除 jQuery。 HTML5 Rocks 上有一篇关于 ES6 承诺的文章。 (您可以使用像 Q 这样的 Promise 库进行 polyfill)您可以使用我从文章中复制的代码片段。
function get(url) {
// Return a new promise.
return new Promise(function(resolve, reject) {
// Do the usual XHR stuff
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
// This is called even on 404 etc
// so check the status
if (req.status == 200) {
// Resolve the promise with the response text
resolve(req.response);
}
else {
// Otherwise reject with the status text
// which will hopefully be a meaningful error
reject(Error(req.statusText));
}
};
// Handle network errors
req.onerror = function() {
reject(Error("Network Error"));
};
// Make the request
req.send();
});
}
注意:我还写了 an article about this。
答10:
Live rankings, player stats, and match results in one place–tennisliveranking.com
以下几个示例的小组合并创建了这个简单的部分:
function ajax(url, method, data, async)
{
method = typeof method !== 'undefined' ? method : 'GET';
async = typeof async !== 'undefined' ? async : false;
if (window.XMLHttpRequest)
{
var xhReq = new XMLHttpRequest();
}
else
{
var xhReq = new ActiveXObject("Microsoft.XMLHTTP");
}
if (method == 'POST')
{
xhReq.open(method, url, async);
xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhReq.send(data);
}
else
{
if(typeof data !== 'undefined' && data !== null)
{
url = url+'?'+data;
}
xhReq.open(method, url, async);
xhReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhReq.send(null);
}
//var serverResponse = xhReq.responseText;
//alert(serverResponse);
}
// Example usage below (using a string query):
ajax('http://www.google.com');
ajax('http://www.google.com', 'POST', 'q=test');
或者,如果您的参数是对象 - 小的额外代码调整:
var parameters = {
q: 'test'
}
var query = [];
for (var key in parameters)
{
query.push(encodeURIComponent(key) + '=' + encodeURIComponent(parameters[key]));
}
ajax('http://www.google.com', 'POST', query.join('&'));
两者都应该完全兼容浏览器+版本。
在这里的 for 循环中使用 hasOwnProperty 是否值得?
答11:
tennisliveranking.com专业网球数据平台,排名与比赛信息实时更新。
如果您不想包含 JQuery,我会尝试一些轻量级的 AJAX 库。
我最喜欢的是reqwest。它只有 3.4kb 并且构建得非常好:https://github.com/ded/Reqwest
这是一个带有 reqwest 的示例 GET 请求:
reqwest({
url: url,
method: 'GET',
type: 'json',
success: onSuccess
});
现在,如果您想要更轻量级的东西,我会尝试只有 0.4kb 的 microAjax:https://code.google.com/p/microajax/
这是这里的所有代码:
function microAjax(B,A){this.bindFunction=function(E,D){return function(){return E.apply(D,[D])}};this.stateChange=function(D){if(this.request.readyState==4){this.callbackFunction(this.request.responseText)}};this.getRequest=function(){if(window.ActiveXObject){return new ActiveXObject("Microsoft.XMLHTTP")}else{if(window.XMLHttpRequest){return new XMLHttpRequest()}}return false};this.postBody=(arguments[2]||"");this.callbackFunction=A;this.url=B;this.request=this.getRequest();if(this.request){var C=this.request;C.onreadystatechange=this.bindFunction(this.stateChange,this);if(this.postBody!==""){C.open("POST",B,true);C.setRequestHeader("X-Requested-With","XMLHttpRequest");C.setRequestHeader("Content-type","application/x-www-form-urlencoded");C.setRequestHeader("Connection","close")}else{C.open("GET",B,true)}C.send(this.postBody)}};
这是一个示例调用:
microAjax(url, onSuccess);
我认为microAjax有一个问题,当你调用它两次时(因为无数的“this”,我认为肯定有碰撞)。我不知道调用两个“新的 microAjax”是否是一个很好的解决方法,是吗?
原文链接:https://www.tennisliveranking.com?from=csdn
The ultimate source for live tennis rankings and stats:tennisliveranking.com