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

相关文章

  • SpringBoot Application核心注解详解

    SpringBoot Application核心注解详解 Spring Boot是一个流行的Java框架,可以帮助开发人员更加高效地构建和部署应用程序。在Spring Boot中,@SpringBootApplication是一个核心注解,用于标记Spring Boot应用程序的入口点。本文中,我们将详细讲解@SpringBootApplication注解的…

    Java 2023年5月15日
    00
  • JDBC核心技术详解

    JDBC核心技术详解 JDBC(Java Database Connectivity)是Java语言访问关系型数据库的标准规范,其提供了一组API,以便于Java程序员在应用层面上来操作数据库。 JDBC驱动类型 JDBC驱动是连接Java应用程序和数据库的桥梁,根据其实现方式的不同,可以分为以下四种类型: JDBC-ODBC桥接式驱动 这种驱动实现的原理是…

    Java 2023年5月20日
    00
  • 浅谈springmvc的DispatcherServlet分析

    浅谈SpringMVC的DispatcherServlet分析 SpringMVC是一种基于MVC模式的Web框架,它可以帮助我们快速开发Web应用程序。在SpringMVC中,DispatcherServlet是一个核心组件,它负责接收所有的HTTP请求,并将请求分发给相应的处理器。本文将详细讲解SpringMVC的DispatcherServlet,并提…

    Java 2023年5月17日
    00
  • SpringBoot通过整合Dubbo解决@Reference注解问题

    一、SpringBoot整合Dubbo 利用Dubbo作为RPC(远程过程调用)传输框架,可以将服务分成消费方和提供方两个角色,而Dubbo根据角色的不同提供了不同的注解方式来实现。在消费方和提供方都使用Dubbo的情况下,SpringBoot整合Dubbo优势更加明显。 二、Dubbo @Reference 注解问题 Dubbo的注解@Reference可…

    Java 2023年5月19日
    00
  • Java Spring的数据库开发详解

    Java Spring的数据库开发详解攻略 Java Spring提供了便捷的工具来连接数据库,并且可以轻松地对数据库进行操作。下面是Java Spring进行数据库开发的详细攻略。 步骤一:配置数据源 在Spring Boot应用中,我们可以通过Spring的依赖管理器来添加数据库连接器。在配置文件(application.properties或appli…

    Java 2023年6月2日
    00
  • Ajax读取数据之分页显示篇实现代码

    Ajax是一种在Web应用程序中创建异步请求的技术。本篇攻略将演示如何使用Ajax读取数据并分页显示。 实现步骤 1.后端:编写接口,提供数据。 2.前端:使用Ajax从后端读取数据并展示。 3.前端:实现分页逻辑。 下面是这些步骤的详细说明。 编写接口 我们需要提供一个接口来获取数据。可以使用PHP、Java或任何其他后端编程语言编写接口。下面是一个使用P…

    Java 2023年6月15日
    00
  • Java代码是如何被CPU狂飙起来的

    Java代码是如何被CPU狂飙起来的 当Java代码被编译成字节码之后,需要被虚拟机解释执行。对于常见的Oracle JDK,虚拟机的实现是HotSpot VM。HotSpot VM为了提升程序的性能,包含了即时编译器(JIT)。 在执行Java代码的过程中,HotSpot VM会对一些热点代码进行监控,这些热点代码包括被频繁调用和执行时间较长的方法或循环等…

    Java 2023年5月19日
    00
  • struts2静态资源映射代码示例

    下面是关于“struts2静态资源映射代码示例”的完整攻略。 什么是struts2静态资源映射? struts2有一个默认的静态资源映射器,会将静态资源(例如图片、CSS、JavaScript文件等)映射到web应用的根目录下,从而可以在浏览器中通过相对路径来访问。 但是,有时候我们需要将这些静态资源放到web应用的其他目录中,或者更改其访问路径,这时就需要…

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