原生Ajax之全面了解xhr的概念与使用

原生Ajax之全面了解xhr的概念与使用

什么是Ajax?

Ajax是指使用JavaScript、XMLHttpRequest对象、DOM、CSS等技术在不刷新页面的情况下实现异步更新页面数据的一种技术。我们通常使用Ajax来实现动态加载数据、实时交互等功能。

XMLHttpRequest对象

XMLHttpRequest对象是Ajax的核心之一。它是浏览器提供的一个对象,使用该对象可以和服务器进行异步通信。

XMLHttpRequest对象的创建和使用

我们可以使用以下代码创建一个XMLHttpRequest对象:

var xhr = new XMLHttpRequest();

接下来,我们需要给XMLHttpRequest对象设置一些参数和事件监听器,然后向服务器发送请求。

常见的XMLHttpRequest对象的API:

  • open(method, url, async): 设置请求方式、请求URL和请求是否异步。
  • setRequestHeader(name, value): 设置请求头信息。
  • send(data): 发送请求数据。

以下是一个完整的使用XMLHttpRequest对象向服务器发送请求并获取响应的示例:

var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/user', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    var response = xhr.responseText;
    console.log(response);
  }
};
xhr.send();

在此示例中,我们向服务器发送了一个GET请求,请求的URL为/api/user,请求方式是异步的。同时,我们设置了一个请求头信息,即Content-Type为application/json。当服务器返回响应后,触发onreadystatechange事件,我们通过判断状态码(readyState为4表示请求已完成,status为200表示请求成功)来获取响应数据。

使用Promise封装XMLHttpRequest对象

为了避免代码嵌套过深而难以阅读,我们可以使用Promise封装XMLHttpRequest对象。

以下是一个使用Promise封装XMLHttpRequest对象的示例:

function request(method, url, data = null, headers = {}) {
  return new Promise(function(resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open(method, url, true);
    Object.keys(headers).forEach(function(name) {
      xhr.setRequestHeader(name, headers[name]);
    });
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        if (xhr.status >= 200 && xhr.status < 300) {
          resolve(xhr.response);
        } else {
          reject(new Error(xhr.statusText));
        }
      }
    };
    xhr.onerror = function() {
      reject(new Error('Network Error'));
    };
    xhr.send(data);
  });
}

我们封装了一个request方法,该方法接受method、url、data和headers作为参数。在方法体内部,我们创建了一个XMLHttpRequest对象,同时设置了一些请求参数和响应事件监听器。当请求完成后,如果响应状态码在200到299之间,我们将响应数据通过Promise的resolve方法返回;否则,我们将请求错误通过Promise的reject方法返回。

示例一:使用Ajax实现动态加载列表数据

假设我们有一个列表页面,需要通过Ajax从后端获取数据并动态地渲染到页面上。

首先,我们需要创建一个接口用于获取数据。我们将使用Node.js创建一个基于Express框架的简单服务器,返回一个JSON格式数据。

var express = require('express');
var app = express();

app.get('/api/list', function(req, res) {
  var data = [
    {name: 'Alice', age: 20},
    {name: 'Bob', age: 21},
    {name: 'Charlie', age: 22}
  ];
  res.json(data);
});

app.listen(3000, function() {
  console.log('Server listening on port 3000.');
});

接着,我们可以在前端页面中使用Ajax发送请求,获取数据,然后动态地渲染到页面上。

<!DOCTYPE html>
<html>
<head>
  <title>Ajax示例一</title>
</head>
<body>
  <ul id="list"></ul>
  <script>
    function getList() {
      var xhr = new XMLHttpRequest();
      xhr.open('GET', '/api/list', true);
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
          var data = JSON.parse(xhr.responseText);
          var html = '';
          data.forEach(function(item) {
            html += '<li>' + item.name + ', ' + item.age + '</li>';
          });
          document.getElementById('list').innerHTML = html;
        }
      };
      xhr.send();
    }
    getList();
  </script>
</body>
</html>

在该示例中,我们创建了一个GET请求,请求URL为/api/list。当获取到响应数据后,我们将数据动态地渲染到页面上。

示例二:使用Ajax实现图片上传

假设我们有一个上传图片的功能,需要通过Ajax上传图片并实时地将上传进度显示到页面上。

首先,我们需要在HTML页面中添加一个上传文件的表单,并添加一个用于显示上传进度的进度条。

<!DOCTYPE html>
<html>
<head>
  <title>Ajax示例二</title>
</head>
<body>
  <form enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">上传</button>
    <progress id="progress" value="0" max="100"></progress>
  </form>
  <script>
    var form = document.querySelector('form');
    var progress = document.getElementById('progress');

    form.addEventListener('submit', function(event) {
      event.preventDefault();

      var xhr = new XMLHttpRequest();
      xhr.open('POST', '/api/upload', true);
      xhr.setRequestHeader('Content-Type', 'multipart/form-data');
      xhr.upload.onprogress = function(event) {
        if (event.lengthComputable) {
          progress.value = (event.loaded / event.total) * 100;
        }
      };
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
          alert('文件上传成功!');
        }
      };
      xhr.send(new FormData(form));
    });
  </script>
</body>
</html>

在该示例中,我们创建了一个POST请求,请求URL为/api/upload。同时,我们使用FormData对象将文件数据和表单数据一起发送到服务器端。当上传进度发生变化时,我们将进度实时地显示到页面上。

接着,我们需要在Node.js服务器端接收请求,并存储上传的文件。

var multer = require('multer');
var upload = multer();

app.post('/api/upload', upload.single('file'), function(req, res, next) {
  var file = req.file;
  console.log(file);
  res.send('文件上传成功!');
});

我们使用了Node.js的multer库来处理文件上传。当上传完成后,我们将返回一个简单的成功消息。

注:在实际开发中,为了保证上传的安全性,可以对上传的文件做一些文件类型、文件大小等方面的限制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生Ajax之全面了解xhr的概念与使用 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • SpringMVC中@controllerAdvice注解的详细解释

    下面是关于SpringMVC中@controllerAdvice注解的详细解释。 一、什么是@controllerAdvice注解 在SpringMVC中,@ControllerAdvice注解用于标记一个类,该类则被用于定义一些全局控制器Advice。这个注解使用的类可以包含@ExceptionHandler、@InitBinder和@ModelAttri…

    Java 2023年5月16日
    00
  • SpringBoot LocalDateTime格式转换方案详解(前端入参)

    这里给您详细讲解一下Spring Boot中 LocalDateTime 格式转换的方案。 背景 在 SpringBoot 项目中,我们有时需要从前端请求参数里获取 LocalDateTime 类型的参数,但是前端传递过来的字符串格式不一定符合 LocalDateTime 的格式,这时就需要对这些字符串进行解析和转换。 解决方案 SpringBoot 提供了…

    Java 2023年5月20日
    00
  • Eclipse如何导入Maven项目详解(新手初学)

    Eclipse如何导入Maven项目详解(新手初学) 对于新手初学者来说,使用Eclipse导入Maven项目并不是一件容易的事。下面将详细讲解如何导入Maven项目。 步骤一:安装Maven插件 在Eclipse中安装Maven插件,插件名称为”Maven Integration for Eclipse”。安装方法如下: 打开Eclipse,点击“Help…

    Java 2023年5月20日
    00
  • 详解HTTP请求与响应基础及实例

    详解HTTP请求与响应基础及实例 HTTP是一种用于网络传输的协议,它定义了客户端和服务器之间进行通信的规则。在HTTP通信过程中,客户端向服务器发送请求,服务器则对请求进行处理并返回响应,由此构成了HTTP请求和响应的基础。 HTTP请求 HTTP请求由三部分构成:请求行、请求头和请求体。其中,请求行包含请求的方法、URI和HTTP版本号,请求头包含了请求…

    Java 2023年5月20日
    00
  • ajax动态赋值echarts的实例(饼图和柱形图)

    我将详细讲解“ajax动态赋值echarts的实例(饼图和柱形图)”的完整攻略。以下是具体步骤: 准备工作 在HTML文件中引入ECharts的JS文件和相应的主题文件 <!– 引入ECharts插件的JS库 –> <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4…

    Java 2023年6月15日
    00
  • crawler4j抓取页面使用jsoup解析html时的解决方法

    以下是“crawler4j抓取页面使用jsoup解析html时的解决方法”的完整攻略。 问题描述 在使用crawler4j抓取网页并使用jsoup解析HTML时,可能会出现以下问题:1. 无法解析一些页面,出现NullPointerException。2. 解析的结果与实际页面不符。 解决方法 为了解决上述问题,我们可以做以下几步。 步骤一:设置User-A…

    Java 2023年5月20日
    00
  • Java并发编程的作用是什么?

    Java并发编程的作用 简介 Java并发编程能够提高程序的执行效率和程序的并发性,充分利用多核处理器的能力,提高系统的吞吐量和响应时间,保证程序的线程安全,确保程序数据的正确性。 Java并发编程是基于线程的,通过多线程的方式来实现并发编程,Java提供了一系列的并发包,例如java.util.concurrent包用于并发编程和并行编程,提供了一些用于原…

    Java 2023年5月11日
    00
  • 49个Spring经典面试题总结(附带答案)

    着手准备 首先,要对本文提到的49个Spring相关面试题有一定的了解。 其次,要清楚掌握Spring框架的核心概念和基础知识。 最后,要结合面试框架,将知识点学以致用,深入理解每个问题,适当练习,加深印象,提升答案的质量。 问题类型详解 Bean的定义,作用域、生命周期等问题 解释Spring中Bean的定义,Spring Bean的作用域、生命周期等问题…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部