什么是AJAX?如何实现AJAX异步请求?

ajax

全名 async javascript and XML(异步JavaScript和XML)

是前后台交互的能⼒ 也就是我们客户端给服务端发送消息的⼯具,以及接受响应的⼯具

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。

是⼀个 默认异步执⾏机制的功能,AJAX分为同步(async = false)和异步(async = true)

1.什么是同步请求?(false)

同步请求是指当前发出请求后,浏览器什么都不能做,
 必须得等到请求完成返回数据之后,才会执行后续的代码,
 相当于生活中的排队,必须等待前一个人完成自己的事物,后一个人才能接着办。
 也就是说,当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面处于一个假死状态,
 当这个AJAX执行完毕后才会继续运行其他代码页面解除假死状态

2.什么是异步请求?(默认:true)

默认异步:异步请求就当发出请求的同时,浏览器可以继续做任何事,
Ajax发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。
一般默认值为true,异步。异步请求可以完全不影响用户的体验效果,
无论请求的时间长或者短,用户都在专心的操作页面的其他内容,并不会有等待的感觉。

3.ajax有什么优势

  • 不需要插件的⽀持,原⽣ js 就可以使⽤
  • ⽤户体验好(不需要刷新⻚⾯就可以更新数据)
  • 减轻服务端和带宽的负担
  • 缺点:搜索引擎的⽀持度不够,因为数据都不在⻚⾯上,搜索引擎搜索不到

4.ajax的运行流程
在这里插入图片描述

首先通过PHP页面将数据库中的数据取出

取出后转成json格式的字符串,后利用ajax把字符串返还给前台

再利用json.parse解析通过循环添加到页面上

那么反之,前端的数据可以利用ajax提交到后台

但是后台是没有办法直接把这些数据插入到数据库中,所以要先提交到PHP页面上

最后再由PHP将数据插入到数据库中

HTTP

请求报文

行:POST / URL
头:Host:
	Cookie:
	Coutent-type:
	User-Agent:
空行
体:username=admin&password=admin

响应报文

行:HTTP/1.1
头:content-Type:
	COntent-length:
	Content-encoding:
空行
体:

express基本使用

/`/1.引入express
const express = require('express')

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

//3.创建路由规则
app.get('/',(request,response)=>{
    response.send('hello')
})

//4.监听端口启动服务
app.listen(8080,()=>{
    console.log('服务已启动,8020端口监听中')
})`

请求响应

(要人为的在响应头里加属性:name):

   <script>
            const result = document.getElementById('result')
            result.addEventListener("mouseover",function(){
             //创建对象
            const xhr = new XMLHttpRequest()
            //初始化
            xhr.open('POST','http:/127.0.0.1:8080/server')
            //设置请求头  设置类型:Content-Type
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
            // xhr.setRequestHeader('name','hello')
            //发送
            xhr.send('a=100')
            //事件绑定 处理服务端返回的结果
            //readystate 是xhr对象中的属性,表示状态01234
            xhr.onreadystatechange = function(){
             //判断响应状态码 200 404 403 401 500,2开头的都表示成功
                if(xhr.readyState === 4){
                //处理结果 行 头 空行 体
                    if(xhr.status >=200 && xhr.status<300){
                        result.innerHTML = xhr.response
                    }
                }
            }
        })
            
        </script>
        
        
        //all表示可以接收所有类型的请求
        app.all('/server',(request,response)=>{
        //设置响应头,设置允许跨域
        response.setHeader('Access-Control-Allow-Origin','*')
        //设置响应头,打开权限
        response.setHeader('Access-Control-Allow-Headers','*')
        response.send('Hadadad')
    })

json对象转化数据:

  1.手动转化:
     window.onkeydown = function(){
                const result = document.getElementById('result')
                const xhr = new XMLHttpRequest()
                xhr.open('get','http:/127.0.0.1:8080/server-json')
                xhr.send()
                xhr.onreadystatechange = function(){
                    if(xhr.readyState ===4){
                        if(xhr.status >=200 && xhr.status < 300){
                            console.log(xhr.response)
                            result.innerHTML = xhr.response
                            let data = JSON.parse(xhr.response)
                        }
                    }
                }
            }
     
     app.all('/server-json',(request,response)=>{
        //设置响应头,设置允许跨域
        response.setHeader('Access-Control-Allow-Origin','*')
        //设置响应头
        response.setHeader('Access-Control-Allow-Headers','*')
        //响应数据
        const data ={
            name :'json2'
        }
        //对字符串进行转化
        let str = JSON.stringify(data)
        response.send(str)
    })
    
    2.自动转化:
    window.onkeydown = function(){
                const result = document.getElementById('result')
                const xhr = new XMLHttpRequest()
                //设置响应体数据的类型
                xhr.responseType = 'json'
                xhr.open('get','http:/127.0.0.1:8080/server-json')
                xhr.send()
                xhr.onreadystatechange = function(){
                    if(xhr.readyState ===4){
                        if(xhr.status >=200 && xhr.status < 300){
                            console.log(xhr.response)
                            console.log(xhr.response)
                            result.innerHTML = xhr.response.name
                        }
                    }
                }
            }

插件

nodemon自动重启服务

npm install -g nodemon

如果出现:

 无法加载文件 D:\node\nodemon.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ nodemon server.js
+ ~~~~~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

可以使用 npx nodemon xx.js


IE缓存问题

可以在open的url中加入时间戳:

xhr.open('get','http:/127.0.0.1:8080/server-json?t='+Date.now()')

请求超时

  //超时设置
        xhr.timeout = 2000
        //超时回调
        xhr.ontimeout = function(){
            alert('error')	
    }

网络异常

  //网络异常回调
    xhr.onerror = function(){
        alert('eee')
    }

手动取消ajax请求

<button>发送请求</button>
    <button>取消请求</button>
    
    const btns = document.querySelectorAll('button')
            let x = null
    
            btns[0].onclick = function(){
                x = new XMLHttpRequest()
                x.open('get','http:127.0.0.1:8080/server-setTimeout')
                x.send()
                x.onreadystatechange = function(){
                    if(x.readyState ===4){
                        if(x.status>=200 && x.status<300){
                            // alert(x.response)
                        }
                    }
                }
            }
            btns[1].onclick = function(){
               //中断请求
               x.abort()
            }

axios发送请求

    sendMes(){
                    axios.get('http://127.0.0.1:8080/server-json').then(
                        Response=>{
                            this.$bus.$emit('demo',Response.data)
                        },
                        error=>{
                            console.log('error')
                        }
                    )
                }
                
                
    sendMes(){
                    axios.get('http://127.0.0.1:8080/server-json',{
                        //传入参数
                        params:{a:1},
                        //请求头信息
                        headers:{
                            name:'hello2'
                        }
                    }).then(
                        Response=>{
                            this.$bus.$emit('demo',Response.data)
                        },
                        error=>{
                            console.log('error')
                        }
                    )
                }

跨域

同源策略

同源:协议,域名,端口 必须完全相同,违背同源策略就是跨域

    当满足同源策略的时候,可以简写url
    // x.open("get",'/data')
    x.open("get",'http:/127.0.0.1:9000/data')

jsonp服务

通过script进行跨域跳转

  在html中:
    用户名:<input type="text" id="username">
        <p></p>
        <script>
            const input = document.querySelector('input')
            const p = document.querySelector('p')
            function demo(data){
                input.style.border= "solid 1px skyblue"
                p.innerHTML = data.msg
            }
            input.onblur = function(){
                let username = this.value
                //创建script标签
                const script = document.createElement('script')
                //设置标签的src属性
                script.src = 'http://127.0.0.1:8080/check-username'
                //将script插入到文档中
                document.body.appendChild(script)
    
            }
        </script>
        
        在js中:
        //jsonp
    app.all('/check-username',(request,response)=>{
        const data ={
            exist:1,
            msg:'用户已存在'
        }
        let str = JSON.stringify(data)
        response.end(`demo(${str})`)
    
    })

HTTP访问控制

Access-Control-Allow-Credentials     适合post/get
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值