Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:
序号 | 类型 | 描述 |
---|---|---|
1 | 简单值 | 数值、字符串、布尔、null |
2 | 复合值 | 对象、数组 |
注意:不支持
undefined
(因为除了 JS 外,其他语言中没有这个undefined
定义)
序号 | 方法 | 描述 |
---|---|---|
1 | JSON.stringify() |
将 JS 对象,序列化为 JSON 字符串 |
2 | JSON.parse() |
将 JSON 字符串,解析为 JS 对象 |
data:JS数据(数组、对象都行);replacer:处理的方式(数组、函数都行);space:限定输出的格式;转为的json数据都是string类型
console.log(JSON.stringify(3.14),typeof JSON.stringify(3.14));//3.14 string
console.log(JSON.stringify("php.cn"),typeof JSON.stringify("php.cn"));//"php.cn" string
console.log(JSON.stringify(true),typeof JSON.stringify(true));//"php.cn" string
console.log(JSON.stringify(null),typeof JSON.stringify(null));//"php.cn" string
console.log(JSON.stringify({x:"a",y:"b"}),typeof JSON.stringify({x:"a",y:"b"}));//{"x":"a","y":"b"} string
console.log(JSON.stringify([1,2,3]),typeof JSON.stringify([1,2,3]));//[1,2,3] string
//>注意:json对象的属性必须加双引号,字符串也是
// 对JSON格式字符串的特殊操作,主要通过第二个参数;第二个参数支持数组和函数
// 数组
console.log(JSON.stringify({a:1,b:2,c:3},["a","b"]));//{"a":1,"b":2} 过滤数据,只要属性是a和b的
// 函数
console.log(JSON.stringify({a:1,b:2,c:3},(k,v)=>{
//将需要过滤的数据直接返回undefined
if(v<2) return undefined;
return v;
}));//{"b":2,"c":3} 过滤数据,只要值小于2的
// 第三个参数用来格式化输出JSON字符串
console.log(JSON.stringify({a:1,b:2,c:3},null,2));//在每组数据前加两个空格
console.log(JSON.stringify({a:1,b:2,c:3},null,"---"));//使用字符串的话则用对应字符串进行标识
let obj=JSON.parse(`{"a":1,"b":2,"c":3}`);
console.log(obj,typeof obj);//Object { a: 1, b: 2, c: 3 } object
// reviver可以对json数据进行处理后再返回
obj=JSON.parse(`{"a":1,"b":2,"c":3}`,(k,v)=>{
// json对象是由内向外解析的
if(k==="") return v;
return v*2;
});//{ a: 2, b: 4, c: 6 }
注意:异步请求不要使用 vs code 的 live server 插件,必须创建一个本地服务器环境
以前端请求后,后端响应为例
XMLHttpRequest
对象XMLHttpRequest
是浏览器对象,而非 JS 内置对象
const xhr=new XMLHttpRequest();
xhr.open(type,url);
xhr.onload=(...)=>{...};
xhr.send(...);
序号 | 方法 | 描述 |
---|---|---|
1 | responseType | 设置响应类型 |
2 | response | 响应正文 |
序号 | 方法 | 描述 |
---|---|---|
1 | open(type,url) | 配置请求参数 |
2 | send(data/null) | 发送请求 |
序号 | 事件 | 描述 |
---|---|---|
1 | load() | 请求成功 |
2 | error() | 请求失败 |
https://developer.mozilla.org/zh-CN/docs/Web/API/xmlhttprequest
FormData
对象FormData
是表单数据构造器
|序号|方法|描述|
|—-|——|——|
|1|append(name,value)|请求成功|
|2|delete(name)|请求失败|
get/post
区别request body
请求体传参request body
,post 也可以带上 URL 参数header,data
一起发出,服务器响应 200 成功header
,得到响应 100 continue,在发出data
,得到响应 200cors-post
时,需要在服务器端进行头部设置
<button>ajax-get</button>
<p></p>
const btn=document.querySelector("button");
btn.onclick=()=>{
// 1.创建 xhr 对象:
const xhr=new XMLHttpRequest();
// 2.配置 xhr 参数:
xhr.open('get',"test.php?id=1");
xhr.responseType='json';//默认,可不写
// 3.处理 xhr 响应:
// 成功
xhr.onload=()=>{
console.log(xhr.response);
//dom将响应结果渲染到页面
let user=`${xhr.response.name}的邮箱:${xhr.response.email}`;
document.querySelector("p").innerHTML=user;
};
// 失败
xhr.error=()=>console.log("Error");
// 4.发送 xhr 请求:
xhr.send(null);
}
// 以二维数组模拟数据表信息
$users = [
['id'=>1, 'name'=>'天蓬','email'=>'tp@php.cn','password' => md5('123456')],
['id'=>2, 'name'=>'灭绝','email'=>'mj@php.cn','password' => md5('abc123')],
['id'=>3, 'name'=>'西门','email'=>'xm@php.cn','password' => md5('abc888')],
];
// 查询条件
$id = $_GET['id'];
// 在id组成的数组中查询是否存在指定的id,并返回对应的键名
$key = array_search($id,array_column($users,'id'));
// 根据键名返回指定的用户信息
echo json_encode($users[$key]);
.login {
width: 20em;
border: 1px solid;
padding: 0 1em 1em;
background-color: lightcyan;
margin: 2em auto;
display: grid;
place-items: center;
}
.login form {
display: grid;
grid-template-columns: 3em 1fr;
gap: 1em 0;
}
/* 按钮与提示信息显示在第二列 */
.login form button,
.tips {
grid-area: auto / 2;
}
<div class="login">
<h3>用户登录</h3>
<form action="">
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" />
<label for="password">密码:</label>
<input type="password" name="password" id="password" />
<button>提交</button>
<span class="tips"></span>
</form>
</div>
const form=document.querySelector(".login form");
const btn=document.querySelector(".login button");
const tips =document.querySelector(".tips");
btn.onclick=(ev)=>{
// 要先禁用掉默认提交
ev.preventDefault();//或者在form里添加` onsubmit="return false"`
// 1.创建xhr对象
const xhr=new XMLHttpRequest();
// 2.设置xhr参数
xhr.open("post","test2.php");
// 3.处理xhr响应
xhr.onload=()=>(tips.innerHTML=xhr.response);
// 4.发送xhr请求
xhr.send(new FormData(form));
}
// 使用二维数组模拟用户数据表信息
$users = [
['id' => 1, 'name' => '天蓬', 'email' => 'tp@php.cn', 'password' => md5('123456')],
['id' => 2, 'name' => '灭绝', 'email' => 'mj@php.cn', 'password' => md5('abc123')],
['id' => 3, 'name' => '西门', 'email' => 'xm@php.cn', 'password' => md5('abc888')],
];
// 将通过post获取的数据保存到临时变量中
$email = $_POST['email'];
$password = md5($_POST['password']);
// 使用数组过滤器查询是否存在指定的用户并返回结果
$res = array_filter($users, function ($user) use ($email, $password) {
return $user['email'] === $email && $user['password'] === $password;
});
// 将结果做为请求响应返回到前端
echo count($res) === 1 ? '验证成功' : '验证失败';
同源策略:为请求的安全,浏览器禁止通过脚本发起跨域请求;只允许通过脚本发起基于同源(协议相同、域名/主机名相同、端口相同)的请求
HTML
<button>ajax-get-cors</button>
<p></p>
JS
const btn=document.querySelector("button");
const p=document.querySelector("p");
btn.onclick=()=>{
// 1.创建xhr对象
const xhr=new XMLHttpRequest();
// 2.配置xhr参数
xhr.open("get","http://word.cn/index.php");
// 3.处理xhr响应
xhr.onload=()=>(document.querySelector("p").innerHTML=xhr.response);
// 4.发送xhr请求
xhr.send(null);
}
PHP
//在服务器端开启跨域许可;*表示许可任何来源
header("Access-Control-Allow-Origin:http://php.cn");
echo "CORS:跨域请求成功!";
4.4 cors:跨域资源共享(post方式)
HTML
<button>ajax-post-cors</button>
<p></p>
JS
const btn=document.querySelector("button");
const p=document.querySelector("p");
btn.onclick=()=>{
// 1.创建xhr对象
const xhr=new XMLHttpRequest();
// 2.配置xhr参数
xhr.open("post","http://word.cn/index2.php");
// 3.处理xhr响应
xhr.onload=()=>(document.querySelector("p").innerHTML=xhr.response);
// 4.发送xhr请求
const formData=new FormData();
formData.append("username","Jy");
formData.append("password","abc123");
xhr.send(formData);
}
PHP
//在服务器端开启跨域许可;*表示许可任何来源
header("Access-Control-Allow-Origin:http://php.cn");
print_r($_POST);
<button>jsonp-cors</button>
<p></p>
function getUser(data){
console.log(data);
let user=data.name+":"+data.email;
document.querySelector("p").innerHTML=user;
}
//从前端将这个前端需要调用的函数名称告诉服务器上的php,让php动态生成一个函数调用语句并返回
const btn=document.querySelector("button");
btn.onclick=()=>{
// 1.动态生成一个允许跨域请求的html元素
let script = document.createElement("script");
// 2.将跨域请求的url调价到这个script的src属性上
script.src="http://word.cn/jsonp.php?callback=getUser";
// 3.将script挂在到这个页面中 document.body.insertBefore(script,document.body.firstElementChild);//挂在到body第一个元素之前
}
// jsonp不需要授权给前端
// 只要返回一个使用json作为参数的函数调用语句就可以
// 将前端需要的数据以json格式放到这个函数中
// 必须要知道前端js要调用的函数名称
$callback = $_GET['callback'];
//从服务器返回需要的数据
$data = '{"name":"景云","email":"jy@php.cn"}';
// 格式为 getUser({"name":"景云","email":"jy@php.cn"});
// 进行拼接e
echo $callback . "(" . $data . ")";