JavaScript基本入门教程

JavaScript基本入门

一、JavaScript语法详解

1.JavaScript的组成

ECMAScript(核心):规定了JS的语法和基本对象
DOM文档对象模型:处理网页内容的方法和接口,D是指 标记型文档HTML
BOM浏览器对象模型:与浏览器交互的方法和接口

2.JavaScript的引入方式

1)内部脚本
  • 使用JavaScript:前缀构建执行JavaScript代码的URL(适合执行语句只有一行)
  • 使用<script>....</script>来包含JavaScript代码
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>运行JavaScript程序</title>
  6. </head>
  7. <body>
  8. <!--使用JavaScript:前缀构建执行JavaScript代码的URL-->
  9. <a href="javascript:alert('手动运行JavaScript!');">手动运行</a>
  10. <!--使用<script>....</script>来包含JavaScript代码-->
  11. <script type="text/javascript">
  12. alert("自动运行JavaScript!");
  13. </script>
  14. </body>
  15. </html>

2)导入JavaScript文件
    
    
  1. <script src="test.js" type="text/javascript"></script>
注意:外部引用时script标签内不能有script代码,即使写了也不会执行。

3.数据类型和变量

1)变量的声明
  • 隐式声明
  • 显式声明(推荐使用)
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>变量的声明</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 隐式声明
  10. a = "我是Lemon";
  11. alert(a);
  12. // 显式声明
  13. var b = "我是Tom";
  14. console.log(b);
  15. </script>
  16. </body>
  17. </html>

2)变量的命名规则
在声明JavaScript变量时,需要遵循以下命名规范:
                必须以字母或下划线开头,中间可以是数字、字符或下划线
                变量名不能包含空格等符号
                不能使用JavaScript关键字作为变量名,如:function、this、class
                JavaScript严格区分大小写。

3)基本数据类型
类似于java中的基本数据类型
                    string            字符串类型:” ”和’ ’都是字符串。 JavaScript中没有单个字符
                boolean        布尔类型:固定值为true和false
                number         数字类型:任意数字
                null                空,一个占位符。
      undefined      未定义类型,该类型只有一个固定值,即undefined,表示变量声明却未定义具体的值。
注:
A.因为undefined是从null中派生出来的,所以undefined==null。 JavaScript区别于java,是弱类型语言,变量的使用不用严格遵循规范,所以一个变量声明好之后,是可以赋予任意类型的值。
B.ECMAScript实现之初的一个bug,null属于基本数据类型,typeof(null)--object。

4)引用数据类型
引用类型通常叫做类(class),但在JavaScript中,因为不存在编译过程,所以没有类的概念,所处理的引用数据类型都是对象。
标准创建方式:
                var str = new String();  //和java相同
                var str = new String;  //js独有的方式

5)类型转换
JavaScript支持类型自动转换,且功能非常强大,看下面的代码案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>类型转换</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var a = "3.145";
  10. var b = 2;
  11. alert((a - b) + "\n" + (a + b));
  12. </script>
  13. </body>
  14. </html>
输出的结果是:
   
   
  1. 1.145
  2. 3.1452
分析:
  • 对于减号运算符,因为字符串不支持减法运算,所以自动将字符串转换成数值
  • 对于加号运算符,因为字符串可以用加号作为连接运算符,所以自动将数值转换为字符串
  • 其他类型的数据之间的转换可以自行实验,很简单

6)类型转换的常用方法(强制类型转换)
  • toString():将布尔类型值、数值等转换成字符串
  • parseInt():将字符串、布尔值等转换成整数(不进行四舍五入,直接取整)
  • parseFloat():将字符串、布尔值等转换成浮点数
代码案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>强制类型转换</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var a = "3.145";
  10. var b = 2;
  11. var c = parseInt(a);
  12. var d = parseFloat(a);
  13. var e = a + b;
  14. var f = c + b;
  15. var g = d + b;
  16. console.log(e + "-----" + f + "-----" + g);
  17. console.log(typeof(toString(b)));
  18. </script>
  19. </body>
  20. </html>
运行结果:
   
   
  1. 3.1452-----5-----5.145
  2. string
尤其要注意以下的这种情况:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>强制类型转换</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var a = "3.145a25";
  10. console.log(parseFloat(a));
  11. </script>
  12. </body>
  13. </html>
运行结果:
   
   
  1. 3.145
分析:数值字符串中出现非数值的字符的时候,强制类型转换只会转换这个非数值字符的前面的数值字符,后面的自动忽略。

7)全局变量和局部变量
  • 全局变量:可以在JavaScript所有脚本代码中使用。
  • 局部变量:只能在方法中起作用,出了方法,就不起作用了,但是,有一点必须注意,那就是在方法中没有代码块的概念,也就是说,在方法的代码块中定义的局部变量,在整个方法中都是可以使用的,不限于在代码块中。
  • 定义变量时使用var和不使用var的区别:如果使用var定义变量,那么程序会强制定义一个新的变量。如果没有使用var定义变量,系统会优先在当前上下文中搜索是否存在这个变量,如果有,则对这个变量重新赋值,否则重新定义一个新的变量。
  • 事件中的全局变量和局部变量:请看代码案例五。
代码案例一:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>全局变量和局部变量</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 定义全局变量
  10. var test = "全局变量";
  11. // 定义方法
  12. function fun() {
  13. // 定义局部变量,这个变量会在方法中覆盖掉全局变量
  14. // 而出了方法,就不起作用了
  15. var test1 = "局部变量";
  16. console.log(test);
  17. }
  18. fun();
  19. console.log(test);
  20. </script>
  21. </body>
  22. </html>
运行结果:
   
   
  1. 局部变量
  2. 全局变量
代码案例二:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>全局变量和局部变量</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. function test(obj) {
  10. // 定义一个局部变量,这个局部变量的作用范围是整个函数
  11. var i = 0;
  12. if (typeof obj == "object") {
  13. // 定义一个变量j,不同于Java,这个j的作用范围是这个函数,而不仅仅是if代码块内
  14. var j = 5;
  15. // 定义一个变量k,k的作用范围也是整个函数
  16. for (var k = 0; k < 5; k++) {
  17. document.write(k);
  18. }
  19. }
  20. // 已经出了if代码块
  21. document.write("<br />" + i + j + k);
  22. }
  23. // 调用函数
  24. test(document);
  25. </script>
  26. </body>
  27. </html>
运行结果:
   
   
  1. 01234
  2. 055
代码案例三:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>使用var和不使用var定义变量的区别</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var scope = "全局变量";
  10. function fun() {
  11. // 全局变量被局部变量覆盖
  12. // 但是此时的scope尚未被赋值,所以输出undefined
  13. document.writeln(scope + "<br />");
  14. // 定义局部变量,作用范围为整个函数
  15. var scope = "局部变量";
  16. document.writeln(scope + "<br />");
  17. }
  18. fun();
  19. </script>
  20. </body>
  21. </html>
运行结果:
   
   
  1. undefined
  2. 局部变量
分析:
全局变量被局部变量覆盖, 但是此时的scope尚未被赋值,所以输出undefined。因为用了var就是强制定义了一个新变量,并覆盖了全局变量,但是代码是从上到下依次执行,所以输出结果是:undefined。把局部变量的var取消掉,就可以输出正确结果。
代码案例四:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>使用var和不使用var定义变量的区别</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var scope = "全局变量";
  10. function fun() {
  11. // 依旧使用的是全局变量
  12. document.writeln(scope + "<br />");
  13. // 定义局部变量,但实际上是对全局变量的重新赋值
  14. scope = "局部变量";
  15. document.writeln(scope + "<br />");
  16. }
  17. fun();
  18. </script>
  19. </body>
  20. </html>
运行结果:
   
   
  1. 全局变量
  2. 局部变量
代码案例五:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>全局变量和局部变量</title>
  6. <script type="text/javascript">
  7. var x = 1314;
  8. </script>
  9. </head>
  10. <body>
  11. <!--这个按钮,重新定义了局部变量,所以输出局部变量-->
  12. <input type="button" value="局部变量" onclick="var x = 520; alert(x);" /><br />
  13. <!--这个按钮没有重新定义变量,所以输出全局变量-->
  14. <input type="button" value="全局变量" onclick="alert(x);" />
  15. </body>
  16. </html>

4.基本数据类型

  • 数值类型:包含整数和浮点数
  • 布尔类型:只有true和false
  • 字符串类型:用引号括起来的数据,可以是单引号或者是双引号
  • undefined类型:专门用来确定已经创建的变量,但是没有赋值的变量
  • null类型:表明某个变量的值为空
各种类型的相关计算和Java十分相似。可以结合Java中的基本数据类型加以比较。

5.正则对象

1)正则对象的创建方法
  • var reg = new RegExp("表达式");          (开发中基本不用)
  • var reg = /^表达式$/;                                直接量(开发中常用)
  • var reg = /表达式/;
注意事项:
                /^表达式$/        只要有无法成立正则的字符存在,即为false。
                                         全部符合为true
                                        (检查严格,眼睛不揉沙子)
                                        适用于表单校验
                /表达式/           只要有成立正则的字符存在,即为true。
                                        全部不符合为false
                                       (检查不严格,懒人思想)
                                        适用于字符串查找、替换
2)test()方法
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则对象</title>
  6. <script type="text/javascript">
  7. // 正则表达式对象创建方式,这种创建方式要注意把通配符的反斜杠转义掉
  8. var regex1 = new RegExp("\\w+@\\w+\\.\\w+");
  9. // 直接量的创建方式,开发中常用的是这样的方式,用于表单的校验
  10. var regex2 = /^\w+@\w+\.\w+$/;
  11. // 模糊匹配,只要部分符合,就返回true
  12. var regex3 = /\w+@\w+\.\w+/;
  13. console.log(regex1.test("223344@163.com"));
  14. console.log(regex2.test("223344@163.com"));
  15. console.log(regex3.test("!223344@163.com"));
  16. </script>
  17. </head>
  18. <body>
  19. </body>
  20. </html>
运行结果:
   
   
  1. true
  2. true
  3. true
3)结合字符串的replace()方法实现trim()方法
由于JavaScript的字符串没有trim()方法,而字符串的replace()方法也可以使用正则表达式,所以可以 结合字符串的replace()方法实现trim()方法。代码如下:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则表达式和replace()方法实现trim()方法</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. function trim (str) {
  10. // g表示尽可能多的匹配
  11. return str.replace(/(^\s*)|(\s*$)/g, "");
  12. }
  13. console.log(trim(" Hello,JavaScript "));
  14. </script>
  15. </body>
  16. </html>

6.复合类型

JavaScript中的复合类型大致上有如下三种:
  • Object:对象
  • Array:数组
  • Function:函数
1)数组对象
A.JavaScript数组的特点:
        JS数组可以看做 Java中的ArrayList 集合。
        数组中的每一个成员没有类型限制,及可以存放任意类型
        数组的长度可以自动修改
B. JavaScript数组的四种创建方式:
        var arr = [1,2,3,”a”,true];  // 常用的JS数组, 长度5
        var arr = new Array();  // 创建一个数组对象,数组长度默认为0
         var arr = new Array(4);  //  数组长度是4,相当于开辟了长度为4的空间,每个元素是undefined。(仅在显示数组时进行处理,undefined为了方便显示变成了空字符串形式,其值本质仍然是undefined)
          var arr = new Array(“a”,”b”,true);  //创建了一个数组,长度3,数组元素是”a”,”b”,true
代码案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>数组的四种创建方式</title>
  6. <script type="text/javascript">
  7. // JavaScript中的数组和Java中的数组不一样,其实它更类似于Java中的集合,
  8. // JavaScript中的数组的长度是可以变化的,还可以放置任意类型的数据
  9. // 第一种数组的创建方式,常用的创建方式
  10. var arr1 = [1, 2, 3, "我是Lemon"];
  11. // 第二种数组的创建方式,创建一个数组对象,数组长度默认为0
  12. var arr2 = new Array();
  13. // 第三种数组的创建方式,创建一个长度为4的数组
  14. var arr3 = new Array(4);
  15. // 第四种数组的创建方式
  16. var arr4 = new Array(1, 2, 3, "我是Lemon");
  17. for (e in arr1) {
  18. console.log(arr1[e]);
  19. }
  20. </script>
  21. </head>
  22. <body>
  23. </body>
  24. </html>
C.JS数组的常用属性/方法
属性/方法 说明
length 设置或者返回数组中的元素数目
join() 把数组中的所有元素放入到字符串中,按照指定的字符串分隔
pop() 删除最后一个元素并返回
push() 向数组的末尾添加一个或者更多个元素,并返回数组的长度
reverse() 颠倒数组中元素的顺序
代码案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>数组的常用方法和属性</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 创建一个数组对象
  10. var arr = [1, 2, 3, 4, "我是Lemon"];
  11. // length属性
  12. console.log("数组arr的长度为:" + arr.length);
  13. // 可以设置arr的长度,当长度大于本身长度时候,多余的部分用undefined填充,但是实际内容也是空的
  14. arr.length = 8;
  15. console.log("数组arr的最后一位元素为:" + arr[7]);
  16. // join()方法,把数组中的所有元素放入到字符串中,按照指定的字符串分隔
  17. console.log(arr.join(","));
  18. // pop()方法,删除最后一个元素并返回
  19. console.log("被删除的元素是:" + arr.pop());
  20. console.log("数组arr的长度为:" + arr.length);
  21. // push()方法,向数组的末尾添加一个或者更多个元素,并返回数组的长度
  22. arr.push("CSDN");
  23. console.log(arr);
  24. arr.push("地点", "北京中关村");
  25. console.log(arr);
  26. // reverse()方法,颠倒数组中元素的顺序
  27. console.log(arr.reverse());
  28. </script>
  29. </body>
  30. </html>
运行结果:
   
   
  1. 数组arr的长度为:5
  2. 数组arr的最后一位元素为:undefined
  3. 1,2,3,4,我是Lemon,,,
  4. 被删除的元素是:undefined
  5. 数组arr的长度为:7
  6. 1,2,3,4,我是Lemon,,,CSDN
  7. 1,2,3,4,我是Lemon,,,CSDN,地点,北京中关村
  8. 北京中关村,地点,CSDN,,,我是Lemon,4,3,2,1
D.数组的特点
  • JavaScript的数组长度可边,数组的长度是数组最大索引+1
  • 同一个数组的元素可以互相不同
  • 访问数组元素时不会产生数组越界,访问未赋值的数组元素的时候,该元素的值为undefined

2)全局函数
A.eval()函数: 计算JavaScript字符串,并把它当做脚本代码来执行。
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>eval()函数</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var str = window.prompt("请输入一段JavaScript可执行的算术代码:");
  10. window.alert("您输入的代码执行结果是:" + eval(str));
  11. </script>
  12. </body>
  13. </html>
B.URI/URL编码和解码
URL/URI编码:中文及特殊符号转换成 %16进制
作用:保证数据传递的完整性。
属性/方法 说明
encodeURI() 将字符串编码成URI
decodeURI() 将编码好的URI解码成原本的字符串
代码案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>URI的编码和解码</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var uri1 = "http://127.0.0.1:8020/Day03_Course/20URI%E7%9A%84%E7%BC%96"
  10. + "%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81.html";
  11. console.log("解码的结果是:" + decodeURI(uri1));
  12. var uri2 = "http://127.0.0.1:8020/Day03_Course/20URI的编码和解码.html";
  13. console.log("编码的结果是:" + encodeURI(uri2));
  14. </script>
  15. </body>
  16. </html>
运行结果是:
   
   
  1. 解码的结果是:http://127.0.0.1:8020/Day03_Course/20URI的编码和解码.html
  2. 编码的结果是:http://127.0.0.1:8020/Day03_Course/20URI%E7%9A%84%E7%BC%96%E7%
  3. A0%81%E5%92%8C%E8%A7%A3%E7%A0%81.html

3)自定义函数
如果一段代码需要被重复编写使用,那么我们为了方便统一编写使用,可以将其封装进一个函数(方法)中。作用:增强代码的复用性。
自定义函数的三种方式:
  • 定义命名函数
  • 定义匿名函数
  • 使用Function类匿名函数(了解)
  • 递归函数

A.定义命名函数
定义格式:
   
   
  1. function 函数名 (参数列表) {
  2. // 函数体
  3. }
说明:
  • JavaScript函数定义必须用小写的function;
  • JavaScript函数无需定义返回值类型,直接在function后面书写 方法名;
  • 参数的定义无需使用var关键字,否则报错;
  • JavaScript函数体中,return可以不写,也可以return 具体值,或者仅仅写return;
代码案例:
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>自定义函数</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. function printSeason (month) {
  10. switch (month) {
  11. case "12":
  12. case "1":
  13. case "2":
  14. window.alert(month + "月是冬季");
  15. break;
  16. case "3":
  17. case "4":
  18. case "5":
  19. window.alert(month + "月是春季");
  20. break;
  21. case "6":
  22. case "7":
  23. case "8":
  24. window.alert(month + "月是夏季");
  25. break;
  26. case "9":
  27. case "10":
  28. case "11":
  29. window.alert(month + "月是秋季");
  30. break;
  31. default:
  32. window.alert("您输入的月份有误,请重新输入!");
  33. break;
  34. }
  35. }
  36. var month = window.prompt("请输入月份(1-12):");
  37. printSeason(month);
  38. </script>
  39. </body>
  40. </html>
函数使用的注意事项:
  • JavaScript函数调用执行完毕一定有返回值,值及类型根据return决定,如果未return具体值,返回值为undefined;
  • JavaScript函数若同名,则不存在方法重载,只有方法相互覆盖,最后定义的函数覆盖之前的定义;
  • 因为JavaScript不存在函数重载,所以JavaScript仅根据方法名来调用函数,即使实参与函数的形参不匹配,也不会影响正常调用;
  • 如果形参未赋值,就使用默认值undefined
  • 在同一个<script>...</script>标签中允许先调用函数,再定义函数,但是在不同的<script>...</script>标签中,只能调用前面的<script>...</script>标签中的函数,不允许调用后面的<script>...</script>标签中的函数。

B.定义匿名函数
定义格式:
    
    
  1. var fun = function (参数列表) {
  2. // 函数体
  3. };
说明:
  • 无需指定函数名;
  • 函数定义完成之后不要忘记加上分号(;)
  • 匿名函数往往都是使用一个变量进行接收返回值;
  • 实际开发中建议使用这种定义方式,在给类或者对象定义方法的时候,使用这种方式更加简洁。
代码案例:
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>匿名函数</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 实际开发中建议使用这种定义方式
  10. var result = function (str) {
  11. return str.toUpperCase();
  12. };
  13. var str = window.prompt("请输入一段英文字符串:");
  14. window.alert("您输入的字符串转换后的结果是:" + result(str));
  15. </script>
  16. </body>
  17. </html>

C. 使用Function类匿名函数(了解)
JavaScript提供了Function类,该类可以用来定义函数,该类的构造器可以接收一系列字符串作为参数,其中最后一个字符串参数是函数的执行体。
代码案例如下:
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Function类定义函数</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 该函数的定义方式所有的参数都是字符串,且最后一个字符串是函数体
  10. var printInfo = new Function("name", "age",
  11. "window.alert('您输入的姓名是:' + name + ',年龄是:' + age)"
  12. );
  13. printInfo("Tom", "23");
  14. </script>
  15. </body>
  16. </html>

D.递归函数
代码案例:
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>递归函数</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 定义递归函数实现5的阶乘
  10. var diGui = function (num) {
  11. if (num == 0) return 1;
  12. if (num == 1) return 1;
  13. return num * diGui(num - 1);
  14. };
  15. var num = parseInt(window.prompt("请输入一个整数:"));
  16. // 这里使用isNaN来判断num是否是NaN,因为NaN也是number类型
  17. // 且NaN不和任何类型的数据相等,只能使用isNaN()方法来判断是否是NaN
  18. if (typeof(num) == "number" && !isNaN(num)) {
  19. if (num >= 0) {
  20. window.alert(num + "的阶乘是:" + diGui(num));
  21. } else {
  22. window.alert("您输入的数字小于0,会导致内存溢出!");
  23. }
  24. } else {
  25. window.alert("您输入的数字有误,请重新输入!");
  26. }
  27. </script>
  28. </body>
  29. </html>
重点说明:
  • 这里使用isNaN来判断num是否是NaN,因为NaN也是number类型
  • 且NaN不和任何类型的数据相等,只能使用isNaN()方法来判断是否是NaN

3)自定义对象
对象是一系列命名变量、函数的集合。其中命名变量既可以是基本数据类型,也可以是复合数据类型,对象中命名变量称为属性,而对象中的函数称为方法,对象访问属性和方法可以通过链式编程"."来实现。自定义对象的两种常见方法:
  • 使用new关键字调用构造器创建对象
  • 使用Object直接创建对象
  • 使用JSON语法创建对象

A. 使用new关键字调用构造器创建对象
使用new关键字调用构造器创建对象,这是最接近面向对象语言的创建对象的方式,这种创建方式总是可以返回一个对象。代码案例如下:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>new关键字创建对象</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 定义一个函数,也就是定义了一个Person类
  10. function Person (name, age) {
  11. this.name = name;
  12. this.age = age;
  13. this.printInfo = function () {
  14. console.log("姓名:" + this.name + ",年龄:" + this.age);
  15. }
  16. }
  17. // 第一种创建对象的方法:无参创建
  18. var p1 = new Person();
  19. // 第二种创建对象的方法:带参创建
  20. var p2 = new Person("张三", 19);
  21. // 调用方法
  22. p1.printInfo();
  23. p2.printInfo();
  24. // 添加属性
  25. p1.school = "地大";
  26. console.log("毕业院校:" + p1.school);
  27. // 仅仅是添加了对象p1的school属性,p2没有添加
  28. console.log("毕业院校:" + p2.school);
  29. </script>
  30. </body>
  31. </html>
运行结果:
   
   
  1. 姓名:undefined,年龄:undefined
  2. 姓名:张三,年龄:19
  3. 毕业院校:地大
  4. 毕业院校:undefined

B. 使用Object直接创建对象
JavaScript对象都是Object类的实例对象,因此可以使用如下方式创建,然后动态地添加方法和属性:
   
   
  1. var myObj = new Object();
方法案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>使用Object直接创建对象</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 直接创建对象
  10. var myObj = new Object();
  11. // 添加属性
  12. myObj.name = "张三";
  13. myObj.age = 19;
  14. myObj.school = "地大";
  15. // 添加方法
  16. myObj.printInfo = function () {
  17. window.alert("姓名:" + this.name + ",年龄:" + this.age + ",毕业院校:" + this.school);
  18. };
  19. // 调用方法
  20. myObj.printInfo();
  21. // 遍历对象的全部属性或者方法
  22. // m在数组中是索引,在这里是键
  23. for (var m in myObj) {
  24. console.log(myObj[m]);
  25. }
  26. </script>
  27. </body>
  28. </html>
运行结果:
   
   
  1. 张三
  2. 19
  3. 地大
  4. function () {
  5. window.alert("姓名:" + this.name + ",年龄:" + this.age + ",毕业院校:" + this.school);
  6. }

C.使用JSON语法创建对象
使用JSON语法创建对象的优点:
  • 避免书写函数
  • 避免书写new
  • 使用键值对的形式创建属性和方法
代码案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>使用JSON语法创建对象</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var person = {
  10. name : "张三",
  11. age : 19,
  12. school : "中国地质大学",
  13. printInfo : function () {
  14. window.alert("姓名:" + this.name + ",年纪:"
  15. + this.age + ",毕业院校:" + this.school);
  16. }
  17. };
  18. person.printInfo();
  19. </script>
  20. </body>
  21. </html>

7.函数专项

  • 函数:就像Java的方法一样,这个函数可以被调用
  • 对象:定义一个函数的时候,系统也会自动创建一个对象,该对象是Function的实例
  • 方法:定义一个函数的时候,该函数通常都会被附加给某个对象,作为该对象的方法
  • 类:定义函数的同时,也会得到一个与函数同名的类

代码案例1: 函数不仅可以调用,还是一个对象,是Function和Object的实例,window对象的方法。
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>函数专项研究1</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 定义一个匿名函数
  10. var hello = function (name) {
  11. return name + ",您好!";
  12. };
  13. // 判断hello方法是何种类型
  14. console.log(hello instanceof Object);
  15. console.log(hello instanceof Function);
  16. // 当定义一个方法的时候,通常会把方法附加给window对象
  17. console.log(window.hello("张三"));
  18. </script>
  19. </body>
  20. </html>

代码案例2: 定义函数的时候,如果没有明确把这个函数附加到哪个对象上,那么它就会被附加到window对象上。
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>函数专项研究2</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 直接定义一个函数,没有指定该函数属于哪个对象,那么默认为window
  10. var hello = function (name) {
  11. return name + ",您好!"
  12. };
  13. // 以window对象作为调用者
  14. console.log(window.hello("李四"));
  15. // 定义一个对象
  16. var p = {
  17. // 定义一个方法,这个方法属于对象p
  18. walk : function () {
  19. console.log("慢慢走....")
  20. }
  21. };
  22. // 以p对象作为调用者
  23. p.walk();
  24. </script>
  25. </body>
  26. </html>

代码案例3:函数的实例属性、类属性、局部变量的区别
实例属性:只有在对象中才存在,创建对象以后,才有这个属性,且不同对象之间的属性可以不一样。
类属性:类属性是类的属性,只有通过类名来调用,无法通过对象来调用,对象调用的时候就会出现undefined。
局部变量:在函数内可用,出了函数就不可用。
下面通过一个案例来区别 函数的实例属性、类属性、局部变量:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>实例属性、类属性和局部变量之间的区别</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 定义一个函数
  10. function Person(national, name, age) {
  11. // 类属性
  12. Person.national = national;
  13. // 实例属性
  14. this.name = name;
  15. this.age = age;
  16. // 局部变量
  17. var arg = 0;
  18. }
  19. // 创建第一个对象p1
  20. var p1 = new Person("China", "Tom", 29);
  21. // 因为national是类属性,对象p1并没有这个属性,所以打印的结果国籍是undefined
  22. console.log("姓名:" + p1.name + " ,年龄:" + p1.age + " ,国籍:" + p1.national);
  23. console.log("姓名:" + p1.name + " ,年龄:" + p1.age + " ,国籍:" + Person.national);
  24. // 输出arg,因为arg是局部变量,出了方法就不能使用,所以输出为undefined
  25. console.log(p1.arg);
  26. // 创建第二个对象p2
  27. var p2 = new Person("Janpan", "Lemon", 32);
  28. // 重新创建一个对象以后,按照类属性进行打印
  29. console.log("姓名:" + p2.name + " ,年龄:" + p2.age + " ,国籍:" + Person.national);
  30. // 重新打印对象p1对象,发现p1的国籍变成了和p2的一致,这是因为类属性改变后,所有的
  31. // 该类属性都会变化,但是作为对象的属性,对象创建完成以后就不会再变了
  32. console.log("姓名:" + p1.name + " ,年龄:" + p1.age + " ,国籍:" + Person.national);
  33. // 动态地为p1对象添加属性,p2不会享有
  34. p1.score = 98;
  35. console.log(p2.score);
  36. // 动态地为类添加属性,则整个类都有了该属性,但是对象还是不会有
  37. Person.grade = 1;
  38. console.log(Person.grade);
  39. console.log(p1.grade);
  40. </script>
  41. </body>
  42. </html>
分析结果:
  • 创建第一个对象p1,因为national是类属性,对象p1并没有这个属性,所以p1.national打印的结果国籍是undefined
  • 输出arg,因为arg是局部变量,出了方法就不能使用,所以输出为undefined
  • 创建第二个对象p2,重新创建一个对象以后,按照类属性进行打印,重新打印对象p1对象,发现p1的国籍变成了和p2的一致,这是因为类属性改变后,所有的该类属性都会变化,但是作为对象的属性,对象创建完成以后就不会再变了
  • 动态地为某个对象添加属性,或者方法,它们只属于这个对象,其他的对象则不会享受这样的属性和方法,而动态地添加类属性,则会改变类的属性。

二、BOM对象

1.BOM对象的基本概念

  • BOM(Browser Object Model)浏览器对象模型
  • 浏览器:IE、火狐、谷歌等
  • 作用:用来执行浏览器的相关操作。(例如:浏览器的地址、弹出消息等)
  •  一般情况下,window代表了BOM对象。
  • window对象是JavaScript的内置对象,使用window对象调用方法时可以省略window不写。
BOM对象包括: Window、 Navigator、 Screen、 History、 Location。这里着重讲解 Window、 Navigator以及 History对象。

2.window对象

1)window对象的基本概述
window对象是整个JavaScript脚本运行的顶层对象,当定义一个全局变量的时候,它就是window对象的属性,当定义一个方法的时候,它就是window对象的方法。
代码案例:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>全局变量和全局方法与window对象之间的关系</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 定义一个全局变量
  10. var arg = 10;
  11. // 定义一个全局方法
  12. var fun = function () {
  13. console.log("我是全局方法");
  14. };
  15. // 判断全局变量与全局方法是否是window对象的属性和方法,返回结果都是true
  16. console.log("arg是window对象的属性吗:" + (arg === window.arg));
  17. console.log("fun是window对象的方法吗:" + (fun === window.fun));
  18. </script>
  19. </body>
  20. </html>

2)window对象的常用方法
  • alert():警告框,用来弹出警告消息
  • confirm():确认框,用于告知用户信息并收集用户的选择
  • prompt():输入对话框,用来收集用户的输入
  • 定时器:setInterval()、clearInterval()和setTimeout()、clearTimeout()
代码案例1:
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>window对象的alert()方法</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var name = prompt("请输入您的姓名:");
  10. var flag = confirm("您的姓名是:" + name + " 吗?");
  11. alert("用户的回答是:" + (flag ? "是" : "不是"));
  12. </script>
  13. </body>
  14. </html>
代码案例2:定时器
  • setInterval(“code”, interval)、clearInterval(timer):设置、删除定时器。setInterval设置每隔interval毫秒执行一次code
     
     
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>定时器的应用</title>
  6. </head>
  7. <body>
  8. <p id="tm"></p>
  9. <script type="text/javascript">
  10. // 定义一个定时变量
  11. var timer;
  12. // 保存页面开始执行的时间
  13. var cur = new Date().getTime();
  14. var setTime = function () {
  15. // 设置指定标签的内容体
  16. document.getElementById("tm").innerHTML = new Date().toString();
  17. if (new Date().getTime() - cur >= 60 * 1000) {
  18. clearInterval(timer);
  19. }
  20. };
  21. timer = setInterval("setTime()", 1000);
  22. </script>
  23. </body>
  24. </html>
  • setTimeout(“code”, interval)、clearTimeout(timer):设置、删除单次定时器。setTimeout设置在interval毫秒后执行一次code
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>定时器的应用</title>
  6. </head>
  7. <body>
  8. <p id="tm"></p>
  9. <script type="text/javascript">
  10. var timer;
  11. var cur = new Date().getTime();
  12. var setTime = function () {
  13. document.getElementById("tm").innerHTML = new Date().toLocaleString();
  14. if (new Date().getTime() - cur <= 60 * 1000) {
  15. window.setTimeout("setTime()", 1000);
  16. }
  17. };
  18. setTime();
  19. </script>
  20. </body>
  21. </html>

3.location对象

window对象还包含一个location属性,该属性可用于访问该窗口所装载的文档地址URL。window.location返回的是Location的实例对象,它有一个href属性可以用来跳转页面。
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>location对象的href属性</title>
  6. </head>
  7. <body>
  8. <input type="button" value="跳转按钮" onclick="zhiling()"/>
  9. <script type="text/javascript">
  10. var tz = function () {
  11. location.href = "http://127.0.0.1:8020/Day02_Course/"
  12. + "34%e4%ba%8c%e7%bb%b4%e7%a0%81%e5%90%8d%e7%89%87.html"
  13. };
  14. var zhiling = function () {
  15. alert("5秒后将跳转到指定页面!");
  16. setTimeout("tz()", 5000);
  17. };
  18. </script>
  19. </body>
  20. </html>

三、DOM对象

1.DOM对象的概述

  • DOM(Document Object Model) 文档对象模型
  • 文档:标记型文档(HTML等)
  • DOM是将标记型文档中所有内容(标签、文本、属性)都封装成对象,通过操作对象的属性或者方法,来达到操作或者改变HTML展示效果的目的。

2.获取元素对象的四种方法

在JavaScript中,我们可以通过DOM对象的4种方式获取对应的元素对象:
  • getElementById();   ---通过元素ID获取对应元素对象,可以通过ID获取对应的元素对象,如果找不到,返回null
  • getElementsByName();   ---通过元素的name属性获取符合要求的所有元素
  • getElementsByTagName();   ---通过元素的元素名属性获取符合要求的所有元素
  • getElementsByClassName();   ---通过元素的class属性获取符合要求的所有元素,可以获取到元素节点对象 数组;如果找不到,返回 空数组
代码案例1: getElementById()
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>根据ID来获取元素对象</title>
  6. </head>
  7. <body>
  8. <p id="text">我是P标签的文本</p>
  9. <textarea id="textarea">我是文本域textarea的文本</textarea>
  10. <input type="button" value="点击访问" onclick="accessById()"/>
  11. <script type="text/javascript">
  12. var accessById = function () {
  13. alert(document.getElementById("text").innerHTML + "\n" +
  14. document.getElementById("textarea").value);
  15. };
  16. </script>
  17. </body>
  18. </html>
注意:表单元素的可见内容的获取都是通过它的value属性来获取的。

代码案例2:通过节点关系来访问HTML元素(建议使用Element而不是Node)
   
   
  1. <ol id="books">
  2. <li id="java">疯狂java讲义</li>
  3. <li id="ssh">轻量级Java EE企业应用实战</li>
  4. <li id="ajax" class="selected">疯狂Ajax讲义</li>
  5. <li id="xml">疯狂XML讲义</li>
  6. <li id="ejb">经典Java EE企业应用实战</li>
  7. <li id="andriod">疯狂Andriod讲义</li>
  8. </ol>
  9. <hr />
  10. <input type="button" value="获取父节点" onclick="change(currentElement.parentElement)"/><br />
  11. <input type="button" value="获取第一个节点" onclick="change(currentElement.parentElement.firstElementChild)"/><br />
  12. <input type="button" value="获取上一个节点" onclick="change(currentElement.previousElementSibling)"/><br />
  13. <input type="button" value="获取下一个节点" onclick="change(currentElement.nextElementSibling)"/><br />
  14. <input type="button" value="获取下下一个节点" onclick="change(currentElement.nextElementSibling.nextElementSibling)"/><br />
  15. <input type="button" value="获取最后一个节点" onclick="change(currentElement.parentElement.lastElementChild)"/><br />
  16. <script type="text/javascript">
  17. var currentElement = document.getElementById("ajax");
  18. var change = function (target) {
  19. alert(target.innerHTML);
  20. };
  21. </script>

3.访问表单控件

这里仅仅根据一个例子来实现访问:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>访问表单控件</title>
  6. </head>
  7. <body>
  8. <form id="form" action="#" method="post">
  9. <input type="text" name="username" /><br />
  10. <input type="password" name="password" /><br />
  11. <select name="color">
  12. <option value="red">红色</option>
  13. <option value="blue">蓝色</option>
  14. <option value="green">绿色</option>
  15. </select>
  16. <hr />
  17. <input type="button" value="第一个" onclick="alert(document.getElementById('form').elements[0].name)" /><br />
  18. <input type="button" value="第二个" onclick="alert(document.getElementById('form').elements['password'].name)" /><br />
  19. <input type="button" value="第三个" onclick="alert(document.getElementById('form').color.lastElementChild.innerHTML)" /><br />
  20. </form>
  21. </body>
  22. </html>

4.访问列表框、下拉菜单的选项

   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>访问列表框和下拉菜单</title>
  6. </head>
  7. <body>
  8. <select id="mySelect" name="mySelect" size="6">
  9. <option id="java">疯狂java讲义</option>
  10. <option id="ssh">轻量级Java EE企业应用实战</option>
  11. <option id="ajax" selected="selected">疯狂Ajax讲义</option>
  12. <option id="xml">疯狂XML讲义</option>
  13. <option id="ejb">经典Java EE企业应用实战</option>
  14. <option id="andriod">疯狂Andriod讲义<option>
  15. </select><br />
  16. <hr />
  17. <input type="button" value="第一个" onclick="alert(document.getElementById('mySelect').options[0].innerHTML)" /><br />
  18. <input type="button" value="第二个" onclick="alert(document.getElementById('mySelect').firstElementChild.nextElementSibling.innerHTML)" /><br />
  19. <input type="button" value="第三个" onclick="alert(document.getElementById('ajax').index)" /><br />
  20. </body>
  21. </html>

5.访问表格子元素

   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>访问表格对象</title>
  6. </head>
  7. <body>
  8. <table id="table" border="1px">
  9. <caption>疯狂讲义体系</caption>
  10. <tr id="tr1">
  11. <td>疯狂Java讲义</td>
  12. <td>轻量级JavaEE企业应用实战</td>
  13. </tr>
  14. <tr id="tr2">
  15. <td>疯狂Ajax讲义</td>
  16. <td>经典JavaEE企业应用实战</td>
  17. </tr>
  18. <tr id="tr3">
  19. <td>疯狂XML讲义</td>
  20. <td>疯狂Android讲义</td>
  21. </tr>
  22. </table>
  23. <hr />
  24. <input type="button" value="第一个" onclick="alert(document.getElementById('table').caption.innerHTML)"/><br />
  25. <input type="button" value="第二个" onclick="alert(document.getElementById('table').rows[0].cells[0].innerHTML)"/><br />
  26. <input type="button" value="第三个" onclick="alert(document.getElementById('table').rows[2].cells[1].innerHTML)"/><br />
  27. </body>
  28. </html>

6.修改HTML元素

   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>动态修改表格内容</title>
  6. </head>
  7. <body>
  8. 改变第<input type="text" id="rowNum" size="2"/>行,
  9. <input type="text" id="colNum" size="2"/>列的值为:
  10. <input type="text" id="content" size="16"/>
  11. <input type="button" value="确定修改" onclick="change()" />
  12. <hr />
  13. <table id="table" border="1px">
  14. <caption>疯狂讲义体系</caption>
  15. <tr id="tr1">
  16. <td>疯狂Java讲义</td>
  17. <td>轻量级JavaEE企业应用实战</td>
  18. </tr>
  19. <tr id="tr2">
  20. <td>疯狂Ajax讲义</td>
  21. <td>经典JavaEE企业应用实战</td>
  22. </tr>
  23. <tr id="tr3">
  24. <td>疯狂XML讲义</td>
  25. <td>疯狂Android讲义</td>
  26. </tr>
  27. </table>
  28. <script type="text/javascript">
  29. var change = function () {
  30. var rowText = document.getElementById("rowNum").value;
  31. var colText = document.getElementById("colNum").value;
  32. var contentText = document.getElementById("content").value;
  33. var tableElement = document.getElementById("table");
  34. if (rowText == "") {
  35. alert("您要修改的行数为空,请输入行数!");
  36. return false;
  37. } else if (colText == "") {
  38. alert("您要修改的列数为空,请输入列数!");
  39. return false;
  40. } else if (contentText == "") {
  41. alert("您要修改的内容为空,请输入内容!");
  42. return false;
  43. }
  44. if (isNaN(parseInt(rowText))) {
  45. alert("您输入的行数不是整数,请重新输入!");
  46. return false;
  47. } else if (isNaN(parseInt(colText))) {
  48. alert("您输入的列数不是整数,请重新输入!");
  49. return false;
  50. }
  51. if (parseInt(rowText) > tableElement.rows.length ||
  52. parseInt(colText) > tableElement.rows.item(0).cells.length) {
  53. alert("您要修改的单元格不在本表格内,请重新输入!");
  54. return false;
  55. }
  56. // 修改内容
  57. tableElement.rows.item(parseInt(rowText) - 1).cells.item(parseInt(colText) - 1).innerHTML = contentText;
  58. alert("恭喜您修改成功!");
  59. }
  60. </script>
  61. </body>
  62. </html>

7.增加HTML元素

1)创建节点
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>创建节点</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. var div = document.createElement("div");
  10. alert(div);
  11. </script>
  12. </body>
  13. </html>
2)复制节点
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>复制节点</title>
  6. </head>
  7. <body>
  8. <ul id="d">
  9. <li>疯狂Java讲义</li>
  10. </ul>
  11. <script type="text/javascript">
  12. // 获取要复制的元素对象
  13. var ul = document.getElementById("d");
  14. // 复制它的第一个子元素对象,false表示不复制当前节点的后代节点
  15. var java = ul.firstElementChild.cloneNode(false);
  16. // 修改节点内容,并添加到页面中
  17. java.innerHTML = "疯狂Ajax讲义";
  18. ul.appendChild(java);
  19. </script>
  20. </body>
  21. </html>
3)为列表框,下拉菜单添加选项
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>为下拉框列表框菜单添加选项</title>
  6. </head>
  7. <body id="test">
  8. <script type="text/javascript">
  9. // 创建select的对象
  10. var s = document.createElement("select");
  11. // 添加第一个选项
  12. s.innerHTML = "<option>新增选项1</option>";
  13. // 循环添加9个选项
  14. for (var i = 0; i < 9; i++) {
  15. var op = document.createElement("option");
  16. op.innerHTML = "新增选项" + (i + 2);
  17. s.add(op);
  18. }
  19. // 把select对象添加到body中
  20. var bodyElement = document.getElementById("test");
  21. bodyElement.appendChild(s);
  22. </script>
  23. </body>
  24. </html>
4)动态添加表格内容
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>动态添加表格内容</title>
  6. </head>
  7. <body id="creatTable">
  8. <script type="text/javascript">
  9. var tableElement = document.createElement("table");
  10. tableElement.border = "1px";
  11. tableElement.createCaption().innerHTML = "新增表格";
  12. for (var i = 0; i < 6; i++) {
  13. var trElement = tableElement.insertRow(i);
  14. for (var j = 0; j < 6; j++) {
  15. var tdElement = trElement.insertCell(j);
  16. tdElement.innerHTML = "新增表格第" + (i + 1) + "行第" + (j + 1) + "列";
  17. }
  18. }
  19. document.getElementById("creatTable").appendChild(tableElement);
  20. </script>
  21. </body>
  22. </html>

8.删除HTML元素

1)删除节点
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>删除节点</title>
  6. </head>
  7. <body id="test">
  8. <input id="add" type="button" value="增加" disabled="disabled" onclick="add()" />
  9. <input id="del" type="button" value="删除" onclick="del()" />
  10. <hr />
  11. <div id="testObj">被测试的对象</div>
  12. <script type="text/javascript">
  13. // 获取body对象
  14. var bodyElement = document.getElementById("test");
  15. // 获取被测试的对象
  16. var testObjElement = document.getElementById("testObj");
  17. // 创建add方法
  18. function add() {
  19. // 由于网页已经加载完毕,所以一开始是有testObjElement对象的,不管运行什么方法,
  20. // testObjElement都是存在在内存中的
  21. bodyElement.appendChild(testObjElement);
  22. document.getElementById("add").disabled="disabled";
  23. document.getElementById("del").disabled="";
  24. }
  25. function del() {
  26. // 由于网页已经加载完毕,所以一开始是有testObjElement对象的,不管运行什么方法,
  27. // testObjElement都是存在在内存中的
  28. bodyElement.removeChild(testObjElement);
  29. document.getElementById("add").disabled="";
  30. document.getElementById("del").disabled="disabled";
  31. }
  32. </script>
  33. </body>
  34. </html>
2)删除列表框、下拉菜单的选项
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <input id="opValue" type="text" />
  9. <input type="button" value="增加" onclick="add()"/>
  10. <input type="button" value="删除" onclick="del()"/>
  11. <hr />
  12. <select id="show" size="8" style="width: 120px;"></select>
  13. <script type="text/javascript">
  14. var add = function () {
  15. // 以文本框的值来创建option对象
  16. var op = new Option(document.getElementById("opValue").value);
  17. // 以select的id作为唯一标识来添加元素
  18. // 下面的语句可以换成document.getElementById("show").appendChild(op);
  19. show.options[show.options.length] = op;
  20. };
  21. var del = function () {
  22. // 判断列表框子元素个数
  23. if (show.options.length == 0) {
  24. alert("没有选项可以删除了!")
  25. } else {
  26. // 删除元素
  27. // 可以使用document.getElementById("show").remove(0);
  28. // 可以使用show.options.remove(0);
  29. // 可以使用show.options[show.options.length - 1] = null;
  30. show.remove(show.options.length - 1);
  31. }
  32. };
  33. </script>
  34. </body>
  35. </html>
3)删除表格的行和单元格
    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>删除表格的行或者单元格</title>
  6. </head>
  7. <body id="body">
  8. <input type="button" value="删除最后一行" onclick="delLastRow()" />
  9. <input type="button" value="删除最后一个单元格" onclick="delLastCell()" />
  10. <hr />
  11. <table id="table" border="1px solid">
  12. <tr id="tr1">
  13. <td>疯狂Java讲义</td>
  14. <td>轻量级JavaEE企业级应用</td>
  15. </tr>
  16. <tr id="tr2">
  17. <td>疯狂Java讲义</td>
  18. <td>轻量级JavaEE企业级应用</td>
  19. </tr>
  20. <tr id="tr3">
  21. <td>疯狂Java讲义</td>
  22. <td>轻量级JavaEE企业级应用</td>
  23. </tr>
  24. <tr id="tr4">
  25. <td>疯狂Java讲义</td>
  26. <td>轻量级JavaEE企业级应用</td>
  27. </tr>
  28. </table>
  29. <script type="text/javascript">
  30. // 获取表格的对象
  31. var tableElement = document.getElementById("table");
  32. // 定义删除最后一行的方法
  33. var delLastRow = function () {
  34. if (tableElement.rows.length > 0) {
  35. // 删除行
  36. tableElement.deleteRow(tableElement.rows.length - 1);
  37. } else {
  38. alert("已经没有表格的行可以删除了!")
  39. }
  40. };
  41. // 定义删除最后一个单元格的方法
  42. var delLastCell = function () {
  43. if (tableElement.rows.length > 0) {
  44. // 获取最后一行
  45. var lastRow = tableElement.rows.item(tableElement.rows.length - 1);
  46. // 删除最后一个单元个
  47. if (lastRow.cells.length > 0) {
  48. lastRow.deleteCell(lastRow.cells.length - 1);
  49. } else {
  50. delLastRow();
  51. }
  52. } else {
  53. alert("已经没有表格的行可以删除了");
  54. }
  55. };
  56. </script>
  57. </body>
  58. </html>

四、事件处理机制

1.两种绑定事件的基本方法

1)绑定HTML元素属性
代码案例:表单校验
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>数据校验表单</title>
  6. </head>
  7. <body>
  8. <div>
  9. <h2>数据校验表单</h2>
  10. <form method="get" id="register" name="register" action="#" onsubmit="return checkForm()" >
  11. 用户名:<input type="text" name="username" id="username"/><br /><br />
  12. 密&nbsp;码:<input type="password" name="password" id="password"/><br /><br />
  13. 电&nbsp;邮:<input type="text" name="email" id="email"/><br /><br />
  14. <input type="submit" value="提交" />
  15. </form>
  16. <script type="text/javascript">
  17. // 为字符串增加一个trim()方法
  18. String.prototype.trim = function () {
  19. var regex = /\s*/;
  20. return this.replace(regex, "");
  21. };
  22. // 检查用户名
  23. var checkUserName = function () {
  24. // 获取用户名对象
  25. var usernameElement = document.getElementById("username");
  26. var username = usernameElement.value.trim();
  27. // 检查是否为空
  28. if (username == "" || username == null) {
  29. alert("用户名为空,请输入用户名!");
  30. return false;
  31. }
  32. // 检查是否符合用户名要求
  33. var usernameRegex = /^[a-zA-Z]+\w*/;
  34. if (!usernameRegex.test(username)) {
  35. alert("用户名只能由字母、数字和下划线组成,且只能以字母开头!");
  36. return false;
  37. }
  38. return true;
  39. };
  40. // 检查密码
  41. var checkPassWord = function () {
  42. // 获取密码对象
  43. var passwordElement = document.getElementById("password");
  44. var password = passwordElement.value.trim();
  45. // 检查是否为空
  46. if (password == "" || password == null) {
  47. alert("密码为空,请输入密码!");
  48. return false;
  49. }
  50. return true;
  51. };
  52. // 检查邮箱
  53. var checkEmail = function () {
  54. // 获取邮箱对象
  55. var emailElement = document.getElementById("email");
  56. var email = emailElement.value.trim();
  57. // 判断邮箱是否为空
  58. if (email == "" || email == null) {
  59. alert("邮箱不能为空,请输入邮箱!");
  60. return false;
  61. }
  62. // 检查邮箱是否符合邮箱格式
  63. var emailRegex = /^\w+@[a-zA-Z0-9]+\.[a-zA-Z]+/;
  64. if (!emailRegex.test(email)) {
  65. alert("您输入的邮箱格式不符合要求,请重新输入!");
  66. return false;
  67. }
  68. return true;
  69. };
  70. // 组合方法
  71. var checkForm = function () {
  72. return checkUserName() && checkPassWord() && checkEmail();
  73. };
  74. </script>
  75. </div>
  76. </body>
  77. </html>
2)绑定DOM对象属性
代码案例:表单校验
HTML代码:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>数据校验表单</title>
  6. </head>
  7. <body>
  8. <div>
  9. <h2>数据校验表单</h2>
  10. <form method="get" id="register" name="register" action="#" >
  11. 用户名:<input type="text" name="username" id="username"/><br /><br />
  12. 密&nbsp;码:<input type="password" name="password" id="password"/><br /><br />
  13. 电&nbsp;邮:<input type="text" name="email" id="email"/><br /><br />
  14. <input type="submit" value="提交" />
  15. </form>
  16. <script type="text/javascript" src="js/JavaScript52.js" ></script>
  17. </div>
  18. </body>
  19. </html>
JavaScript代码:
   
   
  1. // 为字符串增加一个trim()方法
  2. String.prototype.trim = function () {
  3. var regex = /\s*/;
  4. return this.replace(regex, "");
  5. };
  6. // 检查用户名
  7. var checkUserName = function () {
  8. // 获取用户名对象
  9. var usernameElement = document.getElementById("username");
  10. var username = usernameElement.value.trim();
  11. // 检查是否为空
  12. if (username == "" || username == null) {
  13. alert("用户名为空,请输入用户名!");
  14. return false;
  15. }
  16. // 检查是否符合用户名要求
  17. var usernameRegex = /^[a-zA-Z]+\w*/;
  18. if (!usernameRegex.test(username)) {
  19. alert("用户名只能由字母、数字和下划线组成,且只能以字母开头!");
  20. return false;
  21. }
  22. return true;
  23. };
  24. // 检查密码
  25. var checkPassWord = function () {
  26. // 获取密码对象
  27. var passwordElement = document.getElementById("password");
  28. var password = passwordElement.value.trim();
  29. // 检查是否为空
  30. if (password == "" || password == null) {
  31. alert("密码为空,请输入密码!");
  32. return false;
  33. }
  34. return true;
  35. };
  36. // 检查邮箱
  37. var checkEmail = function () {
  38. // 获取邮箱对象
  39. var emailElement = document.getElementById("email");
  40. var email = emailElement.value.trim();
  41. // 判断邮箱是否为空
  42. if (email == "" || email == null) {
  43. alert("邮箱不能为空,请输入邮箱!");
  44. return false;
  45. }
  46. // 检查邮箱是否符合邮箱格式
  47. var emailRegex = /^\w+@[a-zA-Z0-9]+\.[a-zA-Z]+/;
  48. if (!emailRegex.test(email)) {
  49. alert("您输入的邮箱格式不符合要求,请重新输入!");
  50. return false;
  51. }
  52. return true;
  53. };
  54. // 组合方法
  55. var checkForm = function () {
  56. return checkUserName() && checkPassWord() && checkEmail();
  57. };
  58. // 绑定DOM元素对象,后面的只是函数的引用,因此千万不能加上括号
  59. document.getElementById("register").onsubmit = checkForm;

2.事件处理函数中的this关键字

  • JavaScript脚本通常处于window对象下运行,如果JavaScript脚本中使用this关键字,通常引用到window对象本身。
  • 如果在HTML元素的onclick属性指定JavaScript脚本,如果在这些脚本使用了this关键字,那么该关键字指向HTML元素本身。
代码案例1:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>函数与this关键字1</title>
  6. </head>
  7. <body>
  8. <input id="bn" type="button" value="在此按钮上使用this关键字" onclick="alert('在HTML的onclick属性上使用this关键字,' +
  9. '它是指向该标签吗?\n答案是:' + (document.getElementById('bn') == this))"/>
  10. <script type="text/javascript">
  11. alert("独立的JavaScript代码的this指向window对象吗?\n答案是:" + (window == this));
  12. </script>
  13. </body>
  14. </html>
代码案例2:
   
   
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>函数与this关键字2</title>
  6. </head>
  7. <body>
  8. <!--这里的this指向按钮1的对象-->
  9. <input id="btn1" type="button" value="按钮1" onclick="alert(this.value)" />
  10. <input id="btn2" type="button" value="按钮2" />
  11. <input id="btn3" type="button" value="按钮3" />
  12. <script type="text/javascript">
  13. function test1 () {
  14. alert(this.value);
  15. }
  16. // 将test1函数设置为按钮2的事件处理函数
  17. // 这个this指向按钮1对象
  18. document.getElementById("btn2").onclick = test1;
  19. // 使用JSON格式定义一个p对象
  20. var p = {
  21. value : "p对象",
  22. info : function () {
  23. alert(this.value);
  24. }
  25. };
  26. // 将p对象的info方法设置为按钮3的事件处理函数
  27. // 这样的this也是按钮2对象
  28. document.getElementById("btn3").onclick = p.info;
  29. // 如果要将this指代p对象,需要将p来调用info()方法
  30. /*document.getElementById("btn3").onclick = function () {
  31. p.info();
  32. };*/
  33. </script>
  34. </body>
  35. </html>
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值