JavaWeb基础学习笔记6——JavaScript

目录

1、JavaScript的概念

2、JavaScript的功能

3、JavaScript发展史

4、ECMAScript

4.1、基本语法

4.1.1、与html结合方式

4.1.2、注释

4.1.3、数据类型

4.1.4、变量

4.1.5、运算符

4.1.6、流程控制语句

4.1.7、特殊语法

4.2、基本对象

4.2.1、Function对象

4.2.2、Array对象

4.2.3、Boolean对象

4.2.4、Date对象

4.2.5、Math对象

4.2.6、Number对象

4.2.7、String对象

4.2.8、RegExp(正则表达式)对象

4.2.9、Global对象

5、BOM

5.1、BOM概念

5.2、BOM组成

5.2.1、Window:窗口对象

5.2.2、Navigator:浏览器对象

5.2.3、Screen:显示器屏幕对象

5.2.4、History:历史记录对象

5.2.5、Location:地址栏对象

6、DOM

6.1、核心DOM模型

6.1.1、Document:文档对象

6.1.2、Element:元素对象

6.1.3、Node:结点对象

6.2、HTML DOM模型

6.2.1、标签体的设置和获取

6.2.2、使用html元素对象的属性

6.2.3、控制元素样式

6.2、事件


1、JavaScript的概念

JavaScript是一种客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎。

脚本语言:不需要编译,直接就可以被浏览器解析执行。

2、JavaScript的功能

JavaScript可以增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。

3、JavaScript发展史

  • 1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验,命名为 C--,后来更名为ScriptEase。
  • 1995年,Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。后来,请来Sun公司的专家,修改LiveScript,命名为JavaScript。
  • 1995年,微软抄袭JavaScript开发出JScript语言。
  • 1997年,ECMA(欧洲计算机制造商协会),ECMAScript,就是所有客户端脚本语言的标准。

JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)。

4、ECMAScript

4.1、基本语法

4.1.1、与html结合方式

  • 内部JS:定义<script>,标签体内容就是js代码。
  • 外部JS:定义<script>,通过src属性引入外部的js文件。

注意:

  • <script>可以定义在html页面的任何地方,但是定义的位置会影响执行的顺序。
  • <script>可以定义多个。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <script>
    alert("Hello World");
  </script>
  <script src="js/a.js"></script>
</head>
<body>

<input type="text">

</body>
</html>

4.1.2、注释

  • 单行注释: //注释内容
  • 多行注释:/*注释内容*/

4.1.3、数据类型

1、原始数据类型(基本数据类型):

  • number:数字。整数/小数/NaN(not a number,一个不是数字的数字类型)。
  • string:字符串。字符/字符串。"abc"、 "abc'、 'abc'。
  • boolean:true和false。
  • null:一个对象为空的占位符。
  • undefined:未定义。如果一个变量没有给初始化值,则会默认赋值为undefined。

2、引用数据类型:对象。

4.1.4、变量

变量:一小块存储数据的内存空间。

Java语言是强类型语言,而JavaScript是弱类型语言。

  • 强类型:在开辟变量存储空间时,定义了空间将来存储的数据的数据类型,只能存储固定类型的数据。
  • 弱类型:在开辟变量存储空间时,不定义空间将来的存储数据类型,可以存放任意类型的数据。

语法:

var 变量名 = 初始化值;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>变量</title>

    <script>
        //定义number类型
        var num1 = 1;
        var num2 = 1.2;
        var num3 = NaN;
        //输出到页面上
        document.write(num1 + "---" + typeof (num1) + "<br />");
        document.write(num2 + "---" + typeof (num2) + "<br />");
        document.write(num3 + "---" + typeof (num3) + "<br />");

        //定义string类型
        var str1 = "abc";
        var str2 = 'def';
        document.write(str1 + "---" + typeof (str1) + "<br />");
        document.write(str2 + "---" + typeof (str2) + "<br />");

        //定义boolean类型
        var flag = true;
        document.write(flag + "---" + typeof (flag) + "<br />");

        //定义null和undefined
        var obj1 = null;
        var obj2 = undefined;
        var obj3;
        document.write(obj1 + "---" + typeof (obj1) + "<br />");
        document.write(obj2 + "---" + typeof (obj2) + "<br />");
        document.write(obj3 + "---" + typeof (obj3) + "<br />");
    </script>
</head>
<body>

</body>
</html>

4.1.5、运算符

  • 一元运算符:只有一个运算数的运算符。如:++,--,+(正号),-(负号)。注意:在JS中,如果运算数不是运算符所要求的类型,那么JS引擎会自动将运算数进行类型转换。
    -其它类型转number
    string转number:按照字面值转换。如果字面值不是数字,则转为NaN。
    boolean转number:true转为1,false转为0。
  • 算数运算符:+,-,*,/,%,...
  • 赋值运算符:=,+=,-=,*=,/=,%=,...
  • 比较运算符:>,<,>=,<=,===(全等于,在比较之前,先判断类型,如果类型不一样,直接返回false)。比较方式:① 类型相同:直接比较。字符串按照字典顺序比较,按位逐一比较,直到得出大小为止;② 类型不同:先进行类型转换,再比较。
  • 逻辑运算符:&&,||,!。
    -其它类型转boolean
    number转boolean:0为假,非0为真。
    string转boolean:除了空字符串为false,其它都是true。
    null、undefined转boolean:都是false。
    对象转boolean:所有对象都为true。
    
    如:
    obj = "123";
    if(obj != null && obj.length > 0) { //防止空指针异常
        alert(123);
    }
    //js中可以这样定义,简化书写
    if(obj) {
        alert(111);
    }
    
  • 三元运算符:表达式?值1:值2。

4.1.6、流程控制语句

  • if...else...
  • switch:在JavaScript中,switch语句可以接收任意的原始数据类型。
    var a;
    switch(a) {
        case 1:
            alert("number");
            break;
        case "abc":
            alert("string");
            break;
        case true:
            alert("true");
            break;
        case null:
            alert("null");
            break;
        case undefined:
            alert("undefined");
            break;
    }
  • while
  • do...while
  • for

练习:99乘法表:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>99乘法表</title>
    <style>
        td{
            border: 1px solid;
        }
    </style>

    <script>
        document.write("<table align='center'>");

        //1、完成基本的for循环嵌套,展示乘法表
        for(var i = 1; i <= 9; i++) {
            document.write("<tr>");
            for(var j = 1; j <= i; j++) {
                document.write("<td>");
                //输出
                document.write(i+"*"+j+"="+(i*j)+"&nbsp;&nbsp;&nbsp;");
                document.write("</td>");
            }
            document.write("</tr>");
        }
        //完成表格嵌套
        document.write("</table>");
    </script>
</head>
<body>

</body>
</html>

4.1.7、特殊语法

  • 语句以 ; 结尾,如果一行只有一条语句则 ; 可以省略。(不建议)
  • 变量的定义使用var关键字,也可以不使用。① 用:定义的变量是局部变量;② 不用:定义的变量是全局变量。(不建议使用)

4.2、基本对象

4.2.1、Function对象

1、创建
    方式1:var fun = new Function(形式参数列表,方法体)
    方式2:function 方法名称(形式参数列表) {方法体}
    方式3:var 方法名 = function(形式参数列表) {方法体}
2、方法
3、属性
    length:代表形参的个数。
4、特点
    1)方法定义时,形参的类型不用写,返回值类型也不用写;
    2)方法是一个对象,如果定义名称相同的方法,会覆盖;
    3)在JS中,方法的调用只与方法的名称有关,和参数列表无关;
    4)在方法声明中有一个隐藏的内置对象(数组)arguments封装所有的形式参数;
5、调用
    方法名称(实际参数列表);

4.2.2、Array对象

1、创建
    方式1:var arr = new Array(元素列表);
    方式2:var arr = new Array(默认长度);
    方式3:var arr = [元素列表];
2、方法
    join("分隔符"):讲数组中的元素按照指定的分隔符拼接为字符串;
    push():向数组的末尾添加一个或更多的元素,并返回新的长度;
    ...
    
3、属性
4、特点
    1)在JS中,数组元素的类型可变,如 var arr = [1, 'abc', true];;
    2)在JS中,数组的长度可变;

4.2.3、Boolean对象

4.2.4、Date对象

1、创建
    var date = new Date();
2、方法
    toLocalString():返回当前date对象对应的时间本地字符串格式;
    getTime():获取毫秒值,返回当前日期对象描述的时间到1970年1月1日零点的毫秒值差;
    ...
3、属性
4、调用

4.2.5、Math对象

1、创建
    Math对象不用创建,直接使用。
2、方法
    random():返回0~1之间的随机数,区间为[0,1)。
    ceil(x):对数进行上舍入。
    floor(x):对数进行下舍入。
    round(x):把数四舍五入为最接近的数。
3、属性
    PI:圆周率。
4、调用

4.2.6、Number对象

4.2.7、String对象

4.2.8、RegExp(正则表达式)对象

1、正则表达式:定义字符串的组成规则。

  • 单个字符 []:如[a],[ab],[a-zA-Z0-9_]。特殊符号代表特殊含义的单个字符:① \d:单个数字字符[0-9];② \w:单个单词字符[a-zA-Z0-9_]。
  • 量词符号:① ?:表示出现0次或1次;② *:表示出现0次或多次;③ +:出现1次或多次。如\w*。\w{m,n}:表示m<=数量<=n,m如果缺省({,n}),表示最多n次,n如果缺省({m,}),表示最少m次。
  • 开始结束符号:① ^:开始;② $:结束。

2、正则对象

1、创建
    方式1:var reg = new RegExp("正则表达式");
    方式2:var reg = /正则表达式/;
2、方法
    test(参数):验证指定的字符串是否符合正则定义的规范。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>正则表达式</title>
    <script>
        var reg1 = new RegExp("^\\w{6,12}$");
        var reg2 = /^\w{6,12}$/;

        var username = "zhangsan";
        reg2.test(username);
        alert(flag);
    </script>
</head>
<body>

</body>
</html>

4.2.9、Global对象

1、特点
    全局对象,这个Global中封装的方法不需要对象就可以直接调用。
2、方法
    encodeURI():url编码。
    decodeURI():url解码。
    
    encodeURIComponent():url编码,编码的字符更多。
    decodeURIComponent():url解码。

    parsrInt():将字符串转为数字。逐一判断每一个字符是否是数字,直到不是数字为止,将前面的数字部分转为number。
    isNaN():判断一个值是否是NaN。NaN参与的==比较全部为false(包括与NaN自己比较)。
    eval():将JavaScript字符串转换成脚本代码执行。

5、BOM

5.1、BOM概念

BOM(Browser Object Model,浏览器对象模型):将浏览器的各个部分封装成对象。

5.2、BOM组成

5.2.1、Window:窗口对象

1、创建
2、与弹出框有关的方法
    alert():显示带有一段信息和一个确认按钮的警告框。
    confirm():显示带有一段消息以及确认按钮和取消按钮的对话框。
        如果用户点击确定按钮,则方法返回true;
        如果用户点击取消按钮,则方法返回false。
    prompt():显示可提示用户输入的对话框。
        返回值:获取用户输入的值
3、与打开、关闭有关的方法
    close():关闭浏览器窗口;
        注意:谁调用该方法,该方法就关谁。
    open():打开一个新的浏览器窗口。
        返回一个新的Window对象。
4、与定时器有关的方法
    setTimeout():在指定毫秒数后调用函数或计算表达式。
        参数:① js代码或者方法对象;② 毫秒值;③ 返回值:唯一标识,用于取消定时器。
    clearTimeout():取消由setTimeout()方法设置的timeout。
    setInterval():按照指定的周期(以毫秒计)来调用函数或计算表达式。
        参数:① js代码或者方法对象;② 毫秒值;③ 返回值:唯一标识,用于取消定时器。
    clearInterval():取消由setInterval()方法设置的timeout。
5、属性-获取其它BOM对象
    history:
    location:
    Navigator:
    Screen:
6、属性-获取DOM对象
    document
7、特点
    Window对象不需要创建,可以直接使用window使用,如window.方法名();
    window引用可以省略,如 方法名();
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Window对象</title>
</head>
<body>

<input id="openBtn" type="button" value="打开窗口">
<input id="closeBtn" type="button" value="关闭窗口">

<script>
  // var flag = confirm("您确定要退出吗?");
  // if(flag){
  //   //退出操作
  //   alert("欢迎再次光临!");
  // }else{
  //   //提示
  //   alert("手别抖!")
  // }
  //
  // //输入框
  // var result = prompt("请输入用户名");
  // alert(result);

  //打开新窗口
  var newWindow;
  var openBtn = document.getElementById("openBtn");
  openBtn.onclick = function () {
    newWindow = open("https://www.baidu.com");
  }

  //关闭新窗口
  var closeBtn = document.getElementById("closeBtn");
  closeBtn.onclick = function () {
    newWindow.close();
  }

  // //一次定时器
  // //setTimeout("alert('aaa');",2000);
  // var id = setTimeout(fun1,2000); //返回这个timeout的编号id
  // function fun1(){
  //   alert('aaa');
  // }
  // clearTimeout(id); //关闭定时器
  // //循环定时器
  // var id2 = setInterval(fun1,2000); //返回这个timeout的编号id
  // clearInterval(id2);

  //获取history
  var h1 = window.history;
  var h2 = history;
  var openBtn1 = window.document.getElementById("openBtn");
  var openBtn2 = document.getElementById("openBtn");
</script>

</body>
</html>

5.2.2、Navigator:浏览器对象

5.2.3、Screen:显示器屏幕对象

5.2.4、History:历史记录对象

1、创建(获取)
    window.history
    history
2、方法
    back():加载history列表中的前一个URL。
    forward():加载history列表中的下一个URL。
    go():加载history列表中的某个具体页面。
        正数:前进几个历史记录;
        负数:后退几个历史记录。
3、属性
    length:返回当前窗口历史列表中的URL数量。

5.2.5、Location:地址栏对象

1、创建(获取)
    window.location
    location
2、方法
    reload():重新加载当前文档。
3、属性
    href:设置或返回
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自动跳转</title>
    <style>
        p{
            text-align: center;
        }
        span{
            color: red;
        }
    </style>
</head>
<body>

<p>
    <span id="time">5</span>秒之后,自动跳转到首页...
</p>

<script>
    var second = 5;
    var time = document.getElementById("time");
    //倒计时读秒效果实现
    function showTime(){
        second --;
        time.innerHTML = second + "";
        if(second <= 0){
            //跳转
            location.href = "https://www.baidu.com";
        }
    }
    //设置定时器,1秒执行一次该方法
    setInterval(showTime,1000);
</script>

</body>
</html>

6、DOM

DOM(Document Object Model,文档对象模型):将标记语言文档的各个组成部分,封装为对象,可以使用这些对象,对标记语言文档进行CRUD的动态操作。

W3C DOM标准被分为3个不同的部分:

        1)核心DOM:针对任何结构化文档的标准模型;

                Document:文档对象;

                Element:元素对象;

                Attribute:属性对象;

                Text:文本对象;

                Comment:注释对象;

                - Node:结点对象,其它5个的父对象。

        2)XML DOM:针对XML文档的标准模型;

        3)HTML DOM:针对HTML文档的标准模型。

DOM的功能:控制html文档的内容。

-获取页面标签(元素)对象Element。通过元素id获取元素对象。
document.getElementById("id值");

操作Element对象:

-修改属性值
1、明确获取的对象是哪一个;
2、查看API文档,找其中有哪些属性可以设置。如:
    <script>
        //通过id获取元素对象
        var img = document.getElementById("Id名");
        alert("换图片");
        img.src = "image/new.png";
    </script>

-修改标签体内容

6.1、核心DOM模型

6.1.1、Document:文档对象

1、创建(获取):在html dom 模型中可以使用window对象来获取
    window.document
    document
2、方法
    1)获取Element对象:
        getElementById():根据id属性值获取元素对象。id属性值一般唯一。
        getElementsByTagName():根据元素名称获取元素对象们。返回值是一个数组。
        getElementsByClassName():根据class属性值获取元素对象们。返回值是一个数组。
        getElementsByName():根据name属性值获取元素对象们。返回值是一个数组。
    2)创建其它DOM对象:
        createAttribute(name):
        createComment():
        createElement():
        createTextNode():
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document对象</title>
</head>
<body>

<div id="div1">div1</div>
<div id="div2">div2</div>
<div id="div3">div3</div>

<div class="cls1">div4</div>
<div class="cls1">div5</div>

<div type="text" name="username">div6</div>

<script>
  //根据元素名称获取元素对象们.返回值是一个数组
  // var divs = document.getElementsByTagName("div");
  // alert(divs.length);

  //根据Class属性值获取元素对象们.返回值是一个数组
  // var div_cls = document.getElementsByClassName("cls1");
  // alert(div_cls.length);

  //根据name属性值获取元素对象们.返回值是一个数组
  var ele_username = document.getElementsByName("username");
  alert(ele_username.length);

</script>

</body>
</html>

6.1.2、Element:元素对象

1、获取(创建)
    通过document来获取和创建。
2、方法
    removeAttribute():删除属性
    setAttribute():设置属性
3、属性
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Element对象</title>
</head>
<body>

<a>点我试一试</a>
<input type="button" id="btn_set" value="设置属性">
<input type="button" id="btn_remove" value="删除属性"><br />

<script>
    //获取btn
    var btn_set = document.getElementById("btn_set");
    btn_set.onclick = function () {
        //获取a标签
        var element_a = document.getElementsByTagName("a")[0];
        element_a.setAttribute("href","https://www.baidu.com");
    }
    var btn_remove = document.getElementById("btn_remove");
    btn_remove.onclick = function () {
        //获取a标签
        var element_a = document.getElementsByTagName("a")[0];
        element_a.removeAttribute("href");
    }
</script>

</body>
</html>

6.1.3、Node:结点对象

1、特点
    所有DOM对象都可被认为是一个结点。
2、方法
    CRUD DOM树:
        appendChild():向结点的子结点列表的结尾添加新的子结点。
        removeChild():删除(并返回)当前结点的指定子结点。
        replaceChild():用新结点替换一个子结点。
3、属性
    parentNode:返回结点的父结点。

6.2、HTML DOM模型

6.2.1、标签体的设置和获取

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML DOM</title>
</head>
<body>

<div id="div1">
  div1
</div>

<script>
  var div1 = document.getElementById("div1");
  var innerHtml = div1.innerHTML;
  div1.innerHTML = "<input type='text'>";

  //div1标签中追加一个文本输入框
  div1.innerHTML += "<input type='text'>";
</script>


</body>
</html>

6.2.2、使用html元素对象的属性

6.2.3、控制元素样式

  • 方式1:使用元素的style属性来设置;
  • 方式2:提前定义好类选择器的样式,通过元素的className属性来设置其class属性值。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>控制样式</title>

    <style>
        .d1 {
            border: 1px solid red;
            width: 100px;
            height: 100px;
        }

        .d2 {
            border: 1px solid blue;
            width: 200px;
            height: 200px;
        }
    </style>
</head>
<body>

<div id="div1">
    div1
</div>
<div id="div2">
    div2
</div>

<script>
    var div1 = document.getElementById("div1");
    div1.onclick = function () {
        //修改样式方式1
        div1.style.border = "1px solid red";
        div1.style.width = "200px";

        //font-size --> fontSize
        div1.style.fontSize = "20px";
    }
    var div2 = document.getElementById("div2");
    div2.onclick = function () {
        //修改样式方式2
        div2.className = "d1";
    }
</script>

</body>
</html>

6.2、事件监听机制

事件的功能:某些组件被执行了某些操作后,触发某些代码的执行。

  • 事件:某些操作,如:单击,双击,键盘按下了,鼠标移动了,...
  • 事件源:组件,如:按钮,文本输入框,...
  • 监听器:代码。
  • 注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件,则触发执行某个监听器代码。

如何绑定事件:

  • 方式1:直接在html标签上,指定事件的属性,属性值就是JS代码。事件onclick:单击事件。
  • 方式2:通过js获取元素对象,指定事件属性,设置一个函数。

常见的事件:

  • 点击事件:① onclick:单击事件;② ondblclick:双击事件。
  • 焦点事件:① onblur:元素失去焦点。一般用于表单验证;② onfocus:元素获得焦点。
  • 加载事件:① onload:一张页面或一幅图像完成加载。
  • 鼠标事件:① onmousedowm:鼠标按钮被按下。定义方法时,定义一个形参来接收event对象,event对象的button属性可以获取鼠标按扭哪个键被点击了;② onmouseup:鼠标按键被松开;③ onmousemove:鼠标被移动;④ onmouseover:鼠标移到某元素之上;⑤ onmouseout:鼠标从某元素移开。
  • 键盘事件:① onkeydown:某个键盘按键被按下;② onkeyup:某个键盘按键被松开;③ onkeypress:某个键盘按键被按下并松开。
  • 选中和改变:① onchange:域的内容被改变;② onselect:文本被选中。
  • 表单事件:① onsubmit:确认按钮被点击。可以阻止校验失败的表单的提交,方法返回false则阻止提交;② onreset:重置按钮被点击。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件绑定</title>
</head>
<body>

<img id="img1" src="image/logo.jpg" onclick=fun1()>

<img id="img2" src="image/logo.jpg">



<script>
    function fun1(){
        alert('我被点了。');
        alert('我又被点了。');
    }
    function fun2(){
        alert('我也被点了。')
    }

    //获取img2对象
    var img2 = document.getElementById("img2");
    //绑定事件
    img2.onclick = fun2;
    //或者可以直接定义函数fun2:
    //img2.onclick = fun2(){方法体}
</script>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DOM常见事件</title>

    <script>
        //2、加载完成事件
        window.onload = function() {
            // //1、失去焦点事件
            // document.getElementById("username").onblur = function() {
            //     alert("失去焦点了")
            // }
            // //3、绑定鼠标事件
            // document.getElementById("username").onmouseover = function() {
            //     alert("鼠标来了..");
            // }
            // document.getElementById("username").onmousedown = function (event) {
            //     alert("鼠标被按下了..");
            //     alert(event.button);
            // }
            //4、绑定键盘事件
            document.getElementById("username").onkeydown = function(event) {
                if(event.keyCode == 13) {//回车键被按下
                    alert("提交表单");
                }
            }
            //5、域的内容被改变
            document.getElementById("city").onchange = function() {
                alert("改变了..");
            }
            //6、表单事件
            // document.getElementById("form").onsubmit = function () {
            //     //校验用户名格式是否正确
            //     var flag = false;
            //
            //     return flag; //false则组织表单提交
            // }
            function checkForm() {
                return false;
            }
        }
    </script>
</head>
<body>

<form action="#" id="form" onclick="return checkForm();">
    <input name="username" id="username">

    <select id="city">
        <option>--请选择--</option>
        <option>北京</option>
        <option>上海</option>
        <option>西安</option>
    </select>
    <input type="submit" value="提交">
</form>

<script>
</script>

</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值