当前位置: 首页 > article >正文

AJAX笔记原理篇

黑马程序员视频地址:

AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source=0a2d366696f87e241adc64419bf12cab&spm_id_from=333.788.videopod.episodes&p=33https://www.bilibili.com/video/BV1MN411y7pw?vd_source=0a2d366696f87e241adc64419bf12cab&spm_id_from=333.788.videopod.episodes&p=33

XMLHttpRequest

基本使用方法 

    //第一步:创建 XMLHttpRequest 对象
    const xhr = new XMLHttpRequest()
    //第二步:配置请求方法和请求 url 地址
    xhr.open("GET", "https://hmajax.itheima.net/api/province")
    //第三步:监听 loadend 事件,接收响应结果
    xhr.addEventListener("loadend", () => {
      //响应结果
      console.log(xhr.response)//得到的是字符串
      const object = JSON.parse(xhr.response) //字符串转对象
      console.log(object)
    })
    //第四步:发起请求
    xhr.send()

查询参数 

    //第二步:配置请求方法和请求 url 地址
    xhr.open("GET", "https://hmajax.itheima.net/api/area?pname=辽宁省&cname=大连市")

将  对象  快速转成  参数1=值1&参数2=值2...   的字符串格式

   //获取输入框的值
   const pname = document.querySelector(".province").value
   const cname = document.querySelector(".city").value
   //构建对象 (输入框数量多时,用serialiaze函数快速获取,得到的结果是对象,就可以直接使用)
   const valueObj = {
    pname,
    cname
   }


   //⭐️查询参数对象转成查询参数字符串
   const paramsObj = new URLSearchParams(valueObj)
   const queryString = paramsObj.toString()


   //创建XMR对象
   const xhr = new XMLHttpRequest()
   //配置参数
   xhr.open("GET", `https://hmajax.itheima.net/api/area?${queryString}`)
   //配置监听事件
   xhr.addEventListener("loadend", () => {
    console.log(xhr.response)
   })
   //发送请求
   xhr.send()

数据提交

    document.querySelector('.reg-btn').addEventListener('click', () => {
      //创建请求体实例对象
      const xhr = new XMLHttpRequest()
      //设置参数
      xhr.open("POST", "https://hmajax.itheima.net/api/register")

      //设置监听时间
      xhr.addEventListener("loadend", () => {
        console.log(xhr.response)
      })
      //⭐️设置请求头-告诉服务器数据类型
      xhr.setRequestHeader("Content-Type", "application/json")
      //准备提交的数据
      const userObj = {
        username: "admin123",
        password: "12345678"
      }
      const userStr = JSON.stringify(userObj)

      //设置请求体,发送请求
      xhr.send(userStr)
    })


Promise

基本使用方法

   //创建Promise对象
   const p = new Promise((resolve, reject) => {
    //执行异步任务-并传递结果
    //如果此处调用了resolve(),则接下来会让then()执行
    //如果此处调用了reject(),则接下来会让catch()执行
   })
   p.then(result => {
    //成功执行
   })
   p.catch(error => {
    //失败执行
   })

promise的三种状态


XHR与Promise联合使用

    const p = new Promise((resolve, reject) => {
      //创建XHR对象
      const xhr = new XMLHttpRequest()
      //设置参数
      xhr.open("GET", "https://hmajax.itheima.net/api/province123")
      //设置监听事件
      xhr.addEventListener("loadend", () => {
        //可以打印一下xhr对象看一下数据
        if(xhr.status >= 200 && xhr.status <= 300)
        {
          //成功,调用resolve()让其自动调用then()
          resolve(JSON.parse(xhr.response))
        }else
        {
          //失败,调用reject()让其自动调用catch()
          reject(new Error(xhr.response))
        }
      })
      //发送请求体
      xhr.send()
    }).then(result => {
      //成功执行
      console.log(result)
    }).catch(error => {
      //失败执行,错误要用dir打印
      console.dir(error)
    })

dir打印结果 


封装简易版axios

简陋版(简单GET获取,不需要传参)

//封装函数
   function myAxios(object)
   {
    return new Promise((resolve, reject) => {
      //创建XHR对象
      const xhr = new XMLHttpRequest()
      //设置属性
      xhr.open(object.method || "GET", object.url)
      //设置监听事件
      xhr.addEventListener("loadend", () => {
        if(xhr.status >= 200 && xhr.status < 300)
        {
          //成功
          resolve(JSON.parse(xhr.response))
        }else
        {
          //失败
          reject(new Error(xhr.response))
        }
      })
      //发送请求体
      xhr.send()
    })
   }

//调用
 myAxios({
    url: "https://hmajax.itheima.net/api/province"
   }).then(result => {
    console.log(result)
   }).catch(error => {
    console.log(error)
   })

完整版(GET/POST都可以用,可以携带参数)

//封装函数
function myAxios(object)
   {
    return new Promise((resolve, reject) => {
      //创建XHR对象
      const xhr = new XMLHttpRequest()
      //设置属性
      if(obj.params){
        object.url += "?" + new URLSearchParams(object.params).toString()
      }
      xhr.open(object.method || "GET",  object.url)
      //设置监听事件
      xhr.addEventListener("loadend", () => {
        if(xhr.status >= 200 && xhr.status < 300){
          //成功
          resolve(JSON.parse(xhr.response))
        }else{
          //失败
          reject(new Error(xhr.response))
        }
      })
      //判断是否有data选项
      if(object.data){
        //设置请求头
        xhr.setRequestHeader("Content-Type", "application/json")
        const strdata = JSON.stringify(object.data)
        //发送请求体
        xhr.send(strdata)
      }else{
        //发送请求体
        xhr.send()
      }
    })
   }



//调用(用户注册)
myAxios({
    url: "https://hmajax.itheima.net/api/register",
    method: "POST",
    data: {
      username: "usera_001",
      password: "usera_001"
    }
  }).then(result => {
    console.log(result)
  }).catch(error => {
    console.log(error)
  })

案例:获取天气预报

 

function getWeather(cityCode)   //封装获取天气函数
{
  myAxios({
    url: "https://hmajax.itheima.net/api/weather",
    params: {
      city: cityCode
    }
  }).then(result => {
    const weatherData = result.data
    for(let k in weatherData)
    {
      if(k === "data")
      {

      }else if(k === "dayForecast")
      {
        const weatherList = weatherData[k].map(item => {
          return`<li class="item">          
                    <div class="date-box">            
                      <span class="dateFormat">${item.dateFormat}</span>            
                      <span class="date">${item.date}</span>          
                    </div>          
                    <img src="${item.weatherImg}" alt="" class="weatherImg">          
                    <span class="weather">${item.weather}</span>          
                    <div class="temp">            
                      <span class="temNight">${item.temNight}</span>-            
                      <span class="temDay">${item.temDay}</span>            
                      <span>℃</span>          
                    </div>          
                    <div class="wind">            
                      <span class="windDirection">${item.windDirection}</span>            
                      <span class="windPower">&lt;${item.windPower}</span>          
                    </div>        
                    </li>`
        })
        document.querySelector(".week-wrap").innerHTML = weatherList.join("")
      }else if(k === "todayWeather")
      {
        document.querySelector(".today-weather").innerHTML = `
      <div class="range-box">
        <span>今天:</span>
        <span class="range">
          <span class="weather">${weatherData[k].weather}</span>
          <span class="temNight">${weatherData[k].temNight}</span>
          <span>-</span>
          <span class="temDay">${weatherData[k].temDay}</span>
          <span>℃</span>
        </span>
      </div>
      <ul class="sun-list">
        <li>
          <span>紫外线</span>
          <span class="ultraviolet">${weatherData[k].ultraviolet}</span>
        </li>
        <li>
          <span>湿度</span>
          <span class="humidity">${weatherData[k].humidity}</span>%
        </li>
        <li>
          <span>日出</span>
          <span class="sunriseTime">${weatherData[k].sunriseTime}</span>
        </li>
        <li>
          <span>日落</span>
          <span class="sunsetTime">${weatherData[k].sunsetTime}</span>
        </li>
      </ul>`
      }else if(k === "weatherImg")
      {
        document.querySelector(`.${k}`).src = weatherData[k]
      }else
      {
        document.querySelector(`.${k}`).innerText = weatherData[k]
      }
    }
  }).catch(error => {
    console.log(error)
  })
}

getWeather("110111")  //默认获取北京天气


document.querySelector(".search-city").addEventListener("input", e => { //输入字符实时搜索城并返回列表
  myAxios({
    url: "https://hmajax.itheima.net/api/weather/city",
    params: {
      city: e.target.value
    }
  }).then(result => {
    document.querySelector(".search-list").innerHTML = result.data.map(item => {
      return `<li class="city-item" data-cityCode = "${item.code}">${item.name}</li>`
    }).join("")
  })
})

document.querySelector(".search-list").addEventListener("click", e => {   //列表点击再次搜索
  if(e.target.classList.contains("city-item"))
  {
    getWeather(e.target.dataset.citycode)
  }
})

 


http://www.kler.cn/a/530211.html

相关文章:

  • Ruby 模块(Module)
  • 【oracle】分组求最新日期的数据
  • 八、Spring Boot 日志详解
  • 5. 【Vue实战--孢子记账--Web 版开发】-- 主页UI
  • 抽象类与抽象方法详解
  • 愿景:做机器视觉行业的颠覆者
  • 12 向量结构模块(vector.rs)
  • 解决国内服务器 npm install 卡住的问题
  • 【课题推荐】基于t分布的非高斯滤波框架在水下自主导航中的应用研究
  • [Linux]如何將腳本(shell script)轉換到系統管理服務器(systemd service)來運行?
  • Hive之数据定义DDL
  • UE5 蓝图学习计划 - Day 7:摄像机与视角控制
  • 【爬虫】JS逆向解决某药的商品价格加密
  • 广度优先搜索算法笔记
  • 政务行业审计文件大数据高速报送解决方案
  • 跨越通信障碍:深入了解ZeroMQ的魅力
  • deep seek R1本地化部署及openAI API调用
  • 别做太远的规划
  • nodejs:express + js-mdict 网页查询英汉词典,能播放声音
  • 【数据分析】案例03:当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)
  • 【小鱼闪闪】做一个物联网控制小灯的制作流程简要介绍(图文)
  • OpenAI开源战略反思:中国力量推动AI产业变革
  • 【漫话机器学习系列】076.合页损失函数(Hinge Loss)
  • 【算法-位运算】位运算遍历 LogTick 算法
  • 基于机器学习鉴别中药材的方法
  • python小知识-jupyter lab