首页 > 其他分享 >day22 ajax

day22 ajax

时间:2022-10-31 20:22:36浏览次数:43  
标签:请求 get url defaultOption day22 xhr ajax key

概述:AJAX (asynchronous JavaScript and xml)异步的Javascript和xml。用于发送http请求(可以是异步请求),能够完成页面的局部刷新功能,在整个页面不刷新的前提下,发送对应的请求改变对应的部分dom,核心对象为XMLHttpRequest(xhr)

ajax的代码实现

//新建请求对象
var xhr = new XMLHttpRequest()
//以对应的请求方式来打开对应的请求地址
xhr.open('get', 'http://jsonplaceholder.typicode.com/todos')
//发送请求
xhr.send()
//监听请求状态的变化 readystate (1-5 1准备发送 2 发送完成 3 发送完成数据准备接收 4数据
接收完毕 5 错误)
xhr.onreadystatechange = () => {
//进行判断对应的状态 4是数据接收完毕
if (xhr.readyState == 4) {
//responseText 表示返回的文本(字符串)
console.log(xhr.responseText)
}
}

XMLHttpRequest对象的相关属性及方法

属性

   readyState 状态码

  status http 状态码

  timeout 超时时间

responseText 响应文本

方法

open打开一个请求

send发送请求

setRequestHeader设置请求头

getResponseHeader获取响应头

事件

 onreadystatechange监听状态改变

//新建请求对象
var xhr = new XMLHttpRequest()
//以对应的请求方式来打开对应的请求地址
xhr.open('get', 'http://jsonplaceholder.typicode.com/todos')
//发送请求
xhr.send()
//监听请求状态的变化 readystate (1-5 1准备发送 2 发送完成 3 发送完成数据准备接收 4数据
接收完毕 5 错误)
xhr.onreadystatechange = () => {
//进行判断对应的状态 4是数据接收完毕
if (xhr.readyState == 4) {
//responseText 表示返回的文本(字符串)
console.log(xhr.responseText)
}
}

数据渲染案例

<button>请求数据</button>
<ul>
</ul>
<script>
//获取ul
var ul = document.querySelector('ul')
// http://jsonplaceholder.typicode.com/todos?_limit=10&_page=2
//get请求的传参使用?和&做拼接 search传参(query传参)
//第一个前面要添加? 对应的多个参数使用&连接
//get传参时使用地址的拼接来传递参数
// _limit表示 个数 _page表示页数
document.querySelector('button').onclick = function(){
//请求数据
var xhr = new XMLHttpRequest()
//设置请求地址
xhr.open('get','http://jsonplaceholder.typicode.com/todos')
//发送请求
xhr.send()
//接收响应数据
xhr.onreadystatechange = ()=>{
if(xhr.readyState == 4 && /^2\d{2}$/.test(xhr.status)){
//接收数据
var str = xhr.responseText
//将字符串转为对应的对象
var result = JSON.parse(str)
//渲染
//遍历result进行渲染
result.forEach(item => {
ul.innerHTML += ` <li>
id: ${item.id}
${item.title}
${item.completed?'�':'�'}
</li>`
});
}
}
}
</script>

get请求封装

//封装一个对应的get请求的方法
//请求地址 参数 (以对象传递) 对应的处理不一样
export function get(url,params={},callback){
//判断url地址是否传递 如果没有传递直接报错
if(!url){
throw new Error('地址必须传递')
}
//新建请求对象
let xhr = new XMLHttpRequest()
//设置请求地址 (拼接参数到url)
//遍历对象中所有的属性
for(let key in params){
// {_limit:10,_page:1}
// http://jsonplaceholder.typicode.com/todos?_limit=10&_page=1
//判断url里面是否存在? 如果没有就加上
if(!url.includes('?')){
url+=`?${key}=${params[key]}`
}else{
url+=`&${key}=${params[key]}`
}
}
xhr.open('get',url)
//发送请求
xhr.send()
//监听请求状态改变
xhr.onreadystatechange = ()=>{
//判断是否成功
if(xhr.readyState == 4 && /^2\d{2}$/.test(xhr.status)){
//成功调用回调函数传递参数出去
//先转为对象再传递出去
callback(JSON.parse(xhr.responseText))
}
}
}

分页渲染示例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
<ul>
</ul>
<script type="module">
import {get} from './ajax.js'
//获取ul
var ul = document.querySelector('ul')
//获取所有按钮
var btns = document.querySelectorAll('button')
//遍历按钮添加事件
Array.from(btns).forEach((v,i)=>{
v.onclick = ()=>{
get('http://jsonplaceholder.typicode.com/todos',{
_
limit:10,
_
page:i+1
},(res)=>{
ul.innerHTML = ''
res.forEach(item => {
ul.innerHTML += ` <li>
id: ${item.id}
${item.title}
${item.completed?'*':'¥'}
</li>`
});
})
}
})
</script>
</body>
</html>

简单的post请求

<!-- action 提交的地址 method 提交的方式 -->
<form action="https://jsonplaceholder.typicode.com/posts" method="post">
<!-- 如果使用action进行提交 那么提交的内容在对应的输入框中 提交的时候以key value提
交
name属性表示的是key 对应的value是输入框的值
<input type="text" name="uname">
<input type="password" name="upwd">
<button type="submit">登录</button>
</form>
<!-- 通过form发送的post请求 需要指定请求方式 这个请求的数据以表单形式发送的
没有指定请求方式 默认以get方式提交
数据暴露在地址栏 他是通过?和&进行拼接 (对应的get请求提交的数据通过字符串的形式)
get请求提交的数据有限 (2kb)
get请求因为在地址栏 所以他会有历史记录
get请求是不安全
只有指定为post才会以post请求提交
post请求 数据是会封装成表单对象存储在对应的请求体中进行提交
数据提交的容量 要远远大于get请求的
而post请求没有历史记录
post安全性要高于get请求
--
>
<!-- 异步的post请求 -->
<script>
//获取form表单
document.forms[0].onsubmit = ()=>{
//获取input框的数据
var inputs = document.querySelectorAll('input')
var username = inputs[0].value
var password = inputs[1].value
//新建请求对象
var xhr = new XMLHttpRequest()
//打开连接
xhr.open('post','https://jsonplaceholder.typicode.com/posts')
//设置请求头 告诉后台的我的内容为表单形式
//内容的类型为表单形式
xhr.setRequestHeader('Content-type','application/x-www-form-
urlencoded')
//发送数据 key=value&key=value send里面的数据放入在请求体
xhr.send(`username=${username}&password=${password}`)
//监听状态改变
xhr.onreadystatechange = ()=>{
if(xhr.readyState == 4 && /^2\d{2}$/.test(xhr.status)){
console.log(xhr.responseText);
}
}
//禁止默认行为
return false
}
</script>

post请求封装

//封装post请求
export function post(url,params={},callback){
//判断url地址是否传递 如果没有传递直接报错
if(!url){
throw new Error('地址必须传递')
}
//新建请求对象
let xhr = new XMLHttpRequest()
//设置请求地址 (拼接参数到url)
xhr.open('post',url)
//设置请求头
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded')
//数据拼接发送
let paramsStr = ""
for(let key in params){
// {_limit:10,_page:1}
// _limit=10&_page=1
paramsStr +=
`
&${key}=${params[key]}`
}
//删除最前面的&
paramsStr = paramsStr.substring(1)
//发送请求
xhr.send(paramsStr)
//监听请求状态改变
xhr.onreadystatechange = ()=>{
//判断是否成功
if(xhr.readyState == 4 && /^2\d{2}$/.test(xhr.status)){
//成功调用回调函数传递参数出去
//先转为对象再传递出去
callback(JSON.parse(xhr.responseText))
}
}
}

ajax封装

//将post请求和get请求抽取
export const ajax = (url,option,callback)=>{
//判断是否具备url
if(!url){
throw new Error('地址必须传递')
}
//你传什么就改什么 不传为默认值
let defaultOption = {
method:'get',
data:{},
contentType:'application/json',
timeout:'3000'
}
//遍历对象里面key
for(let key in option){
//默认的选项里面存在这个key
if(defaultOption[key]){
//用option里面对应key的值来替换默认值
defaultOption[key] = option[key]
}
}
//新建请求对象
let xhr = new XMLHttpRequest()
//判断是get请求还是post请求
if(defaultOption.method == 'get'){
//设置请求地址 (拼接参数到url)
//遍历对象中所有的属性
for(let key in defaultOption.data){
// {_limit:10,_page:1}
// http://jsonplaceholder.typicode.com/todos?_limit=10&_page=1
//判断url里面是否存在? 如果没有就加上
if(!url.includes('?')){
url+=`?${key}=${defaultOption.data[key]}`
}else{
url+=`&${key}=${defaultOption.data[key]}`
}
}
}
xhr.open(defaultOption.method,url)
//设置请求头
xhr.setRequestHeader('content-type',defaultOption.contentType)
//判断是否为post请求
if(defaultOption.method == 'post'){
//数据拼接发送
let paramsStr = ""
for(let key in defaultOption.data){
// {_limit:10,_page:1}
// _limit=10&_page=1
paramsStr +=
`
&${key}=${defaultOption.data[key]}`
}
//删除最前面的&
paramsStr = paramsStr.substring(1)
//发送请求
xhr.send(paramsStr)
}else{
//发送请求
xhr.send()
}
//监听请求状态改变
xhr.onreadystatechange = ()=>{
//判断是否成功
}
}

ajax promise封装

//将post请求和get请求抽取
export const ajax = (url,option)=>{
//判断是否具备url
if(!url){
throw new Error('地址必须传递')
}
//你传什么就改什么 不传为默认值
let defaultOption = {
method:'get',
data:{},
contentType:'application/json',
timeout:'3000'
}
//遍历对象里面key
for(let key in option){
//默认的选项里面存在这个key
if(defaultOption[key]){
//用option里面对应key的值来替换默认值
defaultOption[key] = option[key]
}
}
//新建请求对象
let xhr = new XMLHttpRequest()
//判断是get请求还是post请求
if(defaultOption.method == 'get'){
//设置请求地址 (拼接参数到url)
//遍历对象中所有的属性
for(let key in defaultOption.data){
// {_limit:10,_page:1}
// http://jsonplaceholder.typicode.com/todos?_limit=10&_page=1
//判断url里面是否存在? 如果没有就加上
if(!url.includes('?')){
url+=`?${key}=${defaultOption.data[key]}`
}else{
url+=`&${key}=${defaultOption.data[key]}`
}
}
}
xhr.open(defaultOption.method,url)
//设置请求头
xhr.setRequestHeader('content-type',defaultOption.contentType)
//判断是否为post请求
if(defaultOption.method == 'post'){
//数据拼接发送
let paramsStr = ""
for(let key in defaultOption.data){
// {_limit:10,_page:1}
// _limit=10&_page=1
paramsStr +=
`
&${key}=${defaultOption.data[key]}`
}
//删除最前面的&
paramsStr = paramsStr.substring(1)
//发送请求
xhr.send(paramsStr)
}else{
//发送请求
xhr.send()
}
return new Promise((resolve,reject)=>{
//监听请求状态改变
xhr.onreadystatechange = ()=>{
//判断是否成功
if(xhr.readyState == 4){
//成功调用resolve传递数据
//先转为对象再传递出去
if(/^2\d{2}$/.test(xhr.status)){
resolve(JSON.parse(xhr.responseText))
}
if(/^4\d{2}/.test(xhr.status)){
reject()
}
}
}
//如果xhr对象有错也调用reject
xhr.onerror = ()=>{
reject()
}
})
}

 

标签:请求,get,url,defaultOption,day22,xhr,ajax,key
From: https://www.cnblogs.com/zmfhtml5/p/16845626.html

相关文章

  • js的ajax
    一些关键词线程(线程和进程的最小单位javascript是单线程的语言())进程(正在运行的程序)同步(一个线程执行(同步阻塞))上一个没有做完下一个不能执行异步(多个线程)......
  • ajax测试wepApi模板
     ajax测试wepApi模板<body><%--<inputid="CreditValueInput"/>--%><buttonid="SubmitButton">点击跳转</button><formid="form1"runat="server">......
  • Ajax入门
    简介AjaxAsynchronousJavascriptandXML,异步js和xmlXMLHttpRequest是js的一个外挂组件,用来实现客户端和服务端的异步通信,所有的ajax都要借助此组件才能成功。XMLHtt......
  • Javaweb基础知识复习------AJAX
    AJAX相关知识复习简而言之,就是可以用AJAX+HTML代替JSP页面,也可以进行异步交互,更关心部分界面Ajax案例后端代码就是一个servlet文件,前端页面的代码也不是很常用,可以在下......
  • 如何在Ajax请求中后端进行跳转操作
    如果是ajax请求,想要后端传递跳转页面可以使用这个方法<?phpfunctiondemo(){$url=config('url').'/oauth2/authorize';if(Request::isAjax()){//如......
  • 52-ES8-async和await结合发送ajax请求
     ......
  • ajaxFileUpload.js 无刷新上传图片,支持多个参数同时上传,支持 ie6-ie10
    ajaxFileUpload无刷新上传的原理:在页面动态创建form表单和ifram贞,设定form表单提交的目标为ifram贞,将文件域和要post的参数动态写入form表单中,然后提交from......
  • 代码随想录day22 | 235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作 45
    235.二叉搜索树的最近公共祖先题目|文章思路在二叉树公共祖先问题中,可以通过后序遍历,从二叉树节点向上遍历,找到最近公共祖先。本题中我们可以利用二叉搜索树的特性对......
  • ajax-Xhr
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"c......
  • Ajax异步请求、异步提交
    网页中点击提交的时候,发送请求,同时,整个页面刷新,但是在看视频,点赞的时候,不能刷新页面重头看,所以用上Ajax技术,只刷新一小部分内容,减少服务器压力和实现需求。 它需要和j......