AJAX-

本文详细介绍了AJAX的概念、XML和JSON的对比、JSON的eval函数及其在AJAX中的作用。阐述了AJAX的主要特点和异步请求对象XMLHttpRequest的使用,包括其方法和属性。同时,讲解了HTTP协议的基础知识,如请求报文和响应报文,以及AJAX请求的基本操作,如GET和POST请求,JSON数据的处理。此外,还讨论了跨域问题、同源策略和JSONP的工作原理,以及解决IE缓存、请求超时等问题的方法。

AJAX简介

AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML

是一种在无需重新加载整个网页的情况下,能够更新部分页面内容的新方法

通过ajax可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据

ajax不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式

XML简介

XML:可扩展标记语言。被设计用来传输和存储数据

XML和HTML类似,不同的是HTML中都是预定义标签,XML中没有预定义标签,全都是自定义标签,用来表示一些数据

比如:

现在有一个学生数据
name="孙悟空";age="18";sex="男";
用XML表示:
<student>
    <name>孙悟空</name>
    <age>18</age>
    <sex>男</sex>
</student>

现在已经被json取代

JSON

全称javascript object notation(javascript标记对象)

  • 是一种轻量级的数据交换格式

    轻量级:体现在json体积小

    数据交换:各种语言之间交换数据

  • 在js中json是以对象的形式存在的

    var student = {
        'name' = 'liu',
        'sex' = 'nan'
    }
    //这就是一个json对象
  • java的JDBC连接数据库查询数据,然后将数据拼接成json格式的字符串,将json格式的字符串传给js,然后在js当中把json格式的字符串转换成json对象,这样就可以从json对象中获取数据了,这样就完成了数据的交换

eval函数

可以将一个字符串当做一段js代码解释执行

eval('var i = 100');//相当于var i = 100;
console.log(i);//输出100

AJAX的特点

优点:

1)可以无需刷新页面而与服务器端进行通讯

2)允许你根据用户事件来更新部分页面内容

缺点:

1)没有浏览历史,不能回退

2)存在跨域问题(同源)

3)SEO不友好(搜索引擎)

异步请求对象(XMLHttpRequest)

在局部刷新中,使用异步请求对象,在浏览器内部发起请求,获取数据

 

异步对象是在浏览器内部的一种javascript对象。

语法:

var xhr = new XMLHttpRequest();

创建后就可以使用xhr对象的属性或者函数,进行异步对象操作

使用异步对象实现局部刷新,异步对象主要负责发起请求,传递请求参数,并从服务器接收数据

局部刷新需要使用的技术:

  1. javascript:创建XMLHttpRequest对象,调用它的属性或方法

  2. dom:处理dom,更新select的数据

  3. css:处理视图,更新,美化

  4. servlet:服务器端技术

  5. 数据格式:json

把这些技术综合的使用叫做ajax

异步对象的属性和方法

方法:

1)open(请求方式,服务器端的访问地址,布尔值)

请求方式:get、post

服务器端的访问地址:url

布尔值:决定异步还是同步,可以省略

如:xhr.open('get','loginServlet')

2)send()

使用异步对象发送请求

属性:

1)readyState:请求的状态。共有五个值:0、1、2、3、4

2)status:网络的属性,和http的状态码对应(200,404,500)

3)rasponseText:表示服务器端返回的数据

异步对象使用步骤

1)使用js创建异步对象

var xhr = new XMLHttpRequest();

2)给异步对象绑定事件。事件名称为onreadystatechange

xhr.onreadystatechange = function(){};

当readystate值发生变化时,执行函数

xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status >= 200 && xhr.status < 300){
        var data = xhr.responseText;
        document.getElementById('mydiv').innerHTML = data;
    };
};

3)初始请求的参数执行open()函数

xhr.open('get','loginServlet',true);

4)发送请求,执行send()函数

xhr.send();

HTTP协议

超文本传输协议,协议详细规定了浏览器和万维网服务器之间互相通信的规则

请求报文

  1. 请求行 method url GET /product_detail?id=2 POST /login

  2. 多个请求头 Host: www.baidu.com Cookie: BAIDUID=AD3B0FA706E; BIDUPSID=AD3B0FA706; Content-Type: application/x-www-form-urlencoded 或者application/json

  3. 请求体 username=tom&pwd=123 {"username": "tom", "pwd": 123}

HTTP 响应报文

  1. 响应状态行: status statusText

  2. 多个响应头 Content-Type: text/html;charset=utf-8 Set-Cookie: BD_CK_SAM=1;path=/

  3. 响应体 html 文本/json 文本/js/css/图片...

API总结

  • XMLHttpRequest():创建 XHR 对象的构造函数

  • status:响应状态码值,如 200、404

  • statusText:响应状态文本,如 ’ok‘、‘not found’

  • readyState:标识请求状态的只读属性 0-1-2-3-4

  • onreadystatechange:绑定 readyState 改变的监听

  • responseType:指定响应数据类型,如果是 ‘json’,得到响应后自动解析响应

  • response:响应体数据,类型取决于 responseType 的指定

  • timeout:指定请求超时时间,默认为 0 代表没有限制

  • ontimeout:绑定超时的监听

  • onerror:绑定请求网络错误的监听

  • open():初始化一个请求,参数为:(method, url[, async])

  • send(data):发送请求

  • abort():中断请求 (发出到返回之间)

  • getResponseHeader(name):获取指定名称的响应头值

  • getAllResponseHeaders():获取所有响应头组成的字符串

  • setRequestHeader(name, value):设置请求头

express

在vsc的资源管理器空白处右键——在集成终端打开——输入npm init --yes 初始化——输入npm i express

//新建一个js文件,进行如下操作
//1. 引入express
const { application } = require('express');
const express = require('express');

//2. 创建应用对象
const app = express();

//3.创建路由规则
//request是对请求报文的封装
//response是对响应报文的封装
app.get('/', (request, response) => {
    //设置响应头——设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    //响应体只能接收字符串
    response.send('hello');
});

//4.监听端口启动服务
app.listen(8000, () => {
    console.log('服务器,8000端口监听中....');
});
//5.右键文件选择在集成终端打开,输入node 文件名
//6.在网页输入127.0.0.1:8000就可以得到hello

上一个端口还在响应时不能运行下一个端口----关闭上一个端口,集成终端右上角选择node,ctrl+c关闭端口

AJAX请求的基本操作

get请求

<style>
    #result {
        width: 200px;
        height: 100px;
        border: 1px solid #90b;
    }
</style>

<body>
    <button>点击发送请求</button>
    <div id="result"></div>

    <script>
        //获取元素
        var btn = document.querySelector('button');
        var res = document.querySelector('#result');
        //绑定事件
        btn.onclick = function () {
            //创建对象
            var xhr = new XMLHttpRequest();
            //初始化  设置请求方法和url
            xhr.open('GET', 'http://127.0.0.1:8000/server');
            //发送
            xhr.send();
            //事件绑定 处理服务端返回的结果
            //onreadystatechange
            //on有when的意思,当···的时候
            //redystate 是xhr对象中的属性,表示状态,共有五种值
            //最开始为0——未初始化
            //1——open方法已经调用完毕
            //2——send方法已经调用完毕
            //3——服务端已经返回了部分结果
            //4——服务端已经返回了全部结果
            //change  改变
            xhr.onreadystatechange = function () {
                //判断-服务端返回了所有结果
                if (xhr.readyState === 4) {
                    //判断,响应状态码——200、404、403、401、500
                    //响应状态码中2开头的,都表示成功2xx
                    if (xhr.status >= 200 && xhr.status < 300) {
                        //处理结果.结果分为四部分——行,头,空行,体 
                        //响应行 
                        console.log(xhr.status);//状态码
                        console.log(xhr.statusText);//状态字符串 
                        //所有的响应头 
                        console.log(xhr.getAllResponseHeaders());
                        //响应体
                        console.log(xhr.response);
                        //设置result的文本 
                        res.innerHTML = xhr.response;
                    } else {

                    };
                };
            };
        };       
    </script>
</body>
//1. 引入express
const { application } = require('express');
const express = require('express');

//2. 创建应用对象
const app = express();

//3.创建路由规则
//request是对请求报文的封装
//response是对响应报文的封装
app.get('/server', (request, response) => {
    //设置响应头——设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    //设置响应体
    response.send('hello');
});

//4.监听端口启动服务
app.listen(8000, () => {
    console.log('服务器已经启动,8000端口监听中....');
});

设置请求参数

//在url后用?接参数,如: 
xhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200');
//如果需要传递多个参数,用&隔开

post请求

<style>
        #result {
            width: 200px;
            height: 100px;
            border: 1px solid skyblue;
        }
    </style>

<body>
    <div id="result"></div>
    <script>
        //获取元素
        var res = document.querySelector('#result');
        //绑定事件
        res.addEventListener('mouseover', function () {
            //创建对象
            var xhr = new XMLHttpRequest();
            //初始化 设置类型与url
            xhr.open('post', 'http://127.0.0.1:8000/server');
            //发送
            xhr.send();
            //事件绑定
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        res.innerHTML = xhr.response;
                    };
                };
            };
        });
    </script>
</body>
//1. 引入express
const { application } = require('express');
const express = require('express');

//2. 创建应用对象
const app = express();

//3.创建路由规则
//request是对请求报文的封装
//response是对响应报文的封装
app.get('/server', (request, response) => {
    //设置响应头——设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    //设置响应体
    response.send('hello');
});
app.post('/server', (request, response) => {
    //设置响应头——设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    //设置响应体
    response.send('hello');
});
//4.监听端口启动服务
app.listen(8000, () => {
    console.log('服务器已经启动,8000端口监听中....');
});

设置请求参数

//post方法在send中添加
xhr.send('a=100&b=200');
//里面的参数还可以设置为a:100b:200或1234567等

设置请求头

//在 xhr.open('post', 'http://127.0.0.1:8000/server');后添加一个参数
xhr.open('post', 'http://127.0.0.1:8000/server');
//设置请求头
xhr.setRequestHeader('Context-Type','application/x-www-form-urlencoded');
//Context-Type——设置请求体内容类型
//里面的参数可以自定义,但是会报错,解决方案:在app中添加一个参数
//将app.后的参数改为all,意为可以接收任意类型的请求
app.all('/server', (request, response) => {
    //设置响应头——设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    //添加的参数
    response.setHeader('Access-Control-Allow-Headers', '*');//意为所有类型的头信息都可以接收
    //设置响应体
    response.send('hello');
});

服务端响应json数据

app.all('/server', (request, response) => {
    //设置响应头——设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
	//响应一个数据
    var data = {
        name:'wo'
    };
    //将对象进行字符串转换
    var str = JSON.stringify(data);
    //设置响应体
    response.send('str');
});

自动转换

//在绑定事件中添加一组参数
xhr.responseType = 'json';
//事件绑定
 xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        res.innerHTML = xhr.response.name;//输出wo
                    };
                };
            };

手动转换

//事件绑定
 xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        var data = JSON.parse(xhr.response);
                        result.innerHTML = data.name;//输出wo
                    };
                };
            };

安装nodemon自动重启工具

文件内容有修改自动重新启动服务 nodemon - npm

安装

//在集成终端中输入
npm install -g nodemon

启动服务

ndoemon 文件名

安装nodemon: 1.不要停止监听,下拉另外打开一个终端powershell。2.用管理员身份打开powershell 输入:set-ExecutionPolicy RemoteSigned。3.停止监听,重新打开集成终端,输入nodemon 文件名

解决IE缓存问题

问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。 解决方式:浏览器的缓存是根据url 地址来记录的,所以我们只需要修改url 地址即可避免缓存问题

xhr.open("get","/http://127.0.0.1:8000/ie?t="+Date.now());

请求超时与网络异常处理

// 超时设置 (2秒)
xhr.timeout = 2000;
// 超时回调
xhr.ontimeout = function(){
    //如果2s内没有返回结果,则弹出
	alert('网络超时,请稍后重试')
}


// 网络异常回调
xhr.onerror = function(){
    //如果网络异常则弹出
	alert('网络异常,请稍后重试')
}

AJAX取消请求

// 手动取消
xhr.abort();

AJAX请求重复发送问题

<button>
    点击发送    
</button>
<script>
	var btn = document.querySelector('button');
    var xhr =null;
    var isSending = false;
    btn.onclick = function(){
        xhr = XMLHttpRequest();
        //判断表示变量
        if(isSending) x.abort;
        isSending = true;
        xhr.open('get','http://127.0.0.1:8000/delay');
        xhr.send();
        xhr.onreadystatechange = function(){
            if(xhr.redyState === 4){
                isSending = false;
            }
        }
    }
</script>

jQuery发送AJAX请求

百度搜索bootcdn,搜索jQuery,点击jQuery复制<script>标签,引入

get请求

$.get(url, [data], [callback], [type])
  • url:请求的URL 地址

  • data:请求携带的参数

  • callback:载入成功时回调函数

  • type:设置返回内容格式,xml, html, script, json, text, _default

post请求

$.post(url, [data], [callback], [type])
  • url:请求的URL 地址

  • data:请求携带的参数

  • callback:载入成功时回调函数

  • type:设置返回内容格式,xml, html, script, json, text, _default

$.post('https://127.0.0.1:8000/server',{a:100,b:200},function(data){
    
)};

通用方法

$.ajax({
	// url
	url: 'http://127.0.0.1:8000/jquery-server',
	// 参数
	data: {a:100, b:200},
	// 请求类型
	type: 'GET',
	// 响应体结果
	dataType: 'json',
	// 成功的回调
	success: function(data){console.log(data);},
	// 超时时间
	timeout: 2000,
	// 失败的回调
	error: function(){console.log('出错拉~');},
	// 头信息
	headers: {
		c: 300,
		d: 400
	}	
})

同源策略

  • 同源策略(Same-Origin Policy)最早由Netscape 公司提出,是浏览器的一种安全策略

  • 同源: 协议、域名、端口号必须完全相同

  • 跨域: 违背同源策略就是跨域

如何解决跨域

jsonp

JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来,只支持get 请求。

jsonp是怎么工作的

在网页有一些标签天生具有跨域能力,比如:img link iframe script。JSONP 就是利用script 标签的跨域能力来发送请求的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值