《锋利的 jQuery 代码》:精通jQuery的编程指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:《锋利的 jQuery 代码》是一本深入讲解jQuery应用的指南,覆盖了jQuery的基础和高级特性。本书通过实例教程,指导读者掌握如何使用jQuery提升网站用户体验。内容包括选择器的使用、DOM操作、事件处理、动画和效果的实现、AJAX应用和插件开发,以及与前端框架的整合与性能优化等。本书适合初学者和进阶者,帮助他们有效利用jQuery创造丰富交互的网页。 jquery

1. jQuery核心概念与选择器

在第一章中,我们将探讨jQuery的基础知识,特别是核心概念与选择器,它是学习jQuery的基础。jQuery是一个快速且简洁的JavaScript库,它封装了JavaScript的常见操作,简化了DOM操作、事件处理、动画和Ajax交互。

jQuery核心概念

jQuery首先是一个库,它提供了一系列预定义的函数和方法,开发者可以轻松地调用这些方法来实现复杂的功能。它的核心特性包括:

  • 简化了DOM文档遍历和操作
  • 提供了一致的跨浏览器事件处理
  • 提供了动画和视觉效果的简便方法
  • 简化了Ajax调用和JSON数据处理

jQuery选择器基础

选择器是jQuery的核心部分之一,它允许开发者使用CSS选择器语法来选取和操作DOM元素。

  • 基本选择器:如 $(‘element’) , $(‘.class’) , $(‘#id’) ,分别用于选择元素、类和ID。
  • 层叠选择器:如 $(‘element, .class, #id’) , 用于同时选择多个元素。
  • 过滤选择器:如 $(‘li:first’) , $(‘tr:odd’) , 分别用于选择第一个 <li> 元素和所有奇数行的 <tr> 元素。

理解并熟练使用这些选择器是掌握jQuery的第一步。随后的章节将深入探讨如何创建自定义选择器以及如何利用选择器进行高效DOM操作。

2. jQuery自定义选择器与元素操作

2.1 自定义选择器的创建与应用

2.1.1 理解自定义选择器的必要性

在开发中,我们经常面临需要频繁选择特定结构或特定属性的元素,原生的CSS选择器虽然强大,但有时并不能满足所有场景的需求。为了提高代码的可读性和复用性,自定义选择器变得十分必要。自定义选择器可以在jQuery的基础上,根据特定的规则选取DOM元素,这使得元素选择工作更加高效和直观。

2.1.2 创建自定义选择器的步骤

创建一个自定义选择器的基本步骤可以分为以下几个环节:

  1. 定义选择器函数 :在jQuery命名空间下定义一个新的函数,该函数即为我们的自定义选择器。
  2. 内部实现逻辑 :函数内部采用jQuery的过滤方法,如 .filter() ,对现有的jQuery对象进行筛选。
  3. 返回结果 :函数应当返回一个jQuery对象,这个对象只包含经过筛选的DOM元素集合。
  4. 使用自定义选择器 :一旦定义了自定义选择器,就可以通过 $() 函数和自定义的函数名来调用它。

示例代码如下:

$.extend({
  // 自定义选择器的定义
  customSelector: function (criteria) {
    return this.filter(function() {
      // 实现筛选逻辑
      return $(this).attr('data-criteria') === criteria;
    });
  }
});

// 使用自定义选择器
$(document).ready(function() {
  $('div').customSelector('highlight').css('color', 'red');
});

2.1.3 实际应用案例分析

考虑一个常见的场景:我们需要选取页面上所有包含特定数据属性 data-custom 的元素,并为其添加背景色。这时,可以创建一个专门用于这个目的的自定义选择器:

// 定义自定义选择器
$.extend({
  myCustomSelector: function() {
    return this.filter("[data-custom]");
  }
});

// 应用自定义选择器
$(document).ready(function() {
  // 选择所有具有data-custom属性的元素,并执行操作
  var $customEls = $('body').myCustomSelector();
  $customEls.css('background', 'lightgray');
});

通过上述代码,我们创建了一个 myCustomSelector 自定义选择器,它能够选取所有 data-custom 属性的元素,然后我们将这些元素的背景色统一设置为浅灰色。

2.2 元素操作技巧

2.2.1 元素的选取与过滤方法

在jQuery中,选取元素是操作的第一步。除了基本的选择器之外,jQuery还提供了一系列的过滤器方法,如 .first() , .last() , .eq(index) , .filter(callback) 等,这些方法可以精确地获取我们需要的元素。

2.2.2 元素属性与样式的操作技巧

一旦选取了元素,我们经常需要对其属性和样式进行操作。jQuery为此提供了大量的方法,例如: - .attr(name, value) - 用于获取或设置元素的属性值。 - .prop(name, value) - 用于获取或设置元素的属性值,尤其是那些布尔属性值。 - .css(name, value) - 用于获取或设置元素的样式属性。

2.2.3 实践:构建动态内容交互元素

让我们通过一个实际案例来展示如何结合这些选择器和操作方法来构建一个动态交互的列表元素。假设我们有一个待办事项列表,需要添加以下功能:

  • 为未完成的任务添加一个“待完成”的标记。
  • 当鼠标悬停在任务上时,显示该任务的详细描述。
  • 点击任务时,切换任务的完成状态。
// 为未完成的任务添加待完成标记
$('.task unfinished').append('<span class="status">未完成</span>');

// 鼠标悬停显示详细描述
$('.task').hover(function() {
  var desc = $(this).data('description');
  if (desc) {
    $(this).append('<div class="description">' + desc + '</div>');
  }
}, function() {
  $(this).find('.description').remove();
});

// 点击切换完成状态
$('.task').on('click', function() {
  var $this = $(this);
  var isComplete = $this.hasClass('complete');
  if (isComplete) {
    $this.removeClass('complete').find('.status').text('未完成');
  } else {
    $this.addClass('complete').find('.status').text('已完成');
  }
});

通过上述实践,我们不仅学会了如何利用jQuery选择器和元素操作方法来动态修改内容,还了解了如何结合事件处理来实现丰富的交互效果。这展示了jQuery在处理动态内容交互方面的能力和灵活性。

3. jQuery CSS选择器

3.1 CSS选择器的种类与功能

3.1.1 常用CSS选择器介绍

在前端开发中,CSS选择器是挑选页面元素的一种规则。它们是编写样式和应用样式的基础,允许我们精确地指定哪些元素应该被应用特定的样式规则。借助jQuery,我们可以更轻松地使用这些选择器。

jQuery 支持所有标准的 CSS3 选择器,并提供了一些额外的选择器,使得元素的选择变得更为简单。一些常用的CSS选择器包括:

  • 元素选择器 :直接通过元素的标签名来选择元素,如 div , p , span 等。
  • 类选择器 :通过元素的 class 属性来选择,如 .my-class
  • ID选择器 :通过元素的 id 属性来选择,如 #my-id
  • 属性选择器 :通过元素的属性来选择,例如 [href] 选择所有含有 href 属性的元素, [href="#"] 选择 href 属性值为 # 的元素。
  • 组合选择器 :例如子选择器 > ,相邻兄弟选择器 + ,通用兄弟选择器 ~
  • 伪类选择器 :如 :first-child , :last-child , :nth-child() , :hover , :focus 等。

3.1.2 选择器的优先级与继承

选择器的优先级,也称为特异性,是CSS规则的一种计算方式,它决定了当多个样式规则应用于同一元素时,哪些规则会胜出并实际应用。

  • 优先级规则 :通常情况下,选择器优先级的规则遵循“更具体的选择器优先”。具体表现为:
  • 内联样式(如 style="..." )优先级最高,因为它们直接作用于元素。
  • ID选择器次之。
  • 类选择器、伪类选择器、属性选择器具有相同的优先级。
  • 元素选择器和伪元素选择器的优先级最低。
  • 通用选择器 * 和组合选择器不会增加优先级。
  • 继承 :一些CSS属性默认是可以被子元素继承的,比如 color font-family 。继承可以减少我们为每个元素重复定义样式的需要,但有时也可能导致意外的效果。

3.2 利用jQuery操作CSS属性

3.2.1 添加、修改和移除CSS类

通过jQuery,我们可以轻松地通过类来添加、修改和移除样式。

  • 添加类 :使用 .addClass() 方法,比如 $('#element').addClass('new-class'); 会给选定的元素添加一个新的CSS类。
  • 移除类 :使用 .removeClass() 方法,如 $('#element').removeClass('old-class'); 会移除一个已存在的CSS类。
  • 切换类 :使用 .toggleClass() 方法可以在添加与移除类之间切换,例如 $('#element').toggleClass('active'); ,如果元素有 active 类则移除它,如果没有则添加它。

3.2.2 动态应用CSS样式

jQuery提供了方法来动态改变元素的样式,如:

  • 设置样式 .css() 方法可以用来获取或者设置CSS属性,如 $('#element').css('background-color', 'red'); 设置背景颜色为红色。
  • 操作多个样式 :可以一次性通过一个对象设置多个样式,如 $('#element').css({ 'color': 'blue', 'font-size': '20px' });

3.2.3 使用jQuery实现响应式设计

响应式设计是指通过不同设备屏幕大小调整网页布局与内容,以达到适配不同设备的视觉效果。jQuery可以用来增强响应式设计:

  • 媒体查询 :可以检测设备的屏幕大小,并根据条件执行不同的脚本。媒体查询本身是CSS的一部分,但可以通过jQuery来响应媒体查询事件,如 $(window).on('resize', function() {...});
  • 动态修改样式 :根据设备特性,可以动态地修改元素的样式。例如,对于小屏设备,可以使用 .css() 方法改变元素的大小或者隐藏某些内容: $('.element').css({ 'display': 'none' });

代码块示例:

$(window).on('resize', function() {
    if ($(this).width() < 600) {
        // 对于小屏设备
        $('.element').css({ 'width': '100%' });
    } else {
        // 对于大屏设备
        $('.element').css({ 'width': 'auto' });
    }
});

邀请您进入下一章节

在下一章节中,我们将继续深入了解如何通过jQuery操作DOM,包括创建、插入、删除节点以及如何处理事件。这些操作是提升Web应用交互能力的关键。请您做好准备,我们将进入另一段精彩的学习旅程。

4. ```

第四章:DOM操作与事件处理

DOM(文档对象模型)是JavaScript与HTML文档之间交互的桥梁。通过DOM操作,开发者可以改变文档的结构、样式和内容。而事件处理则赋予了页面动态交互的能力,响应用户的操作。本章将详细介绍如何使用jQuery进行高效的DOM操作和灵活的事件处理。

4.1 DOM操作的高级应用

4.1.1 节点创建、插入与删除

DOM操作中的节点创建、插入与删除是前端开发中最常见的需求之一。jQuery简化了这些操作,使得操作更加直观和方便。

// 创建节点
var newNode = $('<div>这是一个新创建的元素</div>');
// 插入节点
$('#targetElement').append(newNode); // 将新元素追加到目标元素内部
// 删除节点
newNode.remove(); // 删除刚才创建的元素

在上述代码块中,我们创建了一个新的div元素,并将其追加到了id为 targetElement 的元素内部。随后,我们使用 remove 方法删除了创建的元素。

4.1.2 DOM遍历方法与实践

jQuery提供了丰富的方法来遍历DOM元素,这对于操作DOM树结构中的元素非常有用。

// 通过父元素查找子元素
$('div').children('p'); // 查找所有div元素内的p子元素
// 通过子元素查找父元素
$('p').parent(); // 查找所有p元素的父元素
// 选择兄弟元素
$('p').next(); // 选择紧邻的下一个兄弟元素

这里,我们演示了如何使用 children parent next 等方法来遍历DOM。这些方法的使用可以让我们轻松地定位和操作页面上的元素。

4.1.3 实现富文本编辑器的基础功能

富文本编辑器是许多现代Web应用不可或缺的一部分。使用jQuery,我们可以较为简单地实现富文本编辑器的基础功能。

// 实现富文本编辑器的基础功能
$('#editable').html('<strong>这是富文本编辑器的初始内容</strong>');
$('#editable').on('click', 'strong', function() {
  $(this).text('加粗内容被点击了!');
});

以上代码展示了如何在点击加粗文本时更改其内容。这仅仅是一个非常基础的例子,但通过进一步扩展,我们可以创建一个具有更多功能的富文本编辑器。

4.2 事件处理机制深入解析

4.2.1 事件绑定与解绑的策略

jQuery提供了简单易用的事件处理方法,这对于处理用户交互非常重要。

// 事件绑定
$('#clickable').click(function() {
  alert('按钮被点击了!');
});
// 事件解绑
$('#clickable').unbind('click');

事件绑定可以确保用户在与元素交互时触发特定的函数,而 unbind 方法则可以移除之前绑定的事件。

4.2.2 事件冒泡与捕获的控制

事件冒泡是默认的事件传播方式,即事件从子元素传播到父元素。控制事件冒泡有时是必要的,尤其是在处理复杂的事件委托或自定义事件时。

// 阻止事件冒泡
$('#target').click(function(event) {
  event.stopPropagation();
});

stopPropagation 方法可以阻止事件继续传播,这对于控制事件行为特别有用。

4.2.3 实践:自定义事件与事件委托

自定义事件允许开发者在任何元素上触发和监听自定义的事件,这为开发提供了极大的灵活性。

// 自定义事件的创建与触发
$('#target').on('myCustomEvent', function() {
  alert('自定义事件被触发了!');
});
$('#trigger').click(function() {
  $('#target').trigger('myCustomEvent');
});

// 事件委托
$(document).on('click', '.dynamicElement', function() {
  alert('动态元素被点击了!');
});

以上代码展示了如何使用 on 方法创建和触发自定义事件。同时,事件委托允许我们在一个父元素上监听所有子元素的事件,这对于动态添加到DOM中的元素非常有用。

通过本章节的介绍,我们可以看到jQuery如何让复杂的DOM操作和事件处理变得简单易懂。DOM操作与事件处理是构建动态、交互式Web应用的核心。掌握这两方面的知识,将使您在开发过程中更加得心应手。在接下来的章节中,我们将探讨如何利用jQuery制作动画效果,使我们的网页更加生动有趣。


# 5. jQuery动画与视觉效果

## 5.1 基本动画效果的实现

### 5.1.1 show、hide、toggle方法的使用

`show()`、`hide()` 和 `toggle()` 是 jQuery 提供的三个基础方法,它们是实现元素显示和隐藏的快捷方式。这些方法可以接受可选的持续时间和回调函数参数,使得动画的执行更加灵活。

`show()` 方法用于显示一个被隐藏的元素,而 `hide()` 方法则相反,用于隐藏一个可见的元素。`toggle()` 方法根据元素的当前状态,切换其可见性。

```javascript
// 使用示例
$(selector).show(); // 立即显示元素
$(selector).hide(1000); // 以1000毫秒的动画效果隐藏元素
$(selector).toggle(500, function() {
  // 动画结束后的回调函数
  console.log('元素切换完成');
});

5.1.2 自定义淡入淡出效果

虽然 fadeIn() fadeOut() 方法专门用于实现淡入淡出效果,但有时我们可能需要自定义这种动画效果。通过修改元素的透明度( opacity )属性,可以实现自定义的淡入淡出效果。

// 自定义淡入效果
$(selector).animate({
  opacity: 1 // 透明度从0变为1
}, 1000); // 持续时间为1000毫秒

// 自定义淡出效果
$(selector).animate({
  opacity: 0 // 透明度从1变为0
}, 1000);

5.2 进阶动画与视觉特效

5.2.1 动画队列与回调函数

jQuery 的动画方法是队列化的,这意味着多个动画或事件处理器上的动作会按照它们被触发的顺序执行。如果一个动画正在执行中,后续的动画会等待前一个动画完成后才开始执行。

通过在动画方法中添加一个回调函数,我们可以在动画完成之后执行一段代码,这样可以控制动画的执行顺序,或者在多个动画串联时实现复杂的逻辑。

// 使用队列和回调函数串联动画
$(selector).fadeIn(500, function() {
  // 第一个动画完成后的回调
  console.log('第一个淡入动画完成');

  $(this).animate({
    height: '200px'
  }, 1000, function() {
    // 第二个动画完成后的回调
    console.log('第二个高度变化动画完成');
  });
});

5.2.2 制作拖拽效果与高阶特效

拖拽是用户界面中常见的交互之一,通过结合 mousedown mousemove mouseup 事件,可以制作基本的拖拽效果。

为了简化实现过程,可以使用 jQuery UI 中的 draggable() 插件来实现复杂的拖拽效果,例如限制拖拽范围、拖拽反弹等。

// 利用 jQuery UI 制作可拖拽的元素
$(selector).draggable({
  drag: function(event, ui) {
    // 拖拽过程中的逻辑
  },
  stop: function(event, ui) {
    // 拖拽停止后的逻辑
  }
});

5.2.3 实现复杂的交互动画案例

复杂的交互动画可能涉及多个元素的相互作用,比如一个元素的变化会触发另一个元素的动画效果。这里需要使用到事件监听和条件判断来实现逻辑的串联。

一个典型的案例是通过拖拽一个元素来影响另一个元素的位置或样式变化。通过监听拖拽事件,并在事件中更新目标元素的状态,可以实现这样的交互。

// 复杂交互动画实现示例
$(selectorDraggable).draggable({
  start: function(event, ui) {
    // 拖拽开始时的逻辑
  },
  drag: function(event, ui) {
    // 拖拽过程中动态更新其他元素的状态
    $(selectorTarget).css({
      left: ui.position.left,
      top: ***
    });
  }
});

通过以上几个小节的深入讲解,我们已经对 jQuery 动画和视觉效果有了全面的认识。无论是基本的显示/隐藏动画、自定义淡入淡出效果,还是利用动画队列实现的复杂交互动画,jQuery 都提供了非常便捷和强大的工具来帮助开发者完成这些任务。在实际的项目中灵活运用这些方法和技巧,能够大大提升用户体验和界面的交互质量。

6. AJAX异步数据交互

AJAX(Asynchronous JavaScript and XML)是实现Web页面无刷新更新的技术之一。在现代Web开发中,AJAX用于创建快速动态的交互界面,减少服务器请求的次数,并提供更为流畅的用户体验。

6.1 AJAX基础与应用场景

6.1.1 理解AJAX的基本原理

AJAX的核心是通过JavaScript的 XMLHttpRequest 对象发起HTTP请求,获取服务器的数据,然后利用JavaScript动态地更新Web页面的内容,而无需重新加载整个页面。这种方式改善了Web应用的响应速度和用户体验。

// 创建一个XMLHttpRequest对象
var xhr = new XMLHttpRequest();

// 配置请求类型、URL以及异步处理方式
xhr.open('GET', '/api/data', true);

// 设置请求完成后的回调函数
xhr.onload = function() {
  if (xhr.status >= 200 && xhr.status < 300) {
    // 请求成功时调用
    console.log('Data loaded:', this.responseText);
  } else {
    // 请求失败时调用
    console.log('The request failed!');
  }
};

// 发送HTTP请求
xhr.send();

6.1.2 处理跨域请求问题

由于浏览器的同源策略,当AJAX请求的数据源和当前页面不是同一个域时,会遇到跨域资源共享(CORS)的问题。解决这一问题有多种方法,例如服务器端配置CORS头部、使用JSONP方法或者创建代理服务器等。

// 使用JSONP实现跨域请求(服务器支持JSONP响应的情况下)
function jsonpCallback(data) {
  console.log('JSONP Data:', data);
}

var script = document.createElement('script');
script.src = '***';
document.head.appendChild(script);

// 删除script标签,防止重复请求
script.onload = function() {
  document.head.removeChild(this);
};

6.2 AJAX高级应用

6.2.1 使用jQuery进行数据序列化

jQuery提供了一个非常方便的方法 $.serialize() ,它将表单的值序列化为URL编码的字符串,这样就可以直接用于AJAX请求,特别是在提交表单数据时非常有用。

<form id="myForm">
  <input type="text" name="name" value="John">
  <input type="email" name="email" value="***">
  <button type="submit">Submit</button>
</form>
$('#myForm').on('submit', function(event) {
  event.preventDefault();
  var formData = $(this).serialize();
  $.ajax({
    url: '/submit-form',
    type: 'POST',
    data: formData,
    success: function(response) {
      console.log('Form submitted successfully:', response);
    },
    error: function(xhr, status, error) {
      console.log('An error occurred:', error);
    }
  });
});

6.2.2 管理AJAX请求与响应

当有多个AJAX请求并发进行时,管理它们的状态变得尤为重要。jQuery允许我们使用 $.ajaxSetup() 方法来设置全局的AJAX请求默认选项,并且我们可以通过 $.ajaxStop() 监听所有AJAX请求完成后触发的事件。

// 设置全局AJAX请求默认选项
$.ajaxSetup({
  headers: {
    'Accept': 'application/json',
    'X-Custom-Header': 'custom-value'
  },
  timeout: 5000
});

// 当所有AJAX请求完成时执行的回调
$(document).ajaxStop(function() {
  console.log('All AJAX requests have been completed.');
});

6.2.3 构建全栈应用的前端交互

在全栈应用中,前端通常会与后端进行多次数据交互,涉及数据的创建、读取、更新和删除操作(CRUD)。借助AJAX,前端开发者可以轻松地与后端API对接,实现这些功能。

// 创建一条数据记录
function createData(data) {
  $.ajax({
    url: '/api/create',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(data),
    success: function(response) {
      console.log('Data created:', response);
    },
    error: function(xhr, status, error) {
      console.log('Error creating data:', error);
    }
  });
}

// 读取数据记录
function readData(id) {
  $.ajax({
    url: '/api/read/' + id,
    type: 'GET',
    success: function(response) {
      console.log('Data read:', response);
    },
    error: function(xhr, status, error) {
      console.log('Error reading data:', error);
    }
  });
}

// 更新一条数据记录
function updateData(id, data) {
  $.ajax({
    url: '/api/update/' + id,
    type: 'PUT',
    contentType: 'application/json',
    data: JSON.stringify(data),
    success: function(response) {
      console.log('Data updated:', response);
    },
    error: function(xhr, status, error) {
      console.log('Error updating data:', error);
    }
  });
}

// 删除一条数据记录
function deleteData(id) {
  $.ajax({
    url: '/api/delete/' + id,
    type: 'DELETE',
    success: function(response) {
      console.log('Data deleted:', response);
    },
    error: function(xhr, status, error) {
      console.log('Error deleting data:', error);
    }
  });
}

通过本章内容,我们了解了AJAX的基础知识、应用场景以及一些高级用法。在现代前端开发中,合理利用AJAX可以使Web应用更加响应迅速和用户体验更佳。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:《锋利的 jQuery 代码》是一本深入讲解jQuery应用的指南,覆盖了jQuery的基础和高级特性。本书通过实例教程,指导读者掌握如何使用jQuery提升网站用户体验。内容包括选择器的使用、DOM操作、事件处理、动画和效果的实现、AJAX应用和插件开发,以及与前端框架的整合与性能优化等。本书适合初学者和进阶者,帮助他们有效利用jQuery创造丰富交互的网页。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值