JavaScript学习笔记(十六) XMLHttpRequest

news/2024/7/8 2:58:19 标签: JavaScript, XMLHttpRequest

1、介绍

(1)AJAX(Asynchronous JavaScript and XML)

AJAX 原来是指通过异步 JavaScript 从服务器 XML 文档获取数据,然后更新部分网页,避免刷新整个网页

后来,这个词语慢慢成为在浏览器通过脚本与服务器进行通信的代名词,它在原来的含义上有了更多的拓展

也就是说,只要通过脚本向服务器发送请求获取数据,这个请求都被称为 AJAX 请求

(2)XMLHttpRequest

XMLHttpRequest 是浏览器内置对象,通过这个对象,我们能向服务器发送请求和接收响应,实现数据交换

很多 AJAX 底层都是通过 XMLHttpRequest 对象实现

2、使用

可以通过构造函数 XMLHttpRequest() 创建一个 XMLHttpRequest 对象

XMLHttpRequest 对象常用的属性如下:

  • readyState:只读属性,表示请求的当前状态

    若为 0,表示已经生成请求实例,但未调用 open() 方法

    若为 1,表示已经调用 open() 方法,但未调用 send() 方法

    若为 2,表示已经调用 send() 方法,且已收到服务器返回的头信息

    若为 3,表示正在接收服务器返回的数据体

    若为 4,表示服务器返回的数据已全部接收完毕,或者发生错误

  • response:只读属性,表示服务器返回的数据,其类型由 responseType 的值决定

  • responseType:定义返回数据的类型,它的值是一个字符串

    若为 'text''',表示服务器返回文本数据

    若为 'json',表示服务器返回 Json 对象

    若为 'blob',表示服务器返回 Blob 对象

    若为 'arraybuffer',表示服务器返回 ArrayBuffer 对象

    若为 'document',表示服务器返回 Document 对象

  • responseText:只读属性,表示服务器返回的文本数据,如果请求失败则为 null

  • responseXML:只读属性,表示服务器返回的 Document 对象,如果请求失败则为 null

  • responseURL:只读属性,表示返回数据的服务器的网址

  • status:只读属性,表示 HTTP 状态代码

  • statusText:只读属性,表示 HTTP 状态信息

  • timeout:定义请求的超时时间,若请求超过该时间,则自动结束此请求

  • withCredentials:一个布尔类型的值,表示在跨域请求时是否带有授权信息

XMLHttpRequest 对象常用的方法如下:

  • open():初始化请求,它接收以下五个参数

    参数 method 是一个字符串,表示将要使用的请求方法

    参数 url 是一个字符串,表示发送请求的目标地址

    参数 async 是一个布尔值,表示请求是否需要异步进行,默认为 true

    参数 user 是一个字符串,表示用于认证的用户,默认为空字符串

    参数 password 是一个字符串,表示用于认证的密码,默认为空字符串

  • setRequestHeader():设置请求头,必须在 open() 之后 send() 之前调用

  • overrideMimeType():将服务器返回的数据解析成指定类型,必须在 open() 之后 send() 之前调用

  • send():发送请求,可以在参数中带上请求体

    请求体的类型可以是 nullStringBlobArrayBufferDocumentFormData

  • abort():中止请求

  • getAllResponseHeaders():获取所有响应头

  • getResponseHeader():获取指定响应头

XMLHttpRequest 对象常用的事件如下:

  • readystatechangereadyState 发生变化时触发

  • loadstart:当请求开始时触发(发出 HTTP 请求)

  • loadend:当请求结束时触发(请求成功或者失败)

  • load:当请求成功时触发

  • error:当请求错误时触发

  • abort:当请求中止时触发

  • timeout:当请求超时时触发

  • progress:监听上传和下载进度,该事件对应的事件处理函数带有一个事件对象,该事件对象有三个属性

    属性 loaded 表示已经传输的数据量,属性 total 表示总数据量

    属性 lengthComputable 表示加载进度是否可以计算,是一个布尔类型的值

这里要注意,下载触发的是 xhr 对象的 progress 事件,上传触发的是 xhr.upload 对象的 progress 事件

3、实例

(1)发送 GET 请求

var xhr = new XMLHttpRequest()

xhr.responseType = 'text'

xhr.open('GET', 'http://www.httpbin.org/get')

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            console.log(xhr.responseText)
        } else {
            console.error(xhr.statusText)
        }
    }
}

xhr.onerror = function() {
    console.log('error')
}

xhr.send()

(2)发送 POST 请求

var xhr = new XMLHttpRequest()

xhr.open('POST', 'http://www.httpbin.org/post')

xhr.onload = function() {
    console.log(xhr.response)
}

xhr.onerror = function() {
    console.log('error')
}

var data = new FormData()
data.append('username', 'admin')
data.append('password', '12345')

xhr.send(data)

(3)接收图片

var xhr = new XMLHttpRequest()

xhr.open('GET', '/path/to/image.png')

xhr.onloadstart = function() {
    xhr.responseType = 'blob'
}

xhr.onload = function() {
    if (this.status === 200) {
    	var blob = xhr.response
        
        var img = document.createElement('img')
        img.onload = function() { window.URL.revokeObjectURL(img.src) }
        img.src = window.URL.createObjectURL(blob)
        document.getElementById('container').appendChild(img)
    }
}

xhr.send()

(4)监听进度

var xhr = new XMLHttpRequest()

xhr.open('GET', '/download/or/upload')

// 用于监听下载进度
xhr.onprogress = progressHandler
// 用于监听上传进度
xhr.upload.onprogress = progressHandler

function progressHandler(e) {
    if (e.lengthComputable) {
        console.log(e.loaded / e.total)
    } else {
        console.log('无法获取进度')
    }
}

xhr.send()

http://www.niftyadmin.cn/n/1849599.html

相关文章

目前在看的书Visual c++ Net 技术内幕第六版

这本书,讲ATL不错。书上以VC2003.net 为环境讲的。

打包自己的的Class文件为Jar文件

java cvf my.jar *.* (不加-),则把当前的目录里的所有子目录以及文件打包为my.jar,该jar包就在当前目录下 要想用该jar包需要在classpath下现加.;再加上所在jar包的绝对路径\my.jar。 jar -cf my.jar com则把com下的所有文件打包到jar包。 jar -tvf my.j…

JavaScript实战笔记(五) 预览本地图片

一般情况下,实现本地图片预览有两种方法,一种是 DataURL,一种是 BlobURL 所以在开始介绍怎么展示本地图片之前,我们花一点时间了解一下什么是 DataURL 和 BlobURL 1、DataURL (1)介绍 DataURL 就是以 d…

python中非法变量名_Python变量命名规则(超级详细)

Python 需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名字)。 Python 语言的标识符必须以字母、下画线(_)开头,后面可以跟任意数目…

最近,看了一个新片子,很不错。介绍给大家。

中文名称:越狱 第一季英文名称:Prison Break Season1资源类型:RMVB版本:[风软FRM字幕组出品]更新第18集泄露版(缺17)发行时间:2005年08月29日导演:Brett Ratner演员:Wentworth Miller .... Mich…

这几天闲着没事情。搞搞xml

先确定一下编译器。看看业务相关的资料。我书签写成写称XML的。还有什么?想起来再加吧!

DirectAccess部署(三)之双网卡环境 DA服务器配置(多图!)

实验拓扑 部署概览 域控制器 主机名:WIN2K8-2 IP地址:192.168.0.62/24 网关:192.168.0.1 安装域服务角色--IIS角色--证书服务器角色 配置CRL(Certificate Revocation List证书吊销列表)--新建NLS服务器A记录--配置域策…

JavaScript实战笔记(六) 日期格式化

我们知道,在 JavaScript 中没有日期格式化的相关接口,因此使用起来很不方便 下面我们自己来封装一个函数,整体逻辑也很简单,就是使用正则表达式去替换 /*** 格式化日期* param { Date } date 待转换日期* param { String …