Javascript基础

JS XMLHttpRequest对象

2018-09-06  本文已影响1207人  weqwqwqwe121312

Ajax的核心是XMLHttpRequest对象

使用XMLHttpRequest对象要注意一个兼容性问题,XMLHttpRequest对象只支持IE7及以上版本。

XMLHttpRequest对象的使用

1、创建XMLHttpRequest对象实例

var xhr = new XMLHttpRequest()

2、使用open()方法启动一个请求以备发送

xhr.open('get', 'example.php', false)
xhr.send(null)

4、收到响应后,响应的数据会自动填充XMLHttpRequest对象的属性,相关属性如下:

5、在多数情况下,请求为异步的,可检测XMLHttpRequest对象的readystate属性来判断当前阶段:

可使用onreadyStateChange事件监听状态变化,注意为保证兼容性,要在open方法之前使用。

6、abort()方法,可以在接收到响应之前,取消异步请求。调用这个方法后,XMLHttpRequest对象会停止触发事件,且不再允许访问任何与响应有关的对象属性。

7、设置自定义请求头,可使用setRequestHeader()方法实现,方法要写在open()方法后,send()方法之前才可以。
8、获取响应头的信息

完整的示例如下:

var xhr = new XMLHttpRequest()
xhr.onreadyStateChange = function () {
  if (xhr.readystate === 4) {
    if (xhr.status === 304 || (xhr.status >= 200 && xhr.status < 300)) {
      console.log('type: success, result: ', xhr.responseText)
    } else {
      console.log('type: error, errCode:', xhr.status)
    }
  }
}
xhr.open('get', 'example.php', true)
xhr.·setRequestHeader('testHeader', 'testHeaderVal')
xhr.send(null)

XMLHttpRequest对象使用的一些注意事项

get方法

需要注意URL后面参数的名称和值都必须经过encodeURIComponent才可以

post方法

如果需要发送整个表单数据,需要设定content-type,并借助serialize()函数来实现

如:

var xhr = new XMLHttpRequest()
xhr.onreadyStateChange = function () {
  if (xhr.readystate === 4) {
    if (xhr.status === 304 || (xhr.status >= 200 && xhr.status < 300)) {
      console.log('type: success, result: ', xhr.responseText)
    } else {
      console.log('type: error, errCode:', xhr.status)
    }
  }
}
xhr.open('post', 'example.php', true)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencolde')
var form = document.getElementById('form')
xhr.send(serialize(form))

XMLHttpRequest对象 2级

FormData类型

如上post的例子,可以修改为:

var xhr = new XMLHttpRequest()
xhr.onreadyStateChange = function () {
  if (xhr.readystate === 4) {
    if (xhr.status === 304 || (xhr.status >= 200 && xhr.status < 300)) {
      console.log('type: success, result: ', xhr.responseText)
    } else {
      console.log('type: error, errCode:', xhr.status)
    }
  }
}
xhr.open('post', 'example.php', true)
var form = document.getElementById('form')
xhr.send(new FormData(form))

增加timeout超时属性

如上post的例子,可以修改为:

var xhr = new XMLHttpRequest()
xhr.onreadyStateChange = function () {
  if (xhr.readystate === 4) {
    try {
      if (xhr.status === 304 || (xhr.status >= 200 && xhr.status < 300)) {
        console.log('type: success, result: ', xhr.responseText)
      } else {
        console.log('type: error, errCode:', xhr.status)
      }
    } catch () {
      console,log('增加异常捕获')
    }
  }
}
xhr.open('post', 'example.php', true)
xhr.timeout = 1000
xhr.ontimeout = function () {
  console.log('超时处理')
}
var form = document.getElementById('form')
xhr.send(new FormData(form))

在send()方法之前,open()方法使用overrideMinmeType()方法,可以重写响应的MIME类型

增加进度事件

注意:

上一篇下一篇

猜你喜欢

热点阅读