一、与后端交互方式
Form 表单提交
- 只支持 GET 和 POST 类型
- 缺点:提交后页面会刷新,用户体验不佳
AJAX
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)
- 支持多种请求方法
- 使用内置的 XMLHttpRequest 和 fetch 对象,实现和服务器进行数据交互
- 优点:交互数据时不需要刷新,体验较好
WebSocket
- 可以由服务端主动发起
二、XMLHttpRequest
GET 请求
let url = 'https://api.github.com'let xhr = new XMLHttpRequest()xhr.open('GET',url,true)xhr.onreadystatechange = function(){if(xhr.readyState === 4){if((xhr.status>=200 && xhr.status<300) || xhr.status===304){console.log(JSON.parse(xhr.responseText))}else{console.log('服务器异常')}}}xhr.onerror = function(){console.log('网络异常')}xhr.send()
POST请求
let url = 'https://xxx.com'let xhr = new XMLHttpRequest()xhr.time-3000xhr.open('POST',url,true)xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')xhr.onload = function(){if((xhr.status>=200 && xhr.status<300) || xhr.status===304){console.log(JSON.parse.responseText)}else{console.log('响应异常')}}xhr.ontimeout = function(){console.log('请求超时')}xhr.onerror=function(){console.log('服务器异常')}xhr.send('username=hunger&password=12345678')
GET请求的封装
const request = (url,params,onsuccess,onerror)=>{url = url + '?' + Object.entries(params).map(array=>array[0]+array[1]).join('&')let xhr = new XMLHttpRequest()xhr.open('GET',url,true)xhr.onload = function(){if((xhr.status>=200 && xhr.status<300) || xhr.staus === 304){onsuccess(JSON.parase(xhr.responseText))}else{onerror()}}xhr.onerror = onerrorxhr.send()}request('https://api.github.com',{q:test},data=>{console.log('请求成功');console.log(data)},()=>{console.log('接口异常')})
Post请求编码方式:multipart/form-data
let formData = new FormData()formData.append('username','Jack')formData.append('password','123456')let url = 'https://xxx.com'let xhr = new XMLHttpRequest()xhr.open('GET',url,true)xhr.onload = function(){if((xhr.status>=200 && xhr.status<300) || xhr.status===304){console.log(JSON.Parase(xhr.responseText))}else{console.log('接口异常')}}xhr.send(formData)
Post请求提交表单例子
const $=s=>document.querySelector(s)const $submit = $('[type=submit]')const $form = $('form')const $msg = $('#msg')let url = 'https://xxx.com'$form.onsubmit = function(e){e.preventDefalut()// 这里校验let formData = new FormData($form)let xhr = new XMLHttpRequest()xhr.open('GET',url,true)xhr.onload = function(){if((xhr.status>=200 && xhr.status<300) || xhr.status===304){//console.log(JSON.Parase(xhr.responseText))let data = JSON.Parase(xhr.responseText)$msg.innerText = data.msg || data.errMsg}else{console.log('接口异常')}}xhr.send(formData)}
三、fetch
GET请求
let url = 'https://api.github.com'fetch(url).then(response=>response.json()).then(data=>{console.log(data)})
POST请求
let url = 'https://xxx.com'let data = {username:'Jack',password:123456}fetch(url,{method:'POST',body:Object.entries(data).map(array=>array[0]+'='+array[1]).join('&'),header:{'Content-Type':'application'/x-www-form-urlencoded}}).then(res=>res.json()).then(response=>console.log('Success:',response)).catch(error=>console.error('Error:',error))
四、轮询
Ajax轮询
- 每个固定时间发一次请求
- 发请求,立即响应
长轮询(Comet)
- 客户端
- 发请求,等待响应
- 当响应时,再次发请求
- 服务端
- 请求到来,如果没新数据,则不发
- 当有新数据,需要通知客户端,再响应
「@浪里淘沙的小法师」
