XHR 请求
XHR 作为兼容性最好的纯数据请求方式(即平常说的 ajax 请求),应该是前端数据请求用的最多的方式。
早期 jQuery 的 $.ajax 还是现在流行的 axios,底层原理其实都是 new XMLHttpRequest()。
xhr 可以原生支持异步请求,数据使用回调的方式进行处理,写法较繁琐。
var xhr = new XMLHttpRequest()
xhr.open('get', 'url', true)
xhr.send(null)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status == 200) {
alert(xhr.responseText)
}
}
}
fetch
fetch 是浏览器原生支持的,可以不用引用 http 的类库即可实现发送请求。
默认异步,想要实现同步效果需要借助 async await。
天然融合 promise,只有网络异常或跨域时才会 reject 掉。
fetch 配置请求是否携带 cookie 和接受服务端写入 cookie 是需要额外设置的 credentials。
fetch('url', {
method: 'GET', // *GET, POST, PUT, DELETE
body: '',
headers: {
'user-agent': 'Mozilla/4.0',
'content-type': 'application/json'
},
credentials: 'include'
})
.then(function (response) {
return response
})
.then(function (response) {
console.log(response)
})
顺带提一句,fetch 中通过 AbortController 实例取消请求。
form 表单提交
可以在提交表单时打开新窗口,并隐藏提交的表单数据。
文件上传。
注意 content-type 的不同,以及参数需要用 formData 类型。
function formPost(targetUrl, params, target = '_blank') {
const form = document.createElement('form')
form.style.display = 'none'
form.method = 'post'
form.action = targetUrl
form.target = target
for (let prop in params) {
if (typeof params[prop] !== 'function') {
let input = document.createElement('input')
input.type = 'hidden'
input.name = prop
input.value = params[prop]
form.append(input)
}
}
document.body.appendChild(form) // 确保兼容性
form.submit()
document.body.removeChild(form)
return false
}
图片的 src 请求
HTML 中 img 标签,只要放置了 src 属性,就会发出请求。常用于加载一张图片用于显示或绘制画布。
重复的图片地址,所有浏览器都只请求一次。
let img = new Image()
img.onload = e => {
console.log('图片加载完毕', e)
}
img.src = 'xx.xx'
iframe
本身设计用于引用完整的外部网站
因为也会自动发起一次网络请求,并且可以支持随后发起一系列请求。
常见用于外部广告、Hybird 中原生与 H5 通信、后台管理系统。
script 标签的 src 属性
这是前端的根本,加载一个 js 脚本,无论是模块化,还是分包都会用到切割 js,异步下载它。
不同的异步方式,加载执行的顺序会受浏览器影响。
静态前端库的专有 CDN 链接。
常见的跨域解决方案中的 JSONP 的解决方案也是通过 script 标签。