博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于AJAX
阅读量:4666 次
发布时间:2019-06-09

本文共 6625 字,大约阅读时间需要 22 分钟。

 

一些发请求的方法

用 form 可以发请求,但是会刷新页面或新开页面

用 a 可以发 get 请求,但是也会刷新页面或新开页面
用 img 可以发 get 请求,但是只能以图片的形式展示
用 link 可以发 get 请求,但是只能以 CSS、favicon 的形式展示
用 script 可以发 get 请求,但是只能以脚本的形式运行()

 

用AJAX发请求

什么是AJAX?  —— 异步的 JavaScript 和 XML

主要分为三步

  1. 使用XMLHttpRequest发请求
  2. 服务器返回XML格式的字符串
  3. JS解析XML,并更新局部页面(目前用替代XML)

示例代码:

    
Document
btn.addEventListener('click', (e) => {    //第一步:使用XMLHttpRequest发请求    let request = new XMLHttpRequest()    //配置request,初始化一个请求    request.open('GET', '/xxx')    //发送请求    request.send()    //监听请求的状态    request.onreadystatechange = () => {        if (request.readyState === 4) { //,4表示请求响应都完毕            if (request.status >= 200 && request.status < 300) {                console.log('请求成功')                let string=request.responseText              //第三步:把符合JSON语法的字符串转换成JS对应的值                let object=JSON.parse(string)            } else if (request.status >= 400) {                console.log('请求失败')            }        }    }    })
/********后端代码************/    if (path === '/') {        let string = fs.readFileSync('./index.html', 'utf8')        response.statusCode = 200        response.setHeader('Content-Type', 'text/html;charset=utf-8')        response.write(string)        response.end()    } else if (path === '/main.js') {        let string = fs.readFileSync('./main.js', 'utf8')        response.statusCode = 200        response.setHeader('Content-Type', 'text/javascript;charset=utf-8')        response.write(string)        response.end()    } else if (path === '/xxx') {        response.statusCode = 200        response.setHeader('Content-Type', 'text/json;charset=utf-8')        //第二步:服务器返回XML格式的字符串(这里用JSON替代XML)        response.write(`   {       "note":{           "to": "今天",           "from": "明天",           "heading": "每一天",            "content": "天天"       }   }        `)        response.end()    }    else {        response.statusCode = 404        response.setHeader('Content-Type', 'text/html;charset=utf-8')        response.write('错误')        response.end()    }    /*********后端代码***********/

 

注意:

  • 通过AJAX,JS 可以设置任意请求 header 

    第一部分 request.open('get', '/xxx')

    第二部分 request.setRequestHeader('content-type','x-www-form-urlencoded')
    第四部分 request.send('a=1&b=2')

 

  • 通过AJAX,JS 可以获取任意响应 header 

    第一部分 request.status / request.statusText

    第二部分 request.getResponseHeader() / request.getAllResponseHeaders()
    第四部分 request.responseText

 

关于JSON

JSON是一门新语言,是一种数据格式化语言

 

JS和JSON的区别

JSON没有7种数据类型中的function和undefined

JSON的字符串首尾必须是双引

具体如下表:

 

JS JSON
undefined
null null
['a','b'] ["a","b"]
function fn (){}
{name:'frank'} {"name":"frank"}
'frank' "frank"

var a={}

a.self=a

无变量
{__proto__} 没有原型链

 

关于同源策略

浏览器必须保证:

协议+端口+域名 一模一样才允许发AJAX请求,有限制,但是安全

 

突破同源策略(CORS跨域)

 Cross-Origin Resource Sharing  跨栈资源共享

示例代码:

//发起请求request.open('GET', 'http://jerry.com:8002/xxx')
//后台添加response.setHeader('Access-Control-Allow-Origin','http://tom.com:8001')

 

封装AJAX

初封装

window.$=window.jQuery$.ajax=function(options){    let url=options.url    let method=options.method    let body=options.body    let successFn=options.successFn    let failFn=options.failFn    let headers=options.headers    //第一步:使用XMLHttpRequest发请求    let request = new XMLHttpRequest()    request.open(method, url)//配置request,初始化一个请求    for(let key in headers){        let value=headers[key]        request.setRequestHeaders(key,value)}    request.send(body)//发送请求    //监听请求的状态    request.onreadystatechange = () => {        if (request.readyState === 4) { //4表示请求响应都完毕            if (request.status >= 200 && request.status < 300) {                successFn.call(undefined,request.responseText)            } else if (request.status >= 400) {                failFn.call(undefined,request.responseText)            }        }    }}//**********使用**************btn.addEventListener('click', (e) => {    $.ajax({        url:'/xxx',        method:'POST',        headers:{            'content-typw':'application/x-www-form-urlencoded',            'today':'18'}        body:'a=1&b=2',        successFn:(responseText) => {console.log(1)},        failFn:(request) => {console.log(2)}    })})

若接收两种参数

..........$.ajax=function(options){    let url    if (arguments.length===1){        url=options.url}else if (arguments.length===2){        url=arguments[0] options=arguments[1] } let url=options.url let method=options.method let body=options.body let successFn=options.successFn let failFn=options.failFn let headers=options.headers ..........

若请求响应成功后要执行两个函数

//**********使用**************function f1(responseText){}function f1(responseText){}btn.addEventListener('click', (e) => {    $.ajax({        url:'/xxx',        method:'POST',        body:'a=1&b=2',        successFn:(x) => {            f1.call(undefined,x)            f2.call(undefined,x)},        failFn:(request) => {console.log(2)}    })})

**举例解释ES6 解构赋值**

var a = 'a' var b = 'b' [a,b]=[b,a] a//"b" b//"a"//将b赋值给a,将a赋值给b

 

封装优化

window.$=window.jQuery$.ajax=function({url,method,body,headers}){
//ES6 解构赋值 return new Promise(function(resolve,reject){ let request = new XMLHttpRequest() request.open(method, url)//配置request for(let key in headers){ let value=headers[key] request.setRequestHeaders(key,value)} //监听请求的状态 request.onreadystatechange = () => { if (request.readyState === 4) { //4表示请求响应都完毕 if (request.status >= 200 && request.status < 300) { resolve.call(undefined,request.responseText) } else if (request.status >= 400) { reject.call(undefined,request) } } } request.send(body)})}//*********使用***********btn.addEventListener('click', (e) => { $.ajax({ url:'/xxx', method:'get', headers:{ 'content-type':'application/x-www-form-urlencoded', 'today':'18'} }).then( (text) => {console.log(text)}, (request) => {console.log(request)})})

 

使用jQuery.ajax——Promise 

promise是确实能够函数形式的规范

btn.addEventListener('click', (e) => {    $.ajax({        url:'/xxx',        method:'GET',    }).then(        (responseText) => {console.log(responseText)},//成功       //console.log(responseText)的结果是个对象,因为此时响应的Content-Type是text/json,jQuery会自动将字符串转换成对象        (request) => {console.log(error)}//失败)    })

如果要对一个结果进行多次处理

btn.addEventListener('click', (e) => {    $.ajax({        url:'/xxx',        method:'GET',}).then(        (responseText) => {console.log(responseText),},//成功        (request) => {console.log(error)}//失败).then(    (上次处理的结果) => {        console.log(上一次的处理结果)    },      (request) => {console.log(error)})})

 

待补充..........

转载于:https://www.cnblogs.com/BUBU-Sourire/p/11200702.html

你可能感兴趣的文章
定位决定人生成败
查看>>
ORACLE 创建新表
查看>>
在C#中获取IronPthon2.7异常时的调用方法堆栈,调试使用。
查看>>
oracle解决显示数据的层次问题--实现数据缩进
查看>>
解决Undefined symbols for architecture x86_64: 报错 和 ld: warning: ld: warning: ignoring file警告...
查看>>
HackerRank(FP) - The Sums of Powers
查看>>
Python3+Selenium环境配置
查看>>
java两个时间相差多少天时分秒
查看>>
SVM学习笔记(一):libsvm参数说明(转)
查看>>
[CODEVS 3044] 矩形面积求并
查看>>
网易云短信
查看>>
edge box
查看>>
eetcode 之String to Integer (atoi)(28)
查看>>
bolt_storage.go
查看>>
LeetCode--026--删除排序数组中的重复项(java)
查看>>
【HANA系列】SAP 【第二篇】EXCEL连接SAP HANA的方法(ODBC)
查看>>
【ABAP系列】SAP ABAP OOALV 动态设置单元格可否编辑
查看>>
Js 中 getYear() 和 getFullYear() 的区别
查看>>
使用NPM在项目中引入【lodash】
查看>>
富文本,KindEditor的使用方法及(jsp)案例
查看>>