ajax
它是浏览器提供的一套方法,可以实现无刷新更新数据,提高用户浏览网站应用的体验;
应用场景
- 页面上拉加载更多数据;
- 列表数据无刷新分页;
- 表单项离开焦点数据验证;
- 搜索框提示文字下拉列表;
运行环境
ajax技术需要运行在网站环境中才能生效;
ajax实现步骤
服务器端响应的数据格式
<body>
<script>
//1.创建ajax对象
var xhr = new XMLHttpRequest();
//2.告诉ajax对象要向哪发送请求,以什么方式发送请求
// 1)请求方式 2)请求地址
xhr.open('get','http://localhost:3000/responseData');
//3.发送请求
xhr.send();
//不能直接接收服务端响应的文件
//4.获取服务器端响应到客户端的数据
xhr.onload = function(){
// console.log(xhr.responseText);
//返回string
// console.log(typeof xhr.responseText);
//将JSON字符串转换成JSON对象
var responseText = JSON.parse(xhr.responseText);
console.log(responseText);
var str = '<h2>'+responseText.name+'</h2>';
document.body.innerHTML = str;
}
</script>
</body>
请求参数传递
<body>
<p>
<input type="text" name="" class="username">
</p>
<p>
<input type="text" name="" class="age">
</p>
<p>
<input type="button" name="" value="提交" class="btn">
</p>
<script>
var btn = document.querySelector('.btn');
var username = document.querySelector('.username');
var age = document.querySelector('.age');
btn.addEventListener('click',function(){
//创建ajax对象
var xhr = new XMLHttpRequest();
//获取用户在文本框中输入的值
var nameval = username.value;
var ageval = age.value;
// alert(nameval);
// alert(ageval);
//拼接字符串
var params = 'username='+nameval+'&age='+ageval;
//配置ajax对象
xhr.open('get','http://localhost:3000/get?'+params);
//发送请求
xhr.send();
//获取服务器端响应的数据
xhr.onload = function(){
console.log(xhr.responseText);
}
})
</script>
</body>
app.get('/get',(req,res) =>{
res.send(req.query);
})
<script>
var btn = document.querySelector('.btn');
var username = document.querySelector('.username');
var age = document.querySelector('.age');
btn.addEventListener('click',function(){
//创建ajax对象
var xhr = new XMLHttpRequest();
//获取用户在文本框中输入的值
var nameval = username.value;
var ageval = age.value;
// alert(nameval);
// alert(ageval);
//拼接字符串
var params = 'username='+nameval+'&age='+ageval;
//配置ajax对象
xhr.open('post','http://localhost:3000/post');
//设置请求参数格式的类型(post请求必须要设置)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//发送请求
xhr.send(params);
//获取服务器端响应的数据
xhr.onload = function(){
console.log(xhr.responseText);
}
});
</script>
get请求和传统网站的表单提交不能提交json对象数据格式
<script>
//1.创建ajax对象
var xhr = new XMLHttpRequest();
//2.告诉ajax对象要向哪发送请求,以什么方式发送请求
// 1)请求方式 2)请求地址
xhr.open('post','http://localhost:3000/json');
//通过请求头告诉服务器端客户端向服务器端传递的请求参数的格式是什么
xhr.setRequestHeader('Content-Type','application/json');
//JSON.stringify 将json对象转换为json字符串
//3.发送请求
xhr.send(JSON.stringify({name:'victor',age:22}));
//不能直接接收服务端响应的文件
//4.获取服务器端响应到客户端的数据
xhr.onload = function(){
console.log(xhr.responseText);
}
</script>
<script>
var xhr = new XMLHttpRequest();
//0 已经创建了ajax对象 但是还没有对ajax对象进行配置
console.log(xhr.readyState);
xhr.open('get','http://localhost:3000/readyState');
//1 已经对ajax进行配置 但是还没有发送请求
console.log(xhr.readyState);
//当ajax状态码发生改变的时候触发
xhr.onreadystatechange = function(){
//2 请求已经发送
//3 已经接收到服务端的部分数据
//4 服务器端的响应数据已经接收完成
console.log(xhr.readyState);
//对ajax状态码进行判断
//如果状态码的值为4就代表已经接收完成
if(xhr.readyState == 4){
console.log(xhr.responseText);
}
}
//发送
xhr.send();
</script>
<body>
<button class="button">发送ajax请求</button>
<script>
var btn = document.querySelector('.button');
btn.addEventListener('click',function(){
//1.创建ajax对象
var xhr = new XMLHttpRequest();
xhr.open('get','http://localhost:3000/error');
xhr.send();
xhr.onload = function(){
//xhr.status 获取http状态码
console.log(xhr.responseText);
if(xhr.status == 400){alert('请求出错');}
}
xhr.onerror = function(){
alert('网络中断,hxd');
}
});
</script>
</body>
app.get('/error',(req,res) =>{
//不存在的变量 返回500
// console.log(abc);
res.status(400).send('not found');
})
AJAX状态码:表示ajax请求的过程状态,ajax对象返回的
Http状态码:表示请求处理的结果,是服务器端返回的
解决方案:
在请求地址的后面添加请求参数,保证每一次请求中的请求参数的值都不相同;
<script>
function ajax(options){
//默认值存储
var defaults = {
type: 'get',
url: '',
data: {},
header:{
'Content-Type':'application/x-www-form-urlencoded'
},
success:function(){},
error:function(){}
};
//使用options中的屬性覆蓋defaults中的屬性值
Object.assign(defaults,options);
//创建ajax对象
var xhr = new XMLHttpRequest();
//拼接请求参数的变量
var params = '';
//循环用户传递进来的对象格式参数
for(var attr in defaults.data){
params +=attr + '=' + defaults.data[attr] + '&';
}
params = params.substr(0,params.length-1);
if(defaults.type == 'get'){
defaults.url = defaults.url + '?' + params;
}
//配置ajax对象
xhr.open(defaults.type,defaults.url);
if(defaults.type == 'post'){
//用户希望向服务器传递的请求参数的类型
var contentType = defaults.header['Content-Type'];
xhr.setRequestHeader('Content-Type',contentType);
if(contentType == 'application/json'){
xhr.send(JSON.stringify(defaults.data));
}else{
xhr.send(params);
}
}else{
xhr.send();
}
//监听onload事件
xhr.onload = function(){
// xhr.getResponseHeader()
//获取响应头中的数据
var contentType = xhr.getResponseHeader('Content-Type');
//
var responseText = xhr.responseText;
if(contentType.includes('application/json')){
responseText = JSON.parse(responseText);
}
// console.log(xhr.responseText);
//当http状态码等于200的时候
if(xhr.status == 200){
//请求成功,调用成功 调用处理成功情况的函数
defaults.success(responseText,xhr);
}else{
//请求失败,调用成功 调用处理失败情况的函数
defaults.error(responseText,xhr);
}
}
}
ajax({
//请求方式
type:'post',
//请求地址
url:'http://localhost:3000/responseData',
// data: {
// name: 'lizeyan',
// age: 22,
// },
// header:{
// 'Content-Type':'application/json'
// },
success: function(data){
console.log('this is success function ');
console.log(data);
},
// error: function(data){
// console.log('this is error function '+data);
// }
});
</script>
模板引擎
<!-- 1. 将模板引擎的库文件引入到当前页面 -->
<script src="./js/template-web.js"></script>
<div id="container"></div>
<!-- 2. 准备art-template模板 -->
<script type="text/html" id="tpl">
<h1>{{username}} {{age}}</h1>
</script>
<script>
// 3. 告诉模板引擎将那个数据和那个模板进行拼接
// 1)模板id 2)数据 对象类型
//方法返回值就是拼接好的html字符串
var html = template('tpl',{username:'lizeyan',age:30});
document.querySelector('#container').innerHTML = html;
</script>
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201019201449537.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQyNjIxNg==,size_16,color_FFFFFF,t_70#pic_left
<body>
<button id="btn">点我触发事件</button>
<button id="btn2">点我是否覆盖</button>
<!-- <script>
function fn2(data){
console.log('客户端fn函数被调用了');
console.log(data);
}
</script> -->
<script>
var btn = document.getElementById('btn');
var btn2 = document.getElementById('btn2');
btn.addEventListener('click',function(){
jsonp({
url:'http://localhost:3001/better',
success:function(data){
console.log('卢本伟牛逼');
console.log(data);
}
});
});
btn2.addEventListener('click',function(){
jsonp({
url:'http://localhost:3001/better',
data:{
name:'Mr.Victor',
sex:'male'
},
success:function(data){
console.log('卢本伟捞逼');
console.log(data);
}
})
})
function jsonp(options){
//动态创建script标签
var script = document.createElement('script');
//拼接字符串
var params = '';
for(var attr in options.data){
params += '&' + attr + '=' + options.data[attr];
}
//随机名字
var fnName = 'myJsonp' + Math.random().toString().replace('.','');
//挂载到全局中
window[fnName] = options.success;
//添加src属性
script.src = options.url + '?callback=' + fnName + params;
//追加到页面上
document.body.appendChild(script);
//为script添加onload事件
script.onload = function(){
document.body.removeChild(script);
}
}
</script>
</body>
<button class="btn">点我</button>
<script src="./js/ajax.js"></script>
<script>
var btn = document.querySelector('.btn');
btn.addEventListener('click',function(){
ajax({
type:'get',
url:'http://localhost:3001/cross',
success:function(data){
console.log(data);
}
});
});
</script>
app.use((req,res,next) =>{
//1. 允许哪些客户端访问我
//* 代表全部都能访问
res.header('Access-Control-Allow-Origin','*');
//2. 允许客户端使用哪些请求方法访问我
res.header('Access-Control-Allow-Methods','get,post');
next();
})
app.get('/server',(req,res) =>{
request('http:localhost:3001/cross',(err,response,body) =>{
res.send(body);
})
})
cookie是实现服务器端和客户端身份识别的技术
app.use((req,res,next) =>{
//1. 允许哪些客户端访问我
//* 代表全部都能访问
res.header('Access-Control-Allow-Origin','*');
//2. 允许客户端使用哪些请求方法访问我
res.header('Access-Control-Allow-Methods','get,post');
// 允许客户端发送跨域请求时携带cookie信息
res.header('Access-Control-Allow-Credentials', true);
next();
})
app.post('/login', (req, res) => {
// 创建表单解析对象
var form = formidable.IncomingForm();
// 解析表单
form.parse(req, (err, fields, file) => {
// 接收客户端传递过来的用户名和密码
const { username, password } = fields;
// 用户名密码比对
if (username == 'itheima' && password == '123456') {
// 设置session
req.session.isLogin = true;
res.send({message: '登录成功'});
} else {
res.send({message: '登录失败, 用户名或密码错误'});
}
})
});
app.get('/checkLogin', (req, res) => {
// 判断用户是否处于登录状态
if (req.session.isLogin) {
res.send({message: '处于登录状态'})
} else {
res.send({message: '处于未登录状态'})
}
});
loginBtn.onclick = function () {
// 将html表单转换为formData表单对象
var formData = new FormData(loginForm);
// 创建ajax对象
var xhr = new XMLHttpRequest();
// 对ajax对象进行配置
xhr.open('post', 'http://localhost:3001/login');
// 当发送跨域请求时,携带cookie信息
xhr.withCredentials = true;
// 发送请求并传递请求参数
xhr.send(formData);
// 监听服务器端给予的响应内容
xhr.onload = function () {
console.log(xhr.responseText);
}
}
// 当检测用户状态按钮被点击时
checkLogin.onclick = function () {
// 创建ajax对象
var xhr = new XMLHttpRequest();
// 对ajax对象进行配置
xhr.open('get', 'http://localhost:3001/checkLogin');
// 当发送跨域请求时,携带cookie信息
xhr.withCredentials = true;
// 发送请求并传递请求参数
xhr.send();
// 监听服务器端给予的响应内容
xhr.onload = function () {
console.log(xhr.responseText);
}
}
<body>
<button id="btn">发送请求</button>
<script src="./js/jquery-3.5.1.min.js"></script>
<script>
$('#btn').on('click',function(){
$.ajax({
type:'get',
url:'/base',
success:function(response){
//response为服务器端返回的数据
//方法内部会自动将json字符串转换为json对象
console.log(response);
},
error:function(xhr){
console.log(xhr);
}
});
});
</script>
</body>
<script>
var params = {name:'xiaolizi',sex:'male'};
$('#btn').on('click',function(){
$.ajax({
type:'post',
// url:'/base',
url:'/user',
beforeSend:function(){
alert('请求即将发送');
// return false;
},
//自动转换成字符串类型 name=xiaolizi&age=22
// data:{
// name:'xioalizi',
// age:22
// },
data:JSON.stringify(params),
contentType:'application/json',
success:function(response){
//response为服务器端返回的数据
//方法内部会自动将json字符串转换为json对象
console.log(response);
},
error:function(xhr){
console.log(xhr);
}
});
});
</script>
<script>
$('#form').on('submit',function(){
//将表单内容拼接成字符串类型
// var params = $('#form').serialize();
serializeObject($(this));
});
function serializeObject(obj){
var result = {};
var params = obj.serializeArray();
$.each(params,function(index,value){
result[value.name] = value.value;
});
return result;
}
</script>
<script>
function fn(response){
console.log(response);
}
$('.btn').on('click',function(){
$.ajax({
url:'/jsonp',
//向服务器端传递函数名字的参数名称
jsonp:'cb',
//自定义函数
jsonpCallback:'fn',
//发送jsonp请求
dataType:'jsonp',
// success:function(response){
// console.log(response);
// }
});
});
</script>
app.get('/jsonp',(req,res) =>{
// res.jsonp({
// name:'tankunxin',
// age:22
// })
const cb = req.query.cb;
const data = cb + "({name:'tankunxin'})";
res.send(data);
})