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

yizhihongxing

原生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日

相关文章

  • JSP学习之JavaBean用法分析

    JSP学习之JavaBean用法分析 什么是JavaBean JavaBean是指一种用Java语言编写的可重用组件,它是一个类,它具有以下特点: 必须有一个公共的无参构造函数(构造方法) 成员变量必须是私有的,并通过公共的getter/setter方法来访问 JavaBean通常用于表示数据模型,封装了应用程序中的数据,并通过getter/setter方法…

    Java 2023年6月15日
    00
  • JAVA内部类示例详解及练习

    下面我就来详细讲解一下“JAVA内部类示例详解及练习”的完整攻略。 什么是Java内部类 Java内部类(Inner Class)指的是定义在另一个类中的类。Java内部类可以分为四种类型:成员内部类、静态内部类、局部内部类、匿名内部类。其中,成员内部类是最常用的一种形式。 成员内部类示例 下面通过一个示例来详解一下成员内部类的定义和使用: public c…

    Java 2023年5月23日
    00
  • 初识Spring Boot框架和快速入门

    下面我就来详细讲解“初识SpringBoot框架和快速入门”的完整攻略。 一、什么是Spring Boot? Spring Boot是一个开源的框架,它是基于Spring 框架的基础上创建的一个快速开发的框架。它封装了大量的Spring框架相关的组件和工具,简化了Spring应用的初始化和开发过程,大大提高了开发效率和开发体验。 二、Spring Boot的…

    Java 2023年5月15日
    00
  • 基于使用递归推算指定位数的斐波那契数列值的解决方法

    对于求解指定位数的斐波那契数列值,可以使用递归的方式进行推算。具体步骤如下: 步骤一:确定递归函数的参数和返回值 斐波那契数列的递推公式为:F(n) = F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1。因此,当需要求解第n个斐波那契数列值时,可以将递归函数fib定义为接受一个整数n作为参数,返回一个整数作为结果。 def fib(n:…

    Java 2023年5月26日
    00
  • 详解Java中实现SHA1与MD5加密算法的基本方法

    当今网络环境中,安全性是非常重要的一个问题。密码的保护已经成为了一个必须面对的任务。SHA1和MD5是两种常见的加密算法,它们可以将密码字符串加密为一串看似随意的字符,从而实现密码的保护。在Java中,实现SHA1与MD5加密算法有以下基本方法: 1. 使用Java内置的MessageDigest类 MessageDigest是Java提供的安全类之一,它可…

    Java 2023年5月19日
    00
  • Spring rest接口中的LocalDateTime日期类型转时间戳

    当在Spring REST接口中使用LocalDateTime类型表示日期时,有时需要将其转换为时间戳格式(即Unix时间戳)。下面是一些步骤和示例,以帮助你完成这项任务: 1. 添加Joda-Time依赖 为了处理日期和时间,我们将使用Joda-Time库。要将其添加到Maven项目中,请将以下依赖项添加到pom.xml文件中: <dependenc…

    Java 2023年5月20日
    00
  • springboot 跨域配置类及跨域请求配置

    在Spring Boot应用程序中,我们可以使用跨域配置类来允许跨域请求。以下是Spring Boot跨域配置类及跨域请求配置的完整攻略: 添加依赖 在Spring Boot应用程序中,我们需要添加spring-boot-starter-web依赖。以下是一个Maven的示例: <dependency> <groupId>org.sp…

    Java 2023年5月15日
    00
  • maven的安装配置以及在IDEA中的配置图文教程

    让我为你详细讲解Maven的安装配置以及在IDEA中的配置图文教程吧。 1. Maven的安装配置: 1.1 下载Maven 首先,你需要从Maven 官网下载最新的稳定版本。下载完成后,解压到任何你喜欢的目录中(比如:/usr/local/maven/) 1.2 配置环境变量 编辑环境变量配置文件(/etc/profile)并添加以下内容: export …

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