AJAX笔记原理篇

news/2025/2/3 13:08:54 标签: 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.niftyadmin.cn/n/5840837.html

相关文章

Vue 2 项目中 Mock.js 的完整集成与使用教程

Vue 2 实现 Mock.js 使用教程 1. 背景与问题 前端开发常常会遇到与后端开发的时间同步问题&#xff0c;尤其是在后端接口未完成或不稳定的情况下&#xff0c;前端开发无法继续下去&#xff0c;这会极大地影响项目进度。为了有效地解决这一问题&#xff0c;Mock.js 提供了一个极…

DeepSeek的出现对全球GPT产业产生的冲击

引言 近年来&#xff0c;人工智能技术的迅猛发展推动了自然语言处理&#xff08;NLP&#xff09;领域的革命性进步。特别是以GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型为代表的大规模预训练语言模型&#xff0c;已经在全球范围内引发了广泛关注…

Python 网络爬虫实战:从基础到高级爬取技术

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 网络爬虫&#xff08;Web Scraping&#xff09;是一种自动化技术&#xff0c;利用程序从网页中提取数据&#xff0c;广泛…

在 Ubuntu 中使用 Conda 创建和管理虚拟环境

Conda 是一个广泛使用的包管理和环境管理系统&#xff0c;尤其适用于数据科学和 Python 开发。本文将指导你如何在 Ubuntu 系统中安装 Conda 并创建基于 python3.11 的虚拟环境。 1. 安装 Miniconda 或 Anaconda 方法 1&#xff1a;下载并安装 Miniconda Miniconda 是一个轻量…

使用朴素贝叶斯对自定义数据集进行分类

准备自定义数据集 首先&#xff0c;需要一个自定义数据集来进行分类。创建一个简单的二维数据集&#xff0c;其中每个样本有两个特征&#xff0c;并且属于两个类别之一。 import numpy as np import pandas as pd# 创建自定义数据集 np.random.seed(42) num_samples 100# 生…

浅析DDOS攻击及防御策略

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求&#xff0c;耗尽其资源&#xff0c;从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性&#xff0c;使攻击规模更大、影响范围更广…

Windows上的本地化部署通义千问qwen,含API调用流式和非流式调用demo

Ollama是一个强大的工具&#xff0c;可以帮助你在本地轻松部署和管理大语言模型&#xff0c;如qwen。以下是在Windows系统上使用Ollama安装和部署qwen的详细步骤。 一、安装Ollama &#xff08;一&#xff09;下载Ollama&#xff08;或者用我的网盘链接下载&#xff09; 通过…

JAVA安全—反射机制攻击链类对象成员变量方法构造方法

前言 还是JAVA安全&#xff0c;哎&#xff0c;真的讲不完&#xff0c;太多啦。 今天主要是讲一下JAVA中的反射机制&#xff0c;因为反序列化的利用基本都是要用到这个反射机制&#xff0c;还有一些攻击链条的构造&#xff0c;也会用到&#xff0c;所以就讲一下。 什么是反射…