[Mozilla]Ajax快速入门

Requests+BeautifulSoup网页爬虫实战:从入门到生产级部署 网页爬虫是获取公开网络数据的基础技术,其核心在于通过HTTP协议请求HTML资源,并解析结构化内容。Requests库负责可靠发起HTTP请求,BeautifulSoup专精于容错性HTML解析,二者结合构成轻量、稳定、易维护的静态页面采集方案。相比Selenium等浏览器自动化工具,该组合性能更高、依赖更少、调试更直观,广泛适用于电商比价、舆情监控、学术数据清洗等场景。本文聚焦Python 3.9环境下的工程化实践,涵盖User-Agent伪装、429限流应对、Session连接复用、CSS选择器精准提取 阅读详情

本文翻译于Mozilla Developer Network
翻译者:金云龙
原文地址:https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started

什么是 Ajax?

Ajax 的意思就是异步的 JavaScript 和 XML。简而言之,它是使用 XMLHttpRequest 对象与服务器端通信的脚本语言。它可以发送及接收各种格式的信息,包括 JSON、XML、HTML 和文本文件。Ajax 最为吸引人的就是它的“异步”特性,这意味着Ajax 可以无需刷新页面而与服务器端进行通信。允许你根据用户事件来更新部分页面内容。

可以考虑的两个特性:

  • 向服务器端发送请求,而不用重新加载页面。
  • 从服务器端接收数据并处理。

第一步:如何发送一个 HTTP 请求

需要通过 XMLHttpRequest 实现使用 JavaScript 向服务器端发送一个 HTTP 请求。而 Internet Explorer(IE)中引入一个名为XMLHTTP的ActiveX对象实现与 XMLHttpRequest 相同的功能,Mozilla、Safari 和其他浏览器则使用 XMLHttpRequest。

如果要兼容各个浏览器的话,可以这样来做:

var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ...
    httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE 6 and older
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}

注意:出于演示目的,上面创建 XMLHTTP 实例是简化了的代码。关于更加真实的例子,请参阅本文的第三步。

接下来,当接收到服务器端响应时,需要告诉 HTTP 请求对象使用 JavaScript 函数来处理响应。将 XMLHttpRequest 对象的 onreadystatechange 属性设置为该函数的名称,当请求的状态变化时,该函数会被调用。

httpRequest.onreadystatechange = nameOfTheFunction;

注意:该函数名没有传递参数的括号和参数,这表示只是分配了一个函数的引用,而不是真正调用该函数。当然,也可以动态定义一个匿名函数,这样可以实时地处理响应。

httpRequest.onreadystatechange = function(){
    // process the server response
};

在处理完服务器端的响应之后,我们就可以调用 XMLHttpRequest 对象的 open() 和 send() 方法向服务器端发送请求了。

httpRequest.open('GET', 'http://www.example.org/some.file', true);
httpRequest.send(null);
  • open() 方法的第一个参数:HTTP 请求方法 - GET、POST、HEAD 及任何服务器端支持的方法。根据 HTTP 标准保持大写,否则一些浏览器(例如火狐)可能无法处理请求。关于 HTTP 请求方法的更多信息,你可以查看W3C规范
  • open() 方法的第二个参数:请求的 URL。出于安全考虑,不能调用第三方域的页面内容。当调用 open() 方法时,一定确认使用相同域名内的页面,否则会得到“permission denied”的错误提示。常见的错误是使用 domain.tld 访问网站,却使用 www.domain.tld 来请求页面。如果真的需要发送一个请求到另一个域的话,可以查看 HTTP访问控制
  • open() 方法的第三个参数:可选,是否是异步请求。如果是 true(默认值),表示是异步请求。

send() 方法的参数表示当请求为 POST 时,向服务器端发送请求的数据内容。如果发送的是表单数据格式的话,服务器端可以向字符串一样地解析。

"name=value&anothername="+encodeURIComponent(myVar)+"&so=on"

向服务器端发送的数据格式也可以是 JSON、SOAP 等格式。

注意:如果使用 POST 方式发送数据的话,在调用 send() 方法前,需要设置请求的 MIME 类型。

httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

第二步:处理服务器端的响应

当发送请求时,已经定义了一个函数来处理响应。

httpRequest.onreadystatechange = nameOfTheFunction;

这个函数可以做什么呢?首先,该函数需要检查请求的状态。如果状态值为 4 的话,这表示接收到完成的服务器端响应,可以继续处理。

if (httpRequest.readyState === 4) {
    // everything is good, the response is received
} else {
    // still not ready
}

readyState的值列表如下:

  • 0 - 未初始化
  • 1 - 正在加载
  • 2 - 加载完毕
  • 3 - 交互中
  • 4 - 完成

接下来需要检查 HTTP 服务器端响应的状态代码,W3C网站 列出了所有的状态代码。下面的例子中,通过是否为 200 OK 的状态码来判断 Ajax 调用是否是成功的。

if (httpRequest.status === 200) {
    // perfect!
} else {
    // there was a problem with the request,
    // for example the response may contain a 404 (Not Found)
    // or 500 (Internal Server Error) response code
}

在检查了请求的状态和响应的状态码后,就可以接收服务器端发送的数据并处理。有两种选项访问这些数据:

  • httpRequest.responseText:将服务器端响应作为文本字符串返回
  • httpRequest.responseXML:将响应作为一个 XMLDocument 对象返回,该对象可以使用 JavaScript DOM 函数进行遍历。

注意,上述步骤只有异步请求(open() 方法的第三个参数设置为 true)时才是有效的。如果使用同步请求的话,是不需要指定函数的。在调用 send() 方法后就可以访问到服务器端返回的数据,因为脚本会停止并等待服务器端的响应。

第三步:一个简单的例子

下面来做一个简单的 HTTP 请求。JavaScript 将请求一个包含“I’m a test.”文本的“test.html”HTML 文档,然后使用alert() 方法打印 test.html 文件的内容。

<span id="ajaxButton" style="cursor: pointer; text-decoration: underline">
  Make a request
</span>
<script type="text/javascript">
(function() {
  var httpRequest;
  document.getElementById("ajaxButton").onclick = function() { makeRequest('test.html'); };

  function makeRequest(url) {
    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
      httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
      try {
        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
      } 
      catch (e) {
        try {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        catch (e) {}
      }
    }

    if (!httpRequest) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
    }
    httpRequest.onreadystatechange = alertContents;
    httpRequest.open('GET', url);
    httpRequest.send();
  }

  function alertContents() {
    if (httpRequest.readyState === 4) {
      if (httpRequest.status === 200) {
        alert(httpRequest.responseText);
      } else {
        alert('There was a problem with the request.');
      }
    }
  }
})();
</script>

在这个例子中:

  • 在浏览器中用户单击“Make a request”链接;
  • 事件处理器调用 makeRequest() 方法,通过向该函数传递的参数,请求一个处在同一目录中的“test.html”HTML 文件;
  • 请求后,(onreadystatechange)执行 alertContents() 方法;
  • alertContents() 方法用于检查如果正确地接收到响应,利用 alert() 方法打印“test.html”文件包含的内容。

注意:

  • 如果你发送一个请求后返回的是一段 XML 代码,而不是一个静态的 XML 文件的话,在 Internet Explorer 中必须设置一些响应头。如果没有设置响应头“Content-Type: application/xml”的话,当试图访问 XML 元素时 IE 将抛出一个 “Object Expected” 的 JavaScript 错误。
  • 如果没有设置头“Cache-Control: no-cache”的话,浏览器将缓存响应并不会重新提交请求。可以添加像时间戳或一个随机数的不同 GET 请求参数(参考 bypassing the cache)。
  • 如果 httpRequest 变量是全局的,makeRequest() 方法因为冲突可能会被重写。将 httpRequest 变量定义在一个闭包中的话,可以避免 Ajax 函数的冲突。
  • 如果出现通信错误(如服务器端被关闭),当试图访问状态字段时在 onreadystatechange 的方法中将会抛出一个异常。确保 if 语句声明在 try…catch 语句中。
function alertContents() {
  try {
    if (httpRequest.readyState === 4) {
      if (httpRequest.status === 200) {
        alert(httpRequest.responseText);
      } else {
        alert('There was a problem with the request.');
      }
    }
  }
  catch( e ) {
    alert('Caught Exception: ' + e.description);
  }
}

第四步:使用 XML 进行响应

在前面的例子中,当接收到响应后使用 XMLHttpRequest 对象的 responseText 属性访问“test.html”文件包含的内容。现在尝试一下 responseXML 属性。

首先,创建一个用于请求的名为“test.xml”的有效 XML 文档,代码如下:

<?xml version="1.0" ?>
<root>
    I'm a test.
</root>

在脚本中,只需要修改请求行:

οnclick="makeRequest('test.xml')"

然后在 alertContents() 方法中,需要使用如下代码替换 alert(httpRequest.responseText); 这一行代码:

var xmldoc = httpRequest.responseXML;
var root_node = xmldoc.getElementsByTagName('root').item(0);
alert(root_node.firstChild.data);

这段代码需要由 responseXML 给予的 XMLDocument 对象,然后使用 DOM 方法来访问 XML 文档中的数据。

第五步:处理数据

最后,向服务器端发送一些数据并接收响应。这次 JavaScript 脚本请求一个动态页面“test.php”,该页面将根据发送的数据返回一个“computedString”-“Hello, [user data]!”,并使用 alert() 方法进行打印。

首先,向 HTML 页面中添加一个文本框,用户可以通过该文本框输入他们的名字:

<label>Your name: 
  <input type="text" id="ajaxTextbox" />
</label>
<span id="ajaxButton" style="cursor: pointer; text-decoration: underline">
  Make a request
</span>

还需要添加一行事件处理器用于从文本框获取用户的数据,并将该数据随着 URL 传递给 makeRequest() 方法:

document.getElementById("ajaxButton").onclick = function() { 
	var userName = document.getElementById("ajaxTextbox").value;
	makeRequest('test.php',userName); 
}

修改 makeRequest() 方法用于接收用户数据并发送给服务器端。将请求方式从 GET 修改为 POST,用户数据作为参数传递给 httpRequest.send() 方法:

function makeRequest(url, userName) {

	...

	httpRequest.onreadystatechange = alertContents;
	httpRequest.open('POST', url);
	httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	httpRequest.send('userName=' + encodeURIComponent(userName));
}

alertContents() 方法可以向第三步一样利用 alert() 方法打印服务器端返回的数据。假设服务器端返回的是 computedString 和用户数据的话,如果用户在文本框中输入“Jane”服务器端响应的内容会像是这样:

{“userData”:“Jane”,“computedString”:“Hi, Jane!”}

在 alertContents() 方法中使用这些数据,不仅可以使用 alert() 方法打印 responseText 的内容,还可以将其解析并打印 computedString 属性内容:

function alertContents() {
  if (httpRequest.readyState === 4) {
    if (httpRequest.status === 200) {
      var response = JSON.parse(httpRequest.responseText);
      alert(response.computedString);
    } else {
      alert('There was a problem with the request.');
    }
  }
}
手机拍照也能玩高光谱?教你用TensorFlow Lite在Android上实现实时RGB转高光谱 本文介绍了如何利用TensorFlow Lite在Android设备上实现实时RGB到高光谱的图像重构技术。通过深度学习模型优化和移动端部署策略,使智能手机具备专业级光谱分析能力,适用于农业检测、化妆品分析等多个领域。 阅读详情

相关推荐

Camera Sensor接口协议全解析(六)聚焦onsemi HiSPi接口的技术突破与应用实践

摘要: Onsemi HiSPi是一种高速并行接口协议,专为高分辨率图像传感器设计,具备1600 Mbps传输速率、低功耗和高兼容性特点。通过对比DVP、MIPI CSI-2等主流协议,HiSPi在工业/医疗领域表现突出,支持动态功耗控制、多ROI和CRC校验。其创新架构包含多PHY设计,提供分组SP、流SP等多种工作模式,满足灵活传输需求。实际应用中,HiSPi在PCB缺陷检测(5μm精度)和液晶面板检测(0.3% Mura检出率)等场景展现卓越性能,成为高速成像领域的关键技术。

GateWorld的博客 1435

使用Mozilla Persona认证用户的指南

到目前为止,只有Twitter和Facebook身份验证,我决定将Mozilla Persona添加到我最新项目( 计算机 ,计算机生成的音乐)的列表中。 为什么? 我喜欢尝试新事物 存储密码是一个艰巨的过程,尽管我知道该怎么做,甚至大部分代码都写在另一个项目中,但我认为我不应该为每个需要密码认证的站点做出贡献 Mozilla是一个开放的基金会,迄今为止已经产生了许多出色的产品...

最佳 Java 编程 533

科研绘图神器Origin2024最新中文版安装教程:5分钟搞定所有配置

本文提供了一份详细的Origin2024中文版安装与配置指南。从系统环境核查、安装包获取验证,到分步安装、语言切换及关键初始设置,手把手教你5分钟完成所有基础配置。同时,指南还分享了首次启动后的个性化设置与高效绘图工作流,助你快速上手这款科研绘图神器,提升数据处理与图表制作效率。

weixin_29247219的博客 1041

Ajax开发框架

 来自优快云读书频道 >最近在看这本书,再优快云找到这些内容,贴过来了基于浏览器的应用框架(Application Frameworks)1.Bindows参考网址:http://www.bindows.net/Bindows是一个通过DHTML、JavaScript、 CSS和HTML等技术强劲联合起来的完整的Windows桌面式Web应用程序解决方案。它无需下载安装客户端支持组

可乐_Blog 1767

1.3-----Simplify 3D切片软件:从新手困惑到高效打印的进阶设置指南

本文详细介绍了Simplify 3D切片软件在大型模型打印中的高效设置技巧,包括切片效率、支撑结构智能生成和精细参数调节等核心优势。通过实战案例和进阶参数设置指南,帮助用户从新手快速进阶到高效打印,显著提升3D打印质量和效率。

weixin_42552716的博客 422

离散数学期末考试试卷(两套)-熟悉题型

3.设集合A={a,b,c,d}上有自反关系R={,,,,},对称关系S={,,,}。6.设集合A={1,2,3},B={u,v,w},C={a,b,c},f是集合A到集合B上的映射,g是集合B到集合C上的映射,f={, , },g={},则复合函数g。5. 设集合A={a,b,c,d,e},下列选项中哪一个集合不是A的划分( )。

muse3159546973的博客 6956

AJAX的简单介绍

AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 ajax不是新的编程语言,而是一种使用现有标准的新方法。ajax是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。 ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少...

天予不洗头的博客 302

EtherCAT主站SOEM -- 29 -- STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈

以上就是EtherCAT主站SOEM – 29 – STM32F767-SOEM通过 CSP模式(周期同步位置模式)控制一个电机转圈圈的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 2239

国外persona用户画像_使用Mozilla Persona验证用户的指南

国外persona用户画像 到目前为止,只有Twitter和Facebook身份验证,我决定将Mozilla Persona添加到我最新项目( 计算机 ,计算机生成的音乐)的列表中。 为什么? 我喜欢尝试新事物 存储密码是一个艰巨的过程,尽管我知道该怎么做,甚至大部分代码都写在另一个项目中,但我认为我不应该为每个需要密码认证的站点做出贡献 Mozilla是一个开放的基金会,迄今为...

最佳 Java 编程 641

基于STM32+OneNet设计的物联网智慧路灯(100)

本次设计的智能路灯采用STM32芯片和OneNet物联网平台进行连接,开发出支持太阳能充电锂电池供电、GPS定位上传位置信息、手动/自动控制路灯开关、环境光照调节、红外传感器检测周围人员、空气质量监测等多项功能。同时,当路灯发生异常情况时,系统可以自动发送邮件或短信到指定邮箱或电话。

7725

白话机器学习算法理论+实战番外篇之Xgboost

1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等 无监督算法:聚类,降维,关联规则, PageRank等 我前面已经尝试用最白话的语言完成了一个白话机器学习算法理论+实战系列,这个系列已经基本包含了上面这些算...

Miracle8070 1万+

ajax的简单介绍

 AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。   ajax不是新的编程语言,而是一种使用现有标准的新方法。ajax是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。   ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。   ajax是一种用于创建快速动态网页的...

aaazzz190332的博客 154

Windows 11 安装 OpenClaw(龙虾):不用WSL、不用虚拟机、启动、使用、停止、卸载

本文详解 Windows 11 原生安装 OpenClaw(龙虾)全流程,无需 WSL 或虚拟机。涵盖环境配置、安全警示、模型接入(如通义千问)及技能初始化。提供启动、文件自动化操作、停止与卸载的完整指南,并附常见认证过期解决方案。助您快速部署本地 AI 智能体,实现电脑操作自动化,提升工作效率。

寒水馨 · 轻量级技术文档 · hanshuixin.org 899

ajax toolkit framework 开发 dojo 应用,探索Eclipse的Ajax Toolkit Framework

【IT168技术文档】ATF 位于 Eclipse WTP 的顶部,WTP 在 Web 开发社区中使用得十分广泛。WTP 通过添加用于开发 Java™ 2 Platform,Enterprise Edition (J2EE) Web 应用程序的工具扩展了 Eclipse。ATF 通过为各种开发源码的 Ajax 工具包(包括 Dojo、Zimbra 和 Rico)添加 Ajax 开发环境扩展了 WT...

weixin_29774611的博客 241

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

AJAX

这里我整理的是一些有关于AJAX的知识点,不妥之处还望见谅。欢迎广大博友交流! AJAX 一、什么是AJAX 局部刷新(无刷新) :节省网络带宽资源,减轻webServer负担;交互连贯 不会做页面的跳转。          AJAX的全称是Asynchronous JavaScript and XML(异步的JavaScript 和 XML)。   ajax不是新的编

sunshinewx1的博客 623

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

使用AJAX的几种理由

公开标准 让我们从第一条开始,AJAX技术是基于被各大浏览器和平台都支持的公开标准的技术。这意味着该技术不怕技术提供商的技术封锁。组成AJAX技术的大多数技术都能放心的使用很多年,而那些不是热点的、最新的和未经考验的技术只能使用一段时间。现在,对于绝大多数的用户和企业来说,浏览器是一个可信任的应用平台,这在五年前就不是个问题了。对于AJAX来说,FIREFOX浏览器的基础Mozilla 1.

m13286282的专栏 1259

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Ajax 浅析

Ajax 即“AsynchronousJavascriptAndXML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 该技术在 1998 年...

大西瓜不甜的博客 204

一个要钱的ajax框架zumipage

偶然发现一个ajax框架,其中里面宣传,基本不用什么AJAX知识,包括JAVASCRIPT的,已经封装好了,可惜要钱咯,嘿,各位高手有办法的可以破掉它,用起来还挺高效的哦http://www.zumipage.com/default.htm部分介绍:zumiPage makes it easy to build rich, interactive web-based applicationsWit...

weixin_34413065的博客 92

Mozilla 抱怨新版油管偏心 Chrome;谷歌发布自己的物理安全密钥

(点击上方蓝字,快速关注我们)转自:开源中国、solidot、cnBeta、腾讯科技等0、Mozilla 抱怨谷歌偏心! 火狐/Edge 加载 YouTube 缓慢去年五...

redditnote的博客 163

AJAX(第一部分:Ajax简介)

Ajax由HTML、JavaScript技术、DHTML和DOM组成,这一杰出的方法可以将笨拙的Web界面转化成交互性的Ajax应用程序。 Ajax应用程序所用到的基本技术: HTML用于建立Web表单并确定应用程序其他部分使用的字段 JavaScript代码是运行Ajax应用程序的核心代码,帮助改进与服务器应用程序的通信。 DHTML或Dynamic HTML,用于动态更新表单。

yangxiaodong1989的专栏 469

喜欢Ajax的十大理由

保守来说,AJAX在现在是热得不能再热的技术。没有人能否认,它拥有大批的支持者。在CNN上,它从二月份的一个不被看好的词语到十月份成长成一个初具雏形的技术。所以,有必要要看看为什么AJAX能发展成为现在的样子,为什么它能不断成长,并且在短的时间内迅速变得无处不在。所以,我用午夜谈话的风格,来给出需要AJAX技术的十大理由。 使用AJAX的十大理由: 1 基于公开标准。 2 以可用性和用户体验...

java开发指南博客 【转载】 84

十大免费教程资源帮助新手快速学习JavaScript

  “JavaScript”的名头相信大家肯定是耳熟能详,但只有一小部分人群了解它的使用与应用程序构建方式。这“一小部分”人指的当然是技术过硬的有为青年、网络程序员以及IT专业人员。但对于一位新手或者说外行人而言,“JavaScript”只不过是复杂计算机编程学科当中的另一个不知所云的术语。 那么,JavaScript到底是什么? 如果各位拥有在计算机领域的工作经验,那么绝对不能错过强大的Java...

weixin_33713350的博客 253

ICEfaces

 ICEfaces  ICEfaces是一个基于Ajax的JSF开发框架。ICEfaces原本是一个商业产品,现已开源基于Mozilla Public License发布。它提供一整套完整的Java EE应用程序开发组件,能够帮助开发人员用纯Java(not JavaScript)快速开发瘦客户端胖互联网应用程序(Rich Internet Applications:RIA)。可通过其提供的...

178

布兰登·艾克:10天创造JavaScript,却改变了整个Web世界

布兰登·艾克:10天创造JavaScript,却改变了整个Web世界

Code_流苏:在代码中寻诗意,在实践中觅真知 225

Moblin项目:Moblin浏览器目标及优缺点

 浏览器目标本项目的主要目标是为基于Intel处理器的平台提供具有PC品质的富Internet体验。为实现这个目标,Moblin浏览器将具有如下特性:l         一个基于Mozilla的浏览器。l         高度优化以实现良好性能和强大功能。l         在小屏幕设备上,提供简单的UI和对Web内容的快速导航。我们需要特别关注在小屏幕设备上还难以实现的基本操作,如进入URL、管

chengyongli的专栏 954
上一篇: 搞懂什么是Node.js原来这么简单
下一篇: 本地配置多个 Git 账户信息,满足不同的 Git 平台
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值