xhr.onreadystatechange = function(){ //當xhr的readystate屬性發生了改變,則觸發事件。 //readystate狀態, //0表示=》xhr對象已經建立,可是沒有初始化,至關於new了一個對象,可是沒有open(); //1表示,xhr已經調用open(), //2表示,xhr已經發出了ajax請求,調用了send()的時候。 //3表示,數據已經返回了部分 //4表示,數據已經所有返回 if(xhr.readyState !== 4){ return; } if(xhr.status >= 200 && xhr.status <= 300){ //數據存放在了xhr.responseText的屬性中(String) document.querySelector("h1").innerHTML = xhr.responseText; }else{ console.error("請求出錯"); } }
post方法javascript
xhr.onreadystatechange = function(){ if(xhr.readyState !== 4){ return; } if(xhr.status >= 200 && xhr.status <= 300){ //咱們須要一個JOSN的對象, var resp = JSON.parse(xhr.responseText); if(resp.result){ console.log("ok"); }else{ console.log("error"); } }else{ console.error("請求出錯"); } }
x= getDate(); y = getMoreDate(); z = getMoreDate(); //若是當x還在數據傳輸中,沒有完成數據返回,就被y調用,就會出現錯誤。 //若是使用一層一層的回調,會致使回調層級特別深,開發維護成本高,因此在es6中提出了promise對象。 getDate(function(x){ getMoreDate(x,function(y){ getMoreDate(y,function(z){ process z; }) }) })
var prom = new Promise(function(resolve,reject){ setTimeout(function(){ var num = Math.floor(Math.random() * 100); if(num % 2 === 0){ resolve(num); }else{ reject(num); } },3000) }); //使用promise的一個回調,成功的時候會調用then函數,失敗的時候調用catch函數。 prom.then(function(num){ console.log("resolve:" + num); }).catch(function(num){ console.log("reject:" + num); });
var article = ""; $.get("../para/p1.txt",function(p1){ article += p1 + "<br />"; $.get("../para/p2.txt",function(p2){ article += p2 + "<br />"; $.get("../para/p3.txt",function(p3){ article += p3 + "<br />"; $.get("../para/p4.txt",function(p4){ article += p4 + "<br />"; $("h1").html(article); }) }) }) })
function getDate1(){ return new Promise(function(resolve,reject){ $.get("../para/p1.txt",function(p1){ resolve(p1); }) }) } function getDate2(){ return new Promise(function(resolve,reject){ $.get("../para/p2.txt",function(p2){ resolve(p2); }) }) } function getDate3(){ return new Promise(function(resolve,reject){ $.get("../para/p3.txt",function(p3){ resolve(p3); }) }) } function getDate4(){ return new Promise(function(resolve,reject){ $.get("../para/p4.txt",function(p4){ resolve(p4); }) }) } var article = ""; //getDate返回了一個promise對象,因此能夠調用then方法 getDate1().then(function(p1){ article += p1 + "<br />"; return getDate2(); }).then(function(p2){ article += p2 + "<br />"; return getDate3(); }).then(function(p3){ article += p3 + "<br />"; return getDate4(); }).then(function(p4){ article += p4 + "<br />"; $("h1").html(article); });
promise.all([
p1,
p2,
p3
]).then();
promise.all([ $.ajax({url:'data/1.json',dataType:'json'}), $.ajax({url:'data/2.json',dataType:'json'}), $.ajax({url:'data/3.json',dataType:'json'}), ]).then((arr)=>{//由於有三個結果,因此返回的是一個數組,第一個function表明resovle,第二個function表明reject,這裏也可使用箭頭函數,若是想要獲取arr裏面的數據,也能夠直接將[data1,data2,data3]寫到形參裏。 let [data1,data2,data3] = arr; },(res)=>{ console.log('error'); })
aysnc funtion show(){//也能夠寫成箭頭函數 let show = async() =>{} let data1 = await $.ajax({url:'data/1.json',dataType:'json'});//準確的說await後面跟的是一個promise對象,可是jquery的ajax自己是包含promise的 let data2 = await $.ajax({url:'data/2.json',dataType:'json'}); let data3 = await $.ajax({url:'data/3.json',dataType:'json'}); console.log(data1,data2,data3); } show();
let show = async() =>{ let data1 = await $.ajax({url:'data/1.json',dataType:'json'}); if(data1.a<10){ let data2 = await $.ajax({url:'data/2.json',dataType:'json'}); console.log('a<10'); }else{ let data3 = await $.ajax({url:'data/3.json',dataType:'json'}); console.log('a>10'); } } show();
//這個方法不受同源策略的限制。也能夠用js生成方法名,比較靈活 function getData(da1){ console.log(da1); } var script = document.createElement("script"); script.id = "JSONP"; script.src = "../js/JSONP.js"; document.body.appendChild(script);
JSONP.js的代碼php
getData({"name":"john","age":18}); //012ajax.html使用的
function getData(data){ var script = document.querySelector("#JSONP");//選擇剛建立的jsonp script.parentNode.removeChild(script);//由於input的keyup事件,因此每次輸入都清除掉上一次的結果 $("ul").html("");//同時也清楚掉ul裏面的結果。 for(var i = 0;i < data.g.length;i++){//由於返回的是對象,遍歷對象 for(var index in data.g[i]){//用for in 方法遍歷對象 var p1 = data.g[i][index]; //將對象的值寫入p1 var p2 = index;} $("<li>"+ p1 + "--" + p2 +"</li>").appendTo("ul"); } } function getList(wd){ var script = document.createElement("script");//建立一個script script.id = "JSONP";//id script.src = "https://www.baidu.com/sugrec?&prod=pc&cb=getData&wd=" + wd; document.body.appendChild(script);//將jsonp文件放入樹中; } $("input").keyup(function(){ var wd = $(this).val(); getList(wd); });
$.get("http://localhost/cors/cors.php",function(data){ console.log(data); })
cors.php代碼html
<?php $person = array('name'=>'josh','age'=>18); header("Access-Control-Allow-Origin:*"); //在頭信息上寫入一個origin,要否則瀏覽器不能接受到跨域請求,則報錯,能夠寫上指定的域名,或者寫上* echo json_encode($person); ?>