JavaWeb—JavaScript

13 篇文章 2 订阅

目录

一、什么是JavaScript? 

二、JavaScript引入方式

三、JavaScript基础语法

3.1 书写语法

3.2 输出语句

3.3 变量

3.4 数据类型

3.5 运算符

3.5.1 ==和===的区别

3.5.2 类型转换

3.6 流程控制语句

3.6.1 if语句

3.6.2 switch语句

 3.6.3 for循环语句

 3.6.4 do while循环语句

 3.6.5 dowhile 循环语句

 3.7 函数

3.7.1 定义格式

3.7.2 函数调用

四、JavaScript常用对象

 4.1 Array对象

4.1.1 定义格式

4.1.2 元素访问

4.1.3 特点

4.1.4 属性

4.1.5 方法

4.2 String对象

4.3 自定义对象

五、BOM

5.1 Window对象

5.1.1 获取window对象

5.1.2 window对象属性

5.1.3 window对象函数

5.1.4 使用案例

5.2 History对象

5.3 Location对象

5.3.1 获取Location对象

5.3.2 Location对象属性 

5.3.3 案例

六、DOM

6.1 概述

6.2 获取 Element对象

6.3 HTML Element对象使用

七、事件监听

7.1 事件绑定

7.2 常见事件

八、表单验证案例

8.1 需求

8.2 代码

九、RegExp对象

9.1正则对象使用

9.1.1 创建对象

9.1.2 函数

9.2 正则表达式

9.3 改进表单校验案例


一、什么是JavaScript? 

  • JavaScript是一门跨平台、面向对象的脚本语言,来控制网页行为的,它能使网页可交互,例如改变页面内容、修改指定元素的属性值、对表单进行校验等
  • JavaScript和Java是完全不同的语言,Java是编译语言,需要编译成字节码文件才能运行的;而JavaScript是脚本语言,不需要编译,由浏览器直接解析并执行
  • JavaScript(简称:JS)在1995年由Brendan Eich发明,并于1997年称为一部ECMA标准
  • ECMAScript6(ES6)是最新的JavaScript版本(发布于2015年)

二、JavaScript引入方式

1. 内部脚本:将JS代码定义在HTML页面中

    在HTML中,JavaScript代码必须位于<script></script>标签之间

提示:

  • 在HTML文档中可以在任意地方,放置任意数量的<script>
  • 一般把脚本置于<body>元素的底部,可改善显示速度,因为脚本执行会拖慢显示 

2. 外部脚本:将JS代码定义在外部JS文件中,然后引入到HTML页面中

注意:

  • 外部脚本不能包含<script>标签
  • <script>标签不能自闭合

三、JavaScript基础语法

3.1 书写语法

  • 区分大小写:与Java一样,变量名、函数名以及其他一切东西都是区分大小写的
  • 每行结尾的分号可有可无;如果一行写上多个语句时,必须加分号用来区分多个语句
  • 注释:   单行注释://注释内容    多行注释: /*注释内容*/    注意:JavaScript没有文档注释
  • 大括号代表代码块

3.2 输出语句

JS可以通过以下方式进行内容的输出,只不过不同的语句输出到的位置不同

  • 使用 window.alert() 写入警告框
  • 使用 document.write() 写入HTML输出
  • 使用 console.log() 写入浏览器控制台
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script>
  window.alert("hello,js1");//写入警告框

  document.write("hello,js2");//写入到HTML页面里

  console.log("hello,js3")//写入到浏览器的控制台
</script>
</body>
</html>

3.3 变量

1. JavaScript中用 var 关键字(variable的缩写)来声明变量

  • 格式:var 变量名 = 数据值;

2. JavaScript是一门弱类型语言,变量可以存放不同类型的值

3. JavaScript中的变量名命名有如下规则,和Java语言基本都相同

  • 组成字符可以使任何字母、数字、下划线(_)或美元符号($)
  • 数字不能开头
  • 建议使用驼峰命名

4. JavaScript中var关键字有点特殊,有以下地方和其他语言不一样

  • 作用域:全局变量

       

  •  变量可以重复定义

       

 5. 针对如上的问题,ECMAScript6新增了 let 关键字来定义变量。它的用法类似于var,但所声明的变量旨在let关键字所在的代码块内有效,且不允许重复声明

       

       

 6. ECMAScript 6 新增了 const 关键字,用来声明一个只读的常量。一旦声明,常量的值就不能改变

        

3.4 数据类型

JavaScript中提供了两种数据类型:原始类型和引用类型

1. 使用 tperof 运算符可以获取数据类型

    alert(typerof age); //以弹窗的形式将age变量的数据类型输出

2. 原始数据类型:

  • number:数字(整数、小数、NaN(Not a Number))

       

  • string:字符、字符串、单双引皆可

        

  • boolean:布尔。true,false

         

  • null:对象为空

        

  • undefined:当声明的变量为初始化时,该变量的默认值是undefined

         

3.5 运算符

JavaScript提供了如下的运算符。大部分和Java语言是一样的,不同的是关系运算符中的==和===

3.5.1 ==和===的区别

1. ==:

        ① 判断类型是否一样,如果不一样,则进行类型转换

        ② 再去比较其值

2. ===:

        ① 判断类型是否一样,如果不一样,直接返回false

        ② 再去比较其值

3.5.2 类型转换

1. 其他类型转换为number

  • string转换为number类型:按照字符串的字面值转为数字。如果字面值不是数字,则转为NaN。将string转化为number有两种方式

        ①使用 + 正号运算符:

           

        ②使用parseInt()函数(方法):

           

  •  boolean转换为number类型:true转为1,false转为0

           

2.  其他类型转为boolean

  • number类型转换为boolean类型:0和NaN转为false,其他的数字转为true
  • string类型转换为boolean类型:空字符串转为false,其他的字符串转为true
  • null类型转换为boolean:类型是false
  • undefined转换为boolean:类型是false

        

3.6 流程控制语句

JavaScript中提供了和Java一样的流程控制语句,如下

3.6.1 if语句

3.6.2 switch语句

 3.6.3 for循环语句

 3.6.4 do while循环语句

 3.6.5 dowhile 循环语句

 3.7 函数

函数(就是Java中的方法)是被设置为执行特定任务的代码块;JavaScript函数通过function关键字进行定义

3.7.1 定义格式

函数的定义格式有两种

方式1

方式2

3.7.2 函数调用

函数调用函数:

例如:

四、JavaScript常用对象

JavaScript提供了很多对象供使用者来使用。这些对象总共分三类

 4.1 Array对象

JavaScript Array对象用于定义数组

4.1.1 定义格式

方式一

例如:

方式二

 例如:

4.1.2 元素访问

访问数组中的元素和Java语言一样,格式如下:

4.1.3 特点

JavaScript 中的数组相当于 Java 中集合。数组的长度是可以变化的,而 JavaScript 是弱类型,所以可以存储任意的类型的数据

4.1.4 属性

Array 对象提供了很多属性,如下图是官方文档截取的

4.1.5 方法

Array 对象同样也提供了很多方法,如下图是官方文档截取的

  •  push函数:给数组添加元素,也就是在数组的末尾添加元素

  •  splice函数:删除元素

4.2 String对象

String对象的创建方式有两种

方式一

方式二

  • 属性:

String对象提供了很多属性,下面列举了一个属性length,该属性是用于动态的获取字符串的长度

  •  函数:

String对象提供了很多函数(方法),下面列举了两个方法

 String对象还有一个函数trim(),该方法在文档中没有体现,但是所有的浏览器都支持;它是用来去掉字符串两端的空格。

4.3 自定义对象

在JavaScript中自定义对象特别简单,下面就是自定义对象的格式

调用属性的格式:

调用函数的格式:

五、BOM

BOM:Browser Object Model浏览器对象模型。也就是JavaScript将浏览器的各个组成部分封装成对象。

我们要操作浏览器的各个组成部分就可以通过操作BOM中的对象来实现。比如:我现在想将浏览器地址栏的地址改为https://www.bilibili.com 就可以通过使用BOM中定义的Location对象的href属性,代码:location.href = "https://bilibili.com";

BOM中包含了如下对象:

  • Window:浏览器窗口对象
  • Navigator:浏览器对象
  • Screen:屏幕对象
  • History:历史记录对象
  • Location:地址栏对象

5.1 Window对象

window对象是JavaScript对浏览器的窗口进行封装的对象

5.1.1 获取window对象

该对象不需要创建直接使用window,其中window.可以省略。比如我们之前使用的alert()函数,其实就是window对象的函数,在调用时可以写成如下两种

  • 显式使用window对象调用

  • 隐式调用

5.1.2 window对象属性

5.1.3 window对象函数

5.1.4 使用案例

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

<input type="button" onClick="on()" value="开灯">
<img id="myImage" border="0" src="" style="text-align:center;">
<input type="button" onClick="off()" value="关灯">

<script>
    function on(){
        document.getElementById('myImage').src='../imgs/on.gif';
    }

    function off(){
        document.getElementById('myImage').src='../imgs/off.gif'
    }
    var x = 0;

    // 根据一个变化的数字,产生固定个数的值; 2  x % 2     3   x % 3
    // 定时器
    setInterval(function (){
        if (x % 2 == 0){
            on();
        }else{
            off();
        }
        x++;

    },1000);

</script>
</body>
</html>

5.2 History对象

History对象是JavaScript对历史记录进行封装的对象

  • History对象的获取

        使用window.history获取,其中window.可以省略

  • History对象的函数

5.3 Location对象

5.3.1 获取Location对象

使用window.location获取,其中window.可以省略

5.3.2 Location对象属性 

5.3.3 案例

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

<script>
    /*

    alert("要跳转了");
    location.href = "https://www.baidu.com";

*/
    //3秒跳转到首页

    document.write("3秒跳转到首页...");
    setTimeout(function (){
        location.href = "https://www.baidu.com"
    },3000);
</script>
</body>
</html>

六、DOM

6.1 概述

DOM:Document Objecct Model 文档对象模型。也就是JavaScript将HTML文档的各个组成部分封装为对象。HTML文档是浏览器解析。封装的对象分为

  • Document:整个文档对象
  • Element:元素对象
  • Attribute:属性对象
  • Text:文本对象
  • Comment:注释对象

 作用:

JavaScript通过DOM,就能够对HTML进行操作了

  • 改变HTML元素的内容
  • 改变HTML元素的样式(CSS)
  • 对HTML DOM时间作出反应
  • 添加和删除HTML元素

DOM相关概念:

DOM是W3C(万维网联盟)定义了访问HTML和XML文档的标准。该标注被分为3个不同部分:

1. 核心DOM:针对任何结构化文档的标准模型。XML和HTML通用的标准

  • Document:整个文档对象
  • Element:元素对象
  • Attribute:属性对象
  • Text:文本对象
  • Comment:注释对象

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

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

    该标准是核心DOM基础上,对HTML中的每个标签都封装成了不同的对象

  • 例如:<img> 标签在浏览器加载到内存中时会被封装成 Image 对象,同时该对象也是 Element 对象。
  • 例如:<input type='button'> 标签在浏览器加载到内存中时会被封装成 Button 对象,同时该对象也是 Element 对象。

6.2 获取 Element对象

HTML 中的 Element 对象可以通过 Document 对象获取,而 Document 对象是通过 window 对象获取。

Document 对象中提供了以下获取 Element 元素对象的函数

  • getElementById() :根据id属性值获取,返回单个Element对象
  • getElementsByTagName() :根据标签名称获取,返回Element对象数组
  • getElementsByName() :根据name属性值获取,返回Element对象数组
  • getElementsByClassName() :根据class属性值获取,返回Element对象数组
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<img id="light" src="../imgs/off.gif"> <br>

<div class="cls">传智教育</div>   <br>
<div class="cls">黑马程序员</div> <br>

<input type="checkbox" name="hobby"> 电影
<input type="checkbox" name="hobby"> 旅游
<input type="checkbox" name="hobby"> 游戏
<br>

<script>
    /*
    获取:使用Document对象的方法来获取
        * getElementById:根据id属性值获取,返回一个Element对象
        * getElementsByTagName:根据标签名称获取,返回Element对象数组
        * getElementsByName:根据name属性值获取,返回Element对象数组
        * getElementsByClassName:根据class属性值获取,返回Element对象数组

     */
    //1. getElementById:根据id属性值获取,返回一个Element对象
    var img = document.getElementById("light");
    // alert(img);

    //2. getElementsByTagName:根据标签名称获取,返回Element对象数组

    var divs = document.getElementsByTagName("div");
   /* alert(divs.length);
     for (let i = 0; i < divs.length; i++) {
         alert(divs[i]);
     }*/

    //3. getElementsByName:根据name属性值获取,返回Element对象数组
    var hobbys = document.getElementsByName("hobby");
    /* for (let i = 0; i < hobbys.length; i++) {
         alert(hobbys[i]);

     }*/

    //4. getElementsByClassName:根据class属性值获取,返回Element对象数组
    var clss = document.getElementsByClassName("cls");
    for (let i = 0; i < clss.length; i++) {
        alert(clss[i]);

    }

</script>
</body>
</html>

6.3 HTML Element对象使用

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

<img id="light" src="../imgs/off.gif"> <br>

<div class="cls">传智教育</div>   <br>
<div class="cls">黑马程序员</div> <br>

<input type="checkbox" name="hobby"> 电影
<input type="checkbox" name="hobby"> 旅游
<input type="checkbox" name="hobby"> 游戏
<br>

<script>
    //1. getElementById:根据id属性值获取,返回一个Element对象
    var img = document.getElementById("light");
    // alert(img);
    img.src = "../imgs/on.gif";

    //2. getElementsByTagName:根据标签名称获取,返回Element对象数组
    var divs = document.getElementsByTagName("div");
    /*
        style:设置元素css样式
        innerHTML:设置元素内容
    */

    for (let i = 0; i < divs.length; i++) {
        //divs[i].style.color = 'red';
        divs[i].innerHTML = "呵呵";
    }

    //3. getElementsByName:根据name属性值获取,返回Element对象数组
    var hobbys = document.getElementsByName("hobby");
    for (let i = 0; i < hobbys.length; i++) {
        //alert(hobbys[i]);
        hobbys[i].checked = true;
    }

    //4. getElementsByClassName:根据class属性值获取,返回Element对象数组

    var clss = document.getElementsByClassName("cls");
    /*for (let i = 0; i < clss.length; i++) {
        alert(clss[i]);

    }*/

    
</script>
</body>
</html>

七、事件监听

HTML事件是发生在HTML元素上的"事情",比如:页面上的按钮被点击、鼠标移动到元素之上、按下键盘按键等都是事件。

事件监听是JavaScript可以在事件被侦测到执行一段逻辑代码。例如下图当我们点击开灯按钮,就需要通过js代码实现替换图片

7.1 事件绑定

JavaScript提供了两种事件绑定方式:

方式一:通过HTML标签中的事件属性进行绑定

方式二:通过DOM元素属性绑定

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

<input type="button" value="点我" onclick="on()"><br>
<input type="button" value="再点我" id="btn">

<script>
    function on(){
        alert("我被点啦~");
    }

    document.getElementById("btn").onclick = function (){
        alert("我又被点啦~");
    }
</script>

</body>
</html>

7.2 常见事件

下面列举一些比较常用的事件属性

  • onfocus:获得焦点事件 

  • onblur:失去焦点事件

  • onmouseout:鼠标移出事件
  • onmouseover:鼠标移入事件

  • onsubmit:表单提交事件

八、表单验证案例

8.1 需求

8.2 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎注册</title>
    <link href="../css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="#">登录</a>
    </div>
    <form id="reg-form" action="#" method="get">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input name="username" type="text" id="username">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


            <tr>
                <td>手机号</td>
                <td class="inputs"><input name="tel" type="text" id="tel">
                    <br>
                    <span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>




<script>

    //1. 验证用户名是否符合规则
    //1.1 获取用户名的输入框
    var usernameInput = document.getElementById("username");
    //1.2 绑定onblur事件 失去焦点
    usernameInput.onblur = checkUsername;

    function checkUsername() {
        //1.3 获取用户输入的用户名
        var username = usernameInput.value.trim();
        //1.4 判断用户名是否符合规则:长度 6~12,单词字符组成
        var flag = username.length >= 6 && username.length <= 12;
        if (flag) {
            //符合规则
            document.getElementById("username_err").style.display = 'none';
        } else {
            //不符合规则
            document.getElementById("username_err").style.display = '';
        }
        return flag;
    }


    //1. 验证密码是否符合规则
    //1.1 获取密码的输入框
    var passwordInput = document.getElementById("password");
    //1.2 绑定onblur事件 失去焦点
    passwordInput.onblur = checkPassword;

    function checkPassword() {
        //1.3 获取用户输入的密码
        var password = passwordInput.value.trim();
        //1.4 判断密码是否符合规则:长度 6~12,单词字符组成
        var flag = password.length >= 6 && password.length <= 12;
        if (flag) {
            //符合规则
            document.getElementById("password_err").style.display = 'none';
        } else {
            //不符合规则
            document.getElementById("password_err").style.display = '';
        }
        return flag;
    }


    //1. 验证手机号是否符合规则
    //1.1 获取手机号的输入框
    var telInput = document.getElementById("tel");
    //1.2 绑定onblur事件 失去焦点
    telInput.onblur = checkTel;

    function checkTel() {
        //1.3 获取用户输入的手机号
        var tel = telInput.value.trim();
        //1.4 判断手机号是否符合规则:长度 11
        var flag = tel.length == 11;
        if (flag) {
            //符合规则
            document.getElementById("tel_err").style.display = 'none';
        } else {
            //不符合规则
            document.getElementById("tel_err").style.display = '';
        }
        return flag;
    }


    //1. 获取表单对象
    var regForm = document.getElementById("reg-form");
    //2. 绑定onsubmit 事件
    regForm.onsubmit = function () {
        //挨个判断每一个表单项是否都符合要求,如果有一个不合符,则返回false
        var flag = checkUsername() && checkPassword() && checkTel();

        return flag;
    }


</script>

</body>
</html>

九、RegExp对象

RegExp是正则对象。正则对象是是判断指定字符串是否符合规则

9.1正则对象使用

9.1.1 创建对象

正则对象有两种创建方式

  • 直接量方式:注意不要加引号

  •  创建RegExp对象

9.1.2 函数

test(str):判断指定字符串是否符合规则,返回true或false

9.2 正则表达式

正则表达式定义了字符串组成的规则。也就是判断指定的字符串是否符合指定的规则,如果符合返回true,如果不符合返回 false。

正则表达式是和语言无关的。很多语言都支持正则表达式,Java语言也支持,只不过正则表达式在不同的语言中的使用方式 不同,js 中需要使用正则对象来使用正则表达式。

9.3 改进表单校验案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎注册</title>
    <link href="../css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="#">登录</a>
    </div>
    <form id="reg-form" action="#" method="get">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input name="username" type="text" id="username">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


            <tr>
                <td>手机号</td>
                <td class="inputs"><input name="tel" type="text" id="tel">
                    <br>
                    <span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>


<script>

    //1. 验证用户名是否符合规则
    //1.1 获取用户名的输入框
    var usernameInput = document.getElementById("username");
    //1.2 绑定onblur事件 失去焦点
    usernameInput.onblur = checkUsername;

    function checkUsername() {
        //1.3 获取用户输入的用户名
        var username = usernameInput.value.trim();
        //1.4 判断用户名是否符合规则:长度 6~12,单词字符组成
        var reg = /^\w{6,12}$/;
        var flag = reg.test(username);
        //var flag = username.length >= 6 && username.length <= 12;
        if (flag) {
            //符合规则
            document.getElementById("username_err").style.display = 'none';
        } else {
            //不符合规则
            document.getElementById("username_err").style.display = '';
        }
        return flag;
    }


    //1. 验证密码是否符合规则
    //1.1 获取密码的输入框
    var passwordInput = document.getElementById("password");
    //1.2 绑定onblur事件 失去焦点
    passwordInput.onblur = checkPassword;

    function checkPassword() {
        //1.3 获取用户输入的密码
        var password = passwordInput.value.trim();
        //1.4 判断密码是否符合规则:长度 6~12,单词字符组成
        var reg = /^\w{6,12}$/;
        var flag = reg.test(password);
        // var flag = password.length >= 6 && password.length <= 12;
        if (flag) {
            //符合规则
            document.getElementById("password_err").style.display = 'none';
        } else {
            //不符合规则
            document.getElementById("password_err").style.display = '';
        }
        return flag;
    }


    //1. 验证手机号是否符合规则
    //1.1 获取手机号的输入框
    var telInput = document.getElementById("tel");
    //1.2 绑定onblur事件 失去焦点
    telInput.onblur = checkTel;

    function checkTel() {
        //1.3 获取用户输入的手机号
        var tel = telInput.value.trim();
        //1.4 判断手机号是否符合规则:长度 11,数字组成,第一位是1
        var reg = /^[1]\d{10}$/;
        var flag = reg.test(tel);
        // var flag = tel.length == 11;
        if (flag) {
            //符合规则
            document.getElementById("tel_err").style.display = 'none';
        } else {
            //不符合规则
            document.getElementById("tel_err").style.display = '';
        }
        return flag;
    }


    //1. 获取表单对象
    var regForm = document.getElementById("reg-form");
    //2. 绑定onsubmit 事件
    regForm.onsubmit = function () {
        //挨个判断每一个表单项是否都符合要求,如果有一个不合符,则返回false
        var flag = checkUsername() && checkPassword() && checkTel();

        return flag;
    }


</script>

</body>
</html>

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值