• JavaScript语言诞生主要是完成页面的数据验证, 因此它运行在客户端, 需要运行浏览器来解析执行JavaScript代码
  • JS是弱类型, Java是强类型
  • 特点
    • 交互性(它可以做的就是信息的动态交互)
    • 安全性(不允许直接访问本地硬盘)
    • 跨平台性(只要是解释JS的浏览器都可以执行, 与平台无关)
  • 只需在head标签中, 或者在body标签中, 使用script标签来书写JavaScript代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //alert是JavaScript语言提供的一个警告框函数
  8. //它可以接收任何类型的参数, 这个参数就是警告框的提示信息
  9. alert("hello JavaScript!")
  10. </script>
  11. </head>
  12. <body>
  13. </body>
  14. </html>
  • 使用script标签引入单独的JavaScript代码文件
  1. //1.js
  2. alert("hello javascript")
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Title</title>
  8. <!--现在需要使用script引入外部的js文件来执行
  9. src属性专门用来引入js文件路径(相对路径和绝对路径都可以)
  10. script标签可以用来定义js代码, 也可以用来引入js文件
  11. 但是, 上面两种引入js外部文件的方式二选一使用即可, 不可同时使用
  12. -->
  13. <script type="text/javascript" src="1.js"></script>
  14. <script type="text/javascript">
  15. alert("abc")
  16. </script>
  17. </head>
  18. <body>
  19. </body>
  20. </html>
  • 什么是变量?
    • 变量是可以存放某些值的内存的命名
  • js的变量类型
    • 数值类型 number
    • 字符串类型 string
    • 对象类型 object
    • 布尔类型 boolean
    • 函数类型 function
  • js里特殊的值:
    • undefined 未定义,所有js变量未赋予初始值时, 都是undefined
    • null 空值
    • NAN 全称是 Not A Number 非数字,非数值
  • js中定义变量格式
    • var 变量名;
    • var 变量名 = 值;
  1. <script type="text/javascript">
  2. var i;
  3. //alert(i);//undefined
  4. i = 12;
  5. //typeof()是js语言提供的一个函数
  6. //它可以取变量的数据类型并返回
  7. alert(i);
  8. alert(typeof i)
  9. i = "abc";
  10. alert(typeof i)
  11. var a = 12;
  12. var b = "abc";
  13. alert(a*b);//NaN 非数字,非数值
  14. </script>
  • 等于: == 等于是简单的做字面值的比较
  • 全等于: === 除了字面值的比较之外, 还会比较两个变量的数据类型
  1. <script type="text/javascript">
  2. var a = "12";
  3. var b = 12;
  4. alert(a == b);//true
  5. alert(a === b);//false
  6. </script>
  • 与运算: &&
  • 或运算: ||
  • 取反运算: !
  • 在js语言中, 所有的变量, 都可以作为一个boolean类型的变量去使用
    • 0, null, undefined, “”(空串) 都认为是false
  • && 与运算 有两种情况
    1. 当表达式全为真的时候, 返回最后一个表达式的值
    2. 当表达式中, 有一个为假的时候, 返回第一个为假的表达式的值
  • || 或运算 也有两种情况
    1. 当表达式全为假的时候, 返回最后一个表达式的值
    2. 当表达式中, 有一个为真的时候, 返回第一个为真的表达式的值
  • 与运算和或运算 有短路
    • 短路就是当这个表达式有结果了以后, 后面的表达式不再执行
  1. <script type="text/javascript">
  2. var a = "abc";
  3. var b = true;
  4. var c = false;
  5. var d = null;
  6. // && 与运算 有两种情况
  7. //
  8. // 1. 当表达式全为真的时候, 返回最后一个表达式的值
  9. // 2. 当表达式中, 有一个为假的时候, 返回第一个为假的表达式的值
  10. alert(a && b);//true
  11. alert(b && a);//abc
  12. alert(a && c);//false
  13. alert(a && c);//false
  14. alert(a && d && c)//null
  15. // || 或运算 也有两种情况
  16. //
  17. // 1. 当表达式全为假的时候, 返回最后一个表达式的值
  18. // 2. 当表达式中, 有一个为真的时候, 返回第一个为真的表达式的值
  19. alert(c || d);//null
  20. alert(a || c);//abc
  21. </script>
  • js中数组的定义:
    • 格式
      • var 数组名 = []; //空数组
      • var 数组名 = [1,’abc’,true]; //定义数组同时赋值元素
  1. <script type="text/javascript">
  2. var arr = [];//定义一个空数组
  3. //alert(arr.length);//0
  4. arr[0] = 12;
  5. //alert(arr[0]);
  6. alert(arr.length)//1
  7. //js语言中的数组, 只要我们通过数组下标赋值,那么最大的下标值就会自动给数组进行扩容
  8. arr[2] = 'abc';
  9. alert(arr[1]);//undefined
  10. alert(arr.length);//3
  11. //数组的遍历
  12. for (var i = 0; i < arr.length; i++){
  13. alert(arr[i]);
  14. }
  15. </script>
  • function 函数名(形参列表){
    函数体
    }
    在js语言中, 如何定义带有返回值的函数?
    只需在函数体内直接使用return语句返回值即可
  1. <script type="text/javascript">
  2. //定义一个无参函数
  3. function f() {
  4. alert("无参函数f()被调用了")
  5. }
  6. //函数被调用才会执行
  7. //f();
  8. //定义一个有参函数
  9. function f1(a,b) {
  10. alert("有参函数f1()被调用了 a=>" + a + ",b=>" + b);
  11. }
  12. //f1(3,"abc")
  13. //定义带有返回值的函数
  14. function f2(num1,num2) {
  15. return num1 + num2;
  16. }
  17. alert(f2(100,50));
  18. </script>
  1. <script type="text/javascript">
  2. var f = function () {
  3. alert("无参函数");
  4. }
  5. f();
  6. var f2 = function (a,b) {
  7. alert("有参函数a=" + a + ",b=" + b);
  8. }
  9. f2(1,"aaa");
  10. var f3 = function (num1,num2) {
  11. return num1 + num2;
  12. }
  13. alert(f3(1,5));
  14. </script>
  • 注: 在Java中允许重载, 但js中函数的重载会覆盖掉上一次的定义
  1. <script type="text/javascript">
  2. function f() {
  3. alert("无参函数")
  4. }
  5. function f(a,b) {
  6. alert("有参函数")
  7. }
  8. f();//有参函数
  9. </script>
  • 就是在function函数中不需要定义, 但却可以直接用来获取所有参数的变量, 我们管它叫隐形参数
  • js中的隐形参数类似于Java中的可变长参数
    • public void fun(Object… args);
    • 可变长参数其实是一个数组
  1. <title>隐形参数</title>
  2. <script type="text/javascript">
  3. function f() {
  4. // alert(arguments[0]);
  5. // alert(arguments[1]);
  6. // alert(arguments[2]);
  7. for (var i = 0; i < arguments.length; i++) {
  8. alert(arguments[i]);
  9. }
  10. alert("无参函数")
  11. }
  12. //f(1,"aaa",true);
  13. //计算所有参数的和并返回
  14. function sum() {
  15. var sum = 0;
  16. for (var i = 0; i < arguments.length; i++) {
  17. if (typeof arguments[i] == "number"){
  18. sum = sum + arguments[i];
  19. }
  20. }
  21. return sum;
  22. }
  23. alert(sum(1,2,3,4,"aaa",5));
  24. </script>
  • 对象的定义:
    • var 变量名 = new Object(); //对象实例(空对象)
    • 变量名.属性名 = 值; //定义一个属性
    • 变量名.函数名 = function(){} //定义一个函数
  • 对象的访问:
    • 变量名.属性/函数名();
  1. <script type="text/javascript">
  2. // 对象的定义:
  3. // var 变量名 = new Object(); //对象实例(空对象)
  4. //
  5. // 变量名.属性名 = 值; //定义一个属性
  6. //
  7. // 变量名.函数名 = function(){} //定义一个函数
  8. var obj = new Object();
  9. obj.name = "张三";
  10. obj.age = 18;
  11. obj.fun = function () {
  12. alert("姓名: " + this.name + ", 年龄: " + this.age);
  13. }
  14. // 对象的访问:
  15. //
  16. // 变量名.属性/函数名();
  17. alert(obj.name);
  18. alert(obj.age);
  19. obj.fun();
  20. </script>
  • 对象的定义:

var 变量名 = { //空对象

属性名: 值, //定义一个属性

属性名: 值, //定义一个属性

函数名: function(){} //定义一个函数

};

  • 对象的访问:

变量名.属性/函数名();

  1. <script type="text/javascript">
  2. var obj = {
  3. name: "张三",
  4. age: 18,
  5. fun: function () {
  6. alert("姓名: " + this.name + ", 年龄: " + this.age);
  7. }
  8. };
  9. alert(obj.name);
  10. alert(obj.age);
  11. obj.fun();
  12. </script>
  • 什么是事件?
    • 事件是电脑输入设备与页面进行交互的响应. 我们称之为事件
  • 常用的事件:
    • onload 加载完成事件
      • 页面加载完成后, 常用于做页面js代码初始化操作
    • onclick 单击事件
      • 常用于按钮的点击响应操作
    • onblur 失去焦点事件
      • 常用于输入框失去焦点后验证其输入内容是否合法
    • onchange 内容发生改变事件
      • 常用于下拉列表和输入框内容发生改变后操作
    • onsubmit 表单提交事件
      • 常用于表单提交前, 验证所有表单项是否合法
  • 事件的注册又分为静态注册动态注册两种:
  • 什么是事件的注册(绑定)? 其实就是告诉浏览器, 当事件响应后要执行哪些操作代码, 叫事件注册或绑定
    • 静态注册事件: 通过html标签的事件属性直接赋予事件响应后的代码
    • 动态注册事件: 是指先通过js代码得到标签的dom对象, 然后再通过dom对象.事件名 = function(){} 这种形式赋予事件响应后的代码,动态注册基本步骤
      1. 获取标签对象
      2. 标签对象.事件名 = function(){}
  1. <script type="text/javascript">
  2. function onloadFun() {
  3. alert("静态注册onload事件,所有代码");
  4. }
  5. //onload事件动态注册, 是固定写法
  6. window.onload = function () {
  7. alert("动态注册的onload事件");
  8. }
  9. </script>
  10. <!--静态注册onload事件
  11. onload事件是浏览器解析完页面之后就会自动触发的事件
  12. <body onload="onloadFun()">
  13. -->
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //静态注册的onclick事件
  8. function onclickFun() {
  9. alert("静态注册的onclick事件");
  10. }
  11. //动态注册onclick事件
  12. window.onclick = function () {
  13. //1. 获取标签对象
  14. //document 是js语言提供的一个对象(文档)
  15. //getElementById 通过html中标签的id属性获取标签对象
  16. var btnObj = document.getElementById("btn2");
  17. //2. 通过标签对象.事件名 = function(){}
  18. btnObj.onclick = function () {
  19. alert("动态注册的onclick事件");
  20. }
  21. }
  22. </script>
  23. </head>
  24. <body>
  25. <!--静态注册onclick事件-->
  26. <button onclick="onclickFun()">按钮1</button>
  27. <button id="btn2">按钮2</button>
  28. </body>
  29. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //onblur的静态注册事件
  8. function onblurFun() {
  9. //console是控制台对象, 是由js语言提供, 专门用来向浏览器的控制器打印输出, 用于测试使用
  10. //log是打印的方法
  11. console.log('onblur的静态注册事件');
  12. }
  13. //onblur的动态注册事件
  14. window.onblur = function () {
  15. var pwdObj = document.getElementById("pwd");
  16. pwdObj.onblur = function () {
  17. console.log("onblur的动态注册事件");
  18. }
  19. }
  20. </script>
  21. </head>
  22. <body>
  23. <p>用户名: <input type="text" onblur="onblurFun()"></p>
  24. <p>密码:&nbsp;&nbsp;&nbsp; <input type="text" id="pwd"></p>
  25. </body>
  26. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. function onchangeFun() {
  8. alert("英雄已选择完毕");
  9. }
  10. window.onchange = function () {
  11. var selObj = document.getElementById("sel");
  12. selObj.onchange = function () {
  13. alert("铭文已选择完毕")
  14. }
  15. }
  16. </script>
  17. </head>
  18. <body>
  19. <p>请选择你的出场英雄: </p>
  20. <select onchange="onchangeFun()">
  21. <option>孙斌</option>
  22. <option>廉颇</option>
  23. <option>诸葛亮</option>
  24. <option>李白</option>
  25. <option>马可波罗</option>
  26. </select>
  27. <p>请选择你的铭文: </p>
  28. <select id="sel">
  29. <option>通用</option>
  30. <option>坦克</option>
  31. <option>法穿</option>
  32. <option>百穿</option>
  33. <option>攻速</option>
  34. </select>
  35. </body>
  36. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //onsubmit静态注册
  8. function onsubmitFun() {
  9. alert("onsubmit静态注册---发现不合法");
  10. return false;
  11. }
  12. //onsubmit动态注册
  13. window.onsubmit = function () {
  14. var formObj = document.getElementById("form");
  15. formObj.onsubmit = function () {
  16. alert("onsubmit动态注册---发现不合法");
  17. return false;
  18. }
  19. }
  20. </script>
  21. </head>
  22. <body>
  23. <!--return false 可以阻止表单提交-->
  24. <form action="http://localhost:8080" method="get" onsubmit="return onsubmitFun()">
  25. <input type="submit" value="静态注册">
  26. </form>
  27. <form action="http://localhost:8080" id="form">
  28. <input type="submit" value="动态注册">
  29. </form>
  30. </body>
  31. </html>
  • DOM全称是Document Object Model 文档对象模型
  • 其实就是把文档中的标签, 属性, 文本, 转换成对象来管理, 我们主要学习它们是如何转换的
  • Document对象的理解
    • 第一点: Document它管理了所有的HTML文档的内容
    • 第二点: Document它是一种树结构的文档. 有层级关系
    • 第三点: 它让我们把所有的标签都对象化
    • 第四点: 我们可以通过document访问所有的标签对象
  • document.getElementById(elementId)
    • 通过标签的id属性查找标签的dom对象, elementId是标签的id属性值
  • document.getElementByName(elementName)
    • 通过标签的name属性查找标签的dom对象, elementId是标签的name属性值
  • document.getElementByTagName(tagName)
    • 通过标签名查找标签的dom对象, tagName是标签名
  • document.createElement(tagName)
    • 通过给定的标签名, 创建一个标签对象, tagName是要创建的标签名
  • 根据元素标签id属性得到某元素标签
  • 示例: 校验输入的用户名是否合法
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. function onclickFun() {
  8. var username = document.getElementById("username");
  9. var usernameText = username.value;
  10. var reg = /^\w{5,12}$/;
  11. if (reg.test(usernameText)){
  12. alert("用户名合法");
  13. }else {
  14. alert("用户名不合法");
  15. }
  16. }
  17. </script>
  18. </head>
  19. <body>
  20. <!--要求: 当用户点击了校验按钮时, 要获取输入框中的内容并验证其是否合法
  21. 验证的规则是: 必须由数字字母下划线组成, 并且长度时5到12位
  22. -->
  23. <p>用户名: <input type="text" id="username"></p>
  24. <button onclick="onclickFun()">校验</button>
  25. </body>
  26. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则</title>
  6. <script type="text/javascript">
  7. //var pattern = new RegExp("e");//表示字符串中, 是否包含字母e
  8. //var pattern = /e/; //也是正则表达式对象,和上面表达的意思一样,只是写法不同
  9. //var pattern = /[abc]/; //表示字符串中,是否包含字母a或b或c
  10. //var pattern = /[a-z]/; //表示字符串中,是否包含小写字母
  11. //var pattern = /[A-Z]/; //表示字符串中,是否包含大写字母
  12. //var pattern = /[0-9]/; //表示字符串中,是否包含数字
  13. //var pattern = /\w/; //表示字符串中,是否包含字母,数字,下划线
  14. //var pattern = /a+/; //表示字符串中,是否包含至少一个a
  15. //var pattern = /a*/; //表示字符串中,是否包含0个或多个a
  16. //var pattern = /a?/; //表示字符串中,是否包含0个或1个a
  17. //var pattern = /a{3}/; //表示字符串中,是否包含连续3个a
  18. //var pattern = /a{3,5}/; //表示字符串中,是否包含至少3个至多5个连续的a
  19. //var pattern = /a{3,}/; //表示字符串中,是否包含至少3个连续的a
  20. //var pattern = /a$/; //表示字符串中,是否以a结尾
  21. //var pattern = /^a/; //表示字符串中,是否以a开头
  22. //var pattern = /^a{3,5}$/; //表示字符串中,从头到尾都必须完全匹配至少3个至多5个连续的a
  23. var pattern = /^\w{5,12}$/; //表示字符串中,从头到尾都必须完全匹配5至12位数的字母数字下划线组合
  24. alert(pattern);
  25. var str = "aaa1231231231";
  26. alert(pattern.test(str));
  27. </script>
  28. </head>
  29. <body>
  30. </body>
  31. </html>
  • innerHTML 表示起始标签和结束标签中的内容
    • 第一种: 文字提示, innerHTML 后写上想要显示的文字
      • usernameSpanObj.innerHTML = “用户名合法”;
    • 第二种: 图片提示,, innerHTML 后写上要显示的图片位置
      • usernameSpanObj.innerHTML = ““;
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. function onclickFun() {
  8. var username = document.getElementById("username");
  9. var usernameText = username.value;
  10. var reg = /^\w{5,12}$/;
  11. var usernameSpanObj = document.getElementById("usernameSpan");
  12. //innerHTML 表示起始标签和结束标签中的内容
  13. //innerHTML 这个属性可读,可写
  14. //usernameSpanObj.innerHTML = "可以自定义内容";
  15. if (reg.test(usernameText)){
  16. usernameSpanObj.innerHTML = "用户名合法";
  17. //usernameSpanObj.innerHTML = "<img src=\"right.png\" width=\"18\" height=\"18\">";
  18. }else {
  19. usernameSpanObj.innerHTML = "用户名不合法";
  20. //usernameSpanObj.innerHTML = "<img src=\"wrong.png\" width=\"18\" height=\"18\">";
  21. }
  22. }
  23. </script>
  24. </head>
  25. <body>
  26. <!--要求: 当用户点击了校验按钮时, 要获取输入框中的内容并验证其是否合法
  27. 验证的规则是: 必须由数字字母下划线组成, 并且长度时5到12位
  28. -->
  29. <p>用户名: <input type="text" id="username">
  30. <span id="usernameSpan" style="color: red"></span>
  31. </p>
  32. <button onclick="onclickFun()">校验</button>
  33. </body>
  34. </html>
  35. <!--<img src="right.png" width="18" height="18">-->
  • 根据元素标签name属性得到元素标签集合
  • 示例: 选择框全选,全不选, 反选
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //全选
  8. function checkAll() {
  9. //document.getElementsByName();是根据指定的name属性查询返回多个标签对象集合
  10. //这个集合和操作和数组一样
  11. //集合中每个元素都是dom对象
  12. //这个集合中的元素顺序是他们在html页面中从上到下的顺序
  13. var hobbies = document.getElementsByName("hobby");
  14. //checked表示复选框的选中状态, 如果选中为true,不选中为false
  15. //这个属性可读,可写
  16. for (var i = 0; i < hobbies.length; i++) {
  17. hobbies[i].checked = true;
  18. }
  19. }
  20. //全不选
  21. function checkNo() {
  22. var hobbies = document.getElementsByName("hobby");
  23. for (var i = 0; i < hobbies.length; i++) {
  24. hobbies[i].checked = false;
  25. }
  26. }
  27. //反选
  28. function checkReverse() {
  29. var hobbies = document.getElementsByName("hobby");
  30. for (var i = 0; i < hobbies.length; i++) {
  31. hobbies[i].checked = !hobbies[i].checked;
  32. // if (hobbies[i].checked){
  33. // hobbies[i].checked = false;
  34. // }else {
  35. // hobbies[i].checked = true;
  36. // }
  37. }
  38. }
  39. </script>
  40. </head>
  41. <body>
  42. 兴趣爱好:
  43. <input type="checkbox" name="hobby" value="cpp" checked="checked">C++
  44. <input type="checkbox" name="hobby" value="java">Java
  45. <input type="checkbox" name="hobby" value="js">JavaScript
  46. <br/>
  47. <button onclick="checkAll()">全选</button>
  48. <button onclick="checkNo()">全不选</button>
  49. <button onclick="checkReverse()">反选</button>
  50. </body>
  51. </html>
  • 根据标签元素的标签名得到标签元素集合
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //全选
  8. function checkAll() {
  9. //document.getElementsByTagName();是按照指定的标签名来进行查询并返回集合
  10. //这个集合和操作和数组一样
  11. //集合中每个元素都是dom对象
  12. //这个集合中的元素顺序是他们在html页面中从上到下的顺序
  13. var inputs = document.getElementsByTagName("input");
  14. for (var i = 0; i < inputs.length; i++) {
  15. inputs[i].checked = true;
  16. }
  17. }
  18. </script>
  19. </head>
  20. <body>
  21. 兴趣爱好:
  22. <input type="checkbox" value="cpp" checked="checked">C++
  23. <input type="checkbox" value="java">Java
  24. <input type="checkbox" value="js">JavaScript
  25. <br/>
  26. <button onclick="checkAll()">全选</button>
  27. </body>
  28. </html>
  • document对象的三个查询方法
    • 如果标签中有id属性,优先使用getElementById方法来进行查询
    • 如果标签中没有有id属性,有name属性, 则优先使用getElementByName方法来进行查询
    • 如果标签中没有有id和name属性,那么使用getElementsByTagName方法来进行查询
  • 以上三个查询方法, 一定要在页面加载完成后执行, 才能查询到标签对象
  • 节点就是标签对象
  • 方法
    • getElementsByTagName(): 获取当前节点的指定标签名孩子节点
    • appendChild(oChildNode): 可以添加一个子节点, oChildNode是要添加的孩子节点
  • 属性:
    • childNodes: 获取当前节点的所有子节点
    • firstChild: 获取当前节点的第一个子节点
    • lastChild: 获取当前节点的最后一个子节点
    • parentNode: 获取当前节点的父节点
    • nextSibling: 获取当前节点的下一个节点
    • previousSibling: 获取当前节点的上一个节点
    • className: 用于获取或设置标签的class属性值
    • innerHTML: 表示获取或设置起始标签和结束标签中的内容
    • innerText: 表示获取或设置起始标签和结束标签中的文本
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script type="text/javascript">
  7. //要求用js代码来创建html标签, 并显示在页面上
  8. //内容为JavaScript 很牛
  9. window.onload = function () {
  10. var divObj = document.createElement("div");
  11. divObj.innerHTML = "JavaScript 很牛";
  12. document.body.appendChild(divObj);
  13. }
  14. </script>
  15. </head>
  16. <body>
  17. </body>
  18. </html>
版权声明:本文为qimu666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/qimu666/p/16565744.html