
批改狀態(tài):合格
老師批語(yǔ):js是比較有意思的, 不要著急
1、json是借用了JS對(duì)象字面量法來(lái)表示數(shù)據(jù),是一種輕量級(jí),用于數(shù)據(jù)交換與存儲(chǔ)的格式化的字符串(本質(zhì)上仍是一個(gè)字符串);
2、json數(shù)據(jù)類型:
3、JS中有關(guān)json的兩個(gè)方法:
序列化:JS對(duì)象序列化為JSON格式的字符串JSON.stringify(JS_obj,array|fucntion(key,value){……},'字符縮進(jìn)數(shù)和字符');
當(dāng)?shù)诙€(gè)參數(shù)為數(shù)組時(shí):限制序列化成員(序列化白名單);反之為回調(diào)函數(shù)對(duì)JS對(duì)象中的元素進(jìn)一步處理返回JSON中(必須有return value;
否則為空,如果不需要某值返回undefined
);第三個(gè)參數(shù)為JSON縮進(jìn)字符;
注意:JS對(duì)象序列化之后,會(huì)將以下三種成員刪除:
(1)方法(函數(shù))
(2)值為undefined的屬性
(3)繼承的原型對(duì)象成員
解析:將JSON格式的字符串解析/還原為JS對(duì)象JSON.parse(json,function(key,value){……;return value;});
當(dāng)只有一個(gè)參數(shù)時(shí):直接解析JSON對(duì)象返回JS對(duì)象;當(dāng)為兩個(gè)參數(shù)時(shí):第二個(gè)參數(shù)為回調(diào)函數(shù),把JSON對(duì)象中的值處理后在返回;
4、JSON與JS對(duì)象的區(qū)別:
tips:為了規(guī)范/自定義序列化的返回結(jié)果,允許在JS對(duì)象中創(chuàng)建一個(gè)方法:toJSON;toJSON在調(diào)用JSON.stringify()時(shí)自動(dòng)調(diào)用,像魔術(shù)方法一樣;
1、同步和異步的概念:
同步:發(fā)出請(qǐng)求得到響應(yīng)放回?cái)?shù)據(jù),才可以發(fā)送另一個(gè)
異步:發(fā)出請(qǐng)求,不需要得到響應(yīng)回復(fù)就可以發(fā)出另一個(gè)請(qǐng)求,(回調(diào)函數(shù));
2、XMLHttpRequest基本流程(兩種形式GET和POST):
(1)、請(qǐng)求的進(jìn)本流程(GET)
創(chuàng)建請(qǐng)求對(duì)象:xhr=new XMLHttpRequest();
監(jiān)聽(tīng)請(qǐng)求回調(diào):xhr.onreadystatechange=function(){};
設(shè)置請(qǐng)求參數(shù):xhr.open(請(qǐng)求類型,請(qǐng)求url,是否異步)(默認(rèn)true,異步)
發(fā)送請(qǐng)求:xhr.send(null)
(2)、請(qǐng)求的基本流程(POST)
創(chuàng)建請(qǐng)求對(duì)象:xhr=new XMLHttpRequest();
監(jiān)聽(tīng)請(qǐng)求回調(diào):xhr.onreadystatechange=function(){};
設(shè)置請(qǐng)求頭:xhr.open(請(qǐng)求類型,請(qǐng)求url,是否異步):默認(rèn)true,異步
設(shè)置請(qǐng)求頭:xhr.setRequestHeader()
準(zhǔn)備請(qǐng)求的數(shù)據(jù):var data={……}
發(fā)送請(qǐng)求:xhr.send(data);可以添加鍵值對(duì)形式返回:send(‘user=’+data);
3、監(jiān)聽(tīng)事件:onreadystatechange(在xhr監(jiān)聽(tīng)對(duì)象中,xhr可以用this代替)
reponseText:返回ajax請(qǐng)求文本
reponseXML:返回的html/xml;
readyState===4:標(biāo)識(shí)Ajax請(qǐng)求狀態(tài)(4代表成功)
status:返回?cái)?shù)據(jù)(200代表OK)
4、發(fā)送數(shù)據(jù)的兩種格式在請(qǐng)求頭中設(shè)置:
xhr.setRequestHeader('content-type','applicaton/x-www-form-urlencoded')表單數(shù)據(jù)形式
xhr.setRequestHeader('content-type','applicaton/json;charset=utf-8')json數(shù)據(jù)形式
在Ajax中POST形式中還有一種默認(rèn)表單數(shù)據(jù)發(fā)送形式(不需要設(shè)置請(qǐng)求頭):FormData();
var data=new FormData();
data.append(key,value);
xhr.send(data);
5、附加知識(shí)點(diǎn):setTimeout(函數(shù)、time)
方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。onsubmit="return false"
禁用表單提交事件;
6、獲取Ajax發(fā)送的數(shù)據(jù):以GET形式發(fā)送的數(shù)據(jù):$_GET
以POST形式發(fā)送的數(shù):$_POST
數(shù)據(jù)格式如果是JSON格式,則以file_get_contents(‘php://input’)獲取,其他都已$_POST獲取;
Ajax請(qǐng)求返回的響應(yīng)一般是responseText
文本格式,所以服務(wù)端接受Ajax默認(rèn)返回?cái)?shù)據(jù)轉(zhuǎn)化成JSON格式返回;
1.Ajax請(qǐng)求GET形式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<span>服務(wù)器成功調(diào)用</span>
</body>
<script>
// 創(chuàng)建請(qǐng)求對(duì)象
var xhr = new XMLHttpRequest();
//創(chuàng)建回調(diào)監(jiān)聽(tīng)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
var h2 = document.createElement("h2");
h2.innerHTML = xhr.responseText;
document.body.appendChild(h2);
}
};
xhr.open("GET", "test.php", true);
xhr.send(null);
</script>
</html>
運(yùn)行結(jié)果
2.Ajax請(qǐng)求POST形式(json格式):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ajax,演練POST</title>
</head>
<body>
<script>
// new一個(gè)XMLHttpRequest對(duì)象
var xhr = new XMLHttpRequest();
//監(jiān)聽(tīng)事件操作
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
// console.log(data);
var name = document.createElement("span");
name.innerText = "用戶名:" + data.username;
document.body.append(name);
var pass = document.createElement("span");
pass.innerText = "密 碼:" + data.password;
document.body.append(pass);
}
};
//初始化請(qǐng)求參數(shù)
xhr.open("POST", "test3.php", true);
//設(shè)置請(qǐng)求頭
xhr.setRequestHeader("content-type", "application/json;charset=utf-8");
//準(zhǔn)備請(qǐng)求數(shù)據(jù)
var user = {
username: "ldy",
password: "123456",
};
//發(fā)送數(shù)據(jù)
xhr.send(JSON.stringify(user));
</script>
</body>
</html>
代碼演示結(jié)果:
3.Ajax請(qǐng)求POST形式(FormData對(duì)象):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ajax,演練POST</title>
<style></style>
</head>
<body>
<h1>用戶信息</h1>
<table aglin="center" cellpadding="3" cellspacing="0" border="2" }>
<tr>
<th>賬戶</th>
<th>密碼</th>
</tr>
</table>
<script>
// new一個(gè)XMLHttpRequest對(duì)象
var xhr = new XMLHttpRequest();
//監(jiān)聽(tīng)事件操作
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var user = xhr.responseText;
var userdata = JSON.parse(user);
console.log(userdata.name);
var name = document.createElement("tr");
name.innerHTML =
"<td>" + userdata.name + "</td><td>" + userdata.ps + "</td>";
document.body.getElementsByTagName("table").item(0).append(name);
}
};
//初始化請(qǐng)求參數(shù)
xhr.open("POST", "test2.php", true);
//省略設(shè)置請(qǐng)求頭
// xhr.setRequestHeader("content-type", "application/json;charset=utf-8");
//準(zhǔn)備請(qǐng)求數(shù)據(jù)
var data = new FormData();
data.append("name", "ldy@qq.com");
data.append("ps", "123456");
//發(fā)送數(shù)據(jù)
xhr.send(data);
</script>
</body>
</html>
演示結(jié)果
4.案例代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用戶注冊(cè)</title>
<style>
* {
margin: 0;
padding: 0;
}
h2 {
/* display: block; */
width: 350px;
margin: 0 auto;
text-align: center;
padding-top: 10px;
box-sizing: border-box;
}
form {
margin: 10px auto;
width: 350px;
height: 250px;
background-color: #5384e8;
display: flex;
flex-flow: column nowrap;
justify-content: space-evenly;
align-content: center;
align-items: center;
font-size: 1.2rem;
}
form:hover {
box-shadow: 0 0 5px #626262;
}
form>.button {
width: 280px;
display: flex;
justify-content: space-evenly;
}
form>.button>input {
width: 100px;
height: 30px;
background-color: #00bb00;
border: none;
border-radius: 15px;
}
form>.button>input:hover {
background-color: red;
color: white;
}
a {
color: white;
text-decoration: none;
}
</style>
</head>
<body>
<h2>用戶注冊(cè)</h2>
<form method="POST" onsubmit="return false">
<div class='account'>
<label for="username">賬戶:</label>
<input type="email" required name="username" id="username" placeholder="example@163.com">
</div>
<div class='pwd'>
<label for="p2">密碼:</label>
<input type="password" required name="p2" id="p2" placeholder="不少于六位">
</div>
<div class="button">
<input type="submit" value="登陸">
<input type="reset" value="重置">
</div>
<div>
<a href="regist.php">沒(méi)有賬號(hào),點(diǎn)擊此處注冊(cè)!</a>
</div>
</form>
</body>
<script>
var form = document.querySelector('form');
var btn = document.querySelector('.button>:first-child');
btn.onclick = function() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var res;
res = JSON.parse(xhr.responseText);
var span = document.createElement('span');
span.innerText = res.messages;
form.append(span);
}
}
xhr.open("POST", "log.php", true);
var user = new FormData(form);
xhr.send(user);
}
</script>
</html>
運(yùn)行結(jié)果圖:
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)