JavaScript基础 01 JavaScript简介 起源 • JavaScript诞生于1995年,它的出现主要是用于处理网页中的前端验证。
• 所谓的前端验证,就是指检查用户输入的内容是否符合一定的规则。
• 比如:用户名的长度,密码的长度,邮箱的格式等。
简史 • JavaScript是由网景公司发明,起初命名为LiveScript,后来由于SUN公司的介入更名为了JavaScript。
• 1996年微软公司在其最新的IE3浏览器中引入了自己对JavaScript的实现JScript。
• 于是在市面上存在两个版本的JavaScript,一个网景公司的JavaScript和微软的JScript。
• 为了确保不同的浏览器上运行的JavaScript标准一致,所以几个公司共同定制了JS的标准名命名为ECMAScript 。
年份
事件
1995
网景公司开发了JavaScript
1996
微软发布和JavaScript兼容的JScript
1997
ECMAScript第1版(ECMA-262)
1998
ECMAScript第2版
1998
DOM Level1制定
1998
新型语言DHTML登场
1999
ECMAScript第3版
2000
DOM Level2制定
2002
ISO/IEC 16262:2002确立
2004
DOM Level3制定
2005
新型语言Ajax登场
2009
ECMAScript第5版
2009
新型语言HTML5登场
实现
ECMAScript是一个标准,而这个标准需要由各个厂商去实现。
不同的浏览器厂商对该标准会有不同的实现。
浏览器
JavaScript实现方式
FireFox
SpriderMonkey
Internet Explorer
JScript/Chakra
Safari
JavaScriptCore
Chrome
v8
Carakan
Carakan
我们已经知道ECMAScript是JavaScript标准,所以一般情况下这两个词我们认为是一个意思。
但是实际上JavaScript的含义却要更大一些。
一个完整的JavaScript实现应该由以下三个部分组成:
学习内容
特点
JS的特点
解释型语言
类似于C和Java的语法结构
动态语法
基于原型的面向对象
解释型语言
JavaS cript是一门解释型语言,所谓解释型值语言不需要被编译为机器码再执行,而是直接执行。
由于缺少这一步骤,所以解释型语言开发起来尤为轻松,但是解释型语言运行较慢也是它的劣势。
不过解释型语言中使用了JIT技术,使得运行速度得以改善。
类似于C和Java的语法结构
JavaScript的语法结构与C和Java很像,像for 、if 、while等语句和Java基本是一摸一样的
所有有过C和Java基础的同学学习起来会轻松很多
不过JavaScript和与Java的关系也仅仅只是看起来像而已
动态语言
JavaScript是一门动态语言,所谓的动态语言可以暂时理解为在语言中的一切内容是不确定的。比如,一个变量在这一时刻是一个整型,但是在下一刻可能就会变成字符串了。当然这个问题我们以后再谈。
不过再补充一句,动态语言相比静态语言性能要差一点,不过由于JavaScript中应用了JIT,所以JS可能是运行速度最快的动态语言了
基于原型的面向对象
JavaScript是一门面向对象的语言,但是与Java不同,JavaScript是基于原型的面向对象。
02 HelloWorld案例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > HelloWorld</title > <script > alert("你好啊!" ); document .write("mk" ) console .log("曾经沧海难为水" ) </script > </head > <body > </body > </html >
03 js代码编写位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > js编写位置</title > <script src ="./js/03js编写位置.js" > </script > <script > alert("写在script标签上的代码" ) </script > </head > <body > <button onclick ="alert('js代码编写在标签的onclick属性')" > 点击</button > <a href ="javascript:alert('你好啊');" > 点击超链接</a > <a href ="javascript:;" > 点击超链接</a > </body > </html >
04 基础语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > js基本语法</title > <script > /* 多行注释 JS注释 多行注释,注释中的内容不会执行,但是可以在源代码中查看 要养成编写注释的良好习惯,也可以通过注释来对代码进行一些简单的调试 */ /* 1. JS中严格区分大小写 2.JS中每一条语句以(;)结尾,如果不写浏览器会自动添加,但是会消耗一些系统资源. 而且有时候浏览器会加错分号,所以开发中最好写分号 3.JS中会自动忽略多个空格和换行,所以我们可以利用空格和换行进行格式化 */ </script > </head > <body > </body > </html >
05 字面量和常量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 字面量和变量</title > <script > /* 字面量:都是一些不可改变的`值 比如:1 2 3 4 5 6 字面量都是可以直接使用,但是我们一般不会直接使用字面量 变量:可以用来保存字面量,而且变量的值是可以任意变化的 变量更加方便了我们使用,所以开发中都是使用变量去保存一个字面量,而很少直接使用字面量 可以通过变量对字面量进行描述 */ var a = 1 ; console .log(a); </script > </head > <body > </body > </html >
06 标识符
07 字符串String 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 字符串</title > <script > /* 数据类型指的是字面量的类型 在JS中一共有6种数据类型 String 字符串 Number 数值 Boolean 布尔值 Null 空值 Underfined 未定义 Object 对象 其中String Number Null Underfined Boolean 属于基本数据类型,而Object 属于引用数据类型 */ /* String 字符串 - 在JS中使用字符串需要使用引号引起来 - 使用双引号或单引号都可以,但是不要混用 - 引号不能嵌套,双引号中不能放双引号,单引号中不能放单i引号;但是可以在单引号中放双引号,双引号中放单引号。 或者可以使用转义字符,当需要表示一些特殊符号时可以使用\进行转义 \n:换行符 \t:制表符 */ var str = "hello" ; console .log(str); console .log("str" ); var welcome = "我说: \"你好\"" ; console .log(welcome); var str2 = "你好\n你快乐吗?" ; var str3 = "1\t2\t3\t4\t5\t6" ; console .log(str2, str3); var str4 = "\\" ; console .log(str4); </script > </head > <body > </body > </html >
08 Number 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Number</title > <script > /* - Number :在JS中所有的数值都是Number 类型, 包括整数和浮点数(小数) JS中可以表示数字的最值 MAX:1.7976931348623157e+308 MIN:5e-324(大于0的最小值) 如果结果超出表示范围:将会返回Infinity / -Infinity 注意:这里的Infinity 是字面量,可以用于赋值,使用typeof 检查,将返回Number NaN 是一个特殊的数字,表示Not a Number 使用typeof 检查一个NaN 也会返回number - JS中,整数的计算基本可以保持精确 但是使用JS进行浮点运算,可能得到一个不精确的结果,这是二进制运算导致的,所以千万不要使用JS进行对精确度要求较高的运算 */ var a = 123 ; console .log(a); var b = "3.1415926" a = 3.1415926; console .log(a); console .log(b); /* 可以使用一个运算符typeof 来检查一个变量的类型 语法:typeof 变量 */ console .log(typeof a); console .log(typeof b); console .log(Number .MAX_VALUE); console .log(Number .MIN_VALUE); console .log(Number .MAX_VALUE * Number .MAX_VALUE); console .log(typeof Infinity ); var c = "abc" * "bcd" ; console .log(c); console .log(typeof NaN ); var d = 123 + 456 ; console .log(d); var e = 0.1 + 0.2 ; console .log(e); </script > </head > <body > </body > </html >
09 Boolean 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Boolean</title > <script > /* Boolean :布尔值 只有两个值:true / false ,用来做逻辑判断 */ var bool = true ; console .log(bool); console .log(typeof bool); </script > </head > <body > </body > </html >
010 Null 和 Undefined 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Null 和 Underfined</title > <script > /* Null类型的值只有一个,就是null ,null 这个值专门用来表示一个为空的对象,使用typeof 检查一个null 值时,会返回object Underfined类型的值只有一个,就是underfined 当声明一个变量,但是不给变量赋值,它的值就是undefined 使用typeof 检查undefined ,将会返回underfined */ console .log(typeof null ); var a; console .log(a); console .log(typeof a); </script > </head > <body > </body > </html >
011 强制类型转换-String 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 强制类型转换-String</title > <script > var a = 123 ; console .log(typeof a); </script > </head > <body > </body > </html >
012 强制类型转换-Number 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 强制类型转换-Number</title > <script > var a = "123" ; console .log(a); console .log(typeof a); </script > </head > <body > </body > </html >
013 其他进制的数字 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 其他进制的数字</title > <script > var a = 123 ; console .log(a); a = 0x10 ; console .log(a); </script > </head > <body > </body > </html >
014 转换为Boolean 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 转换为Boolean</title > <script > </script > </head > <body > </body > </html >
015 算数运算符 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 算数运算符</title > <script > var a = 123 ; var res = typeof a; console .log(res); </script > </head > <body > </body > </html >
016 一元运算符 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 一元运算符</title > <script > var a = 1 ; a = +a; console .log(a); a = -a; console .log(a); a = true ; a = -a; console .log(a); </script > </head > <body > </body > </html >
017 自增和自减 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 自增和自减</title > <script > var a = 1 ; a++; </script > </head > <body > </body > </html >
019 逻辑运算符 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 逻辑运算符</title > <script > var a = true ; a = !a; console .log(a); </script > </head > <body > </body > </html >
020 非布尔值的与或运算 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 非布尔值的与或运算</title > <script > </script > </head > <body > </body > </html >
021 赋值运算符 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 赋值运算符</title > <script > var a = 0 ; a += 5 ; </script > </head > <body > </body > </html >
022 关系运算符 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 关系运算符</title > <script > console .log(5 > 10 ); </script > </head > <body > </body > </html >
023 Unicode编码 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Unicode编码</title > <script > console .log("\u0031" ); </script > </head > <body > <h1 > ☣ </h1 > </body > </html >
024 相等运算符 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 相等运算符</title > <script > console .log(1 == 1 ); </script > </head > <body > </body > </html >
025 条件运算符 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 条件运算符</title > <script > true ? console .log("执行语句1" ) : console .log("执行语句2" ); false ? console .log("执行语句1" ) : console .log("执行语句2" ); </script > </head > <body > </body > </html >
026 运算符的优先级
1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 运算符的优先级</title > <script > </script > </head > <body > </body > </html >
027 代码块 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 代码块</title > <script > { alert("你好" ); console .log("hello" ); document .write("你好" ); var a = 10 ; } console .log(a); </script > </head > <body > </body > </html >
028 if语句(一) 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 流程控制语句</title > <script > var a = 15 ; if (a > 10 && a < 20 ) { console .log(a); } </script > </head > <body > </body > </html >
029 if语句(二) 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > if语句</title > <script > var age = 15 ; if (age < 35 && age > 22 ) { console .log("还要继续996" ); } else if (age >= 35 ) { console .log("可以退休了" ); } else { console .log("摆烂" ); } </script > </head > <body > </body > </html >
030 - 032 练习 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 练习</title > <script > var scores; scores = prompt("请输入期末成绩(0-100):" ); if (isNaN (scores) || scores > 100 || scores < 0 ) { console .log("输入不合法!" ); } else if (scores === 100 ) { console .log("奖励一辆BMW" ); } else if (scores >= 80 ) { console .log("奖励一台iphone13 pro Max" ); } else if (scores >= 60 ) { console .log("奖励一本资料" ); } else { console .log("没有奖励" ); } </script > </head > <body > </body > </html >
1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 练习二</title > <script > var a = +prompt("数字1:" ); var b = +prompt("数字2:" ); var c = +prompt("数字3:" ); var a1, b1, c1; if (isNaN (a) || isNaN (b) || isNaN (c)) { console .log("输入不合法!" ); } else { console .log(a > b ? (a > c ? a : c) : (b > c ? b : c), a > b ? (b > c ? b : (a > c ? c : a)) : (b < c ? b : (a < c ? c : a)), a < b ? (a > c ? c : a) : (b > c ? c : b)); } </script > </head > <body > </body > </html >
033 条件分支语句 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 条件分支语句</title > <script > var num = 1 ; switch (num) { case 1 : console .log("壹" ); break ; case 2 : console .log("贰" ); break ; case 3 : console .log("叁" ); break ; default : console .log("芜湖~~" ); } </script > </head > <body > </body > </html >
034 switch练习 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > switch练习</title > <script > var score = 80 ; </script > </head > <body > </body > </html >
035 while循环 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > while循环</title > <script > var a = 0 ; while (a < 100 ) { document .write(a++ + "<br/>" ); } </script > </head > <body > </body > </html >
036 while练习 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > while练习</title > <script > var years = 0 , money = 1000 ; while (money < 5000 ) { money += money * 0.05 ; years++; } document .write(years); </script > </head > <body > </body > </html >
037 for循环 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > for循环</title > <script > for (var i = 0 ; i < 10 ; i++) { console .log(i); } </script > </head > <body > </body > </html >
三道题 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 三道例题</title > <script > </script > </head > <body > </body > </html >
039 质数练习 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 质数练习</title > <script > var num; while (true ) { num = prompt("请输入数字(必须大于1的整数):" ); if (num > 1 && parseInt (num) == num) { break ; } else { alert("输入非法!" ) } } for (var i = parseInt (num / 2 ); i > 1 ; i--) { </script > </head > <body > </body > </html >
041 嵌套for循环 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 嵌套for循环</title > <script > // var str = "*"; // for (var i = 0; i < 6; i++) { // console.log(str); // str += " *"; // } // for (var i = 1; i <= 10; i++) { // for (var j = i; j > 0; j--) { // document.write("* "); // } // document.write("<br /> "); // } // 倒三角 for (var i = 10; i > 0; i--) { for (var j = i; j > 0; j--) { document.write("* "); } document.write("<br /> "); } </script > </head > <body > </body > </html >
042 两个练习 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 两个练习</title > <script > for (var i = 1 ; i < 10 ; i++) { for (var j = 1 ; i >= j; j++) { document .write(j + "*" + i + "=" + i * j + " " ); } document .write("<br/>" ) } </script > </head > <body > </body > </html >
044 break和continue语句 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > break和continue</title > <script > outer: for (var i = 1 ; i < 5 ; i++) { console .log("外层循环" ); for (var j = 1 ; j < 5 ; j++) { console .log("内层循环" ); console .log(j); if (j == 2 ) { break outer; } } } for (var a = 1 ; a < 5 ; a++) { if (a == 3 ) continue ; console .log(a); } </script > </head > <body > </body > </html >
测试程序性能:在程序执行前开启一个计时器console.time()
,需要一个字符串作为参数,这个字符串将会作为计时器的标识。
console.timeEnd()
用来停止一个计时器,需要一个计时器的标识作为参数。
45 质数练习改进 寻找到Math.sqrt(i)
即可
46-47 对象简介、基本操作 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 对象简介</title > <script > </script > </head > <body > </body > </html >
048 属性名和属性值 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 属性名和属性值</title > <script > var obj = new Object (); obj.name = "张加林" ; obj["123" ] = 789 ; var str = "123" ; console .log(obj[str]); obj.test = true ; console .log(obj); obj.test = undefined ; console .log(obj); obj.test = null ; console .log(obj); </script > </head > <body > </body > </html >
049 基本数据类型和引用数据类型
1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 基本数据类型和引用数据类型</title > <script > </script > </head > <body > </body > </html >
050 对象字面量 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 对象字面量</title > <script > </script > </head > <body > </body > </html >
051 函数的简介 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 函数简介</title > <script > </script > </head > <body > </body > </html >
052 函数的参数 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 函数的参数</title > <script > var sum = function (a, b ) { console .log("和为" + (a + b)); } sum(1 , 3 ); </script > </head > <body > </body > </html >
053 函数返回值 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 函数的返回值</title > <script > function sum (a, b, c ) { return a + b + c; } console .log(sum(100 , 200 , 300 )); console .log(alert("你好" )); </script > </head > <body > </body > </html >
054 实参可以是任何值 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 实参可以是任何值</title > <script > function isEvenNum (num ) { </script > </head > <body > </body > </html >
055 返回值的类型 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 返回值的类型</title > <script > function fun ( ) { </script > </head > <body > </body > </html >
056 立即执行函数 1 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>立即执行函数</title> <script> /* 立即执行函数 函数定义完后,立即调用,这种函数叫做立即执行函数,往往只会执行一次 */ // 匿名函数自调用 (function () { alert("你好"); })(); </script></head><body></body></html>
057 方法 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 方法</title > <script > var obj = new Object (); </script > </head > <body > </body > </html >
057-2 枚举对象中的属性 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 枚举对象中的属性</title > <script > obj = { name : "张加林" , age : 20 , school : "郫县男子职业技术学院" }; for (var i in obj) { console .log(obj[i]); } </script > </head > <body > </body > </html >
058 全局作用域(scope) 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 全局作用域</title > <script > var a = 10 , b = 20 ; console .log(window .a, window .b, window .c); </script > </head > <body > </body > </html >
058(二) 变量声明提前 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 变量声明的提前</title > <script > a = 1234 ; </script > </head > <body > </body > </html >
059 函数作用域(易错易混) 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 函数作用域</title > <script > </script > </head > <body > </body > </html >
060 debug vscode F5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > debug</title > <script > var a = 123 ; function fun ( ) { alert(a); a = 456; } fun(); alert(a); var a = 123 ; function fun (a ) { alert(a); a = 456 ; } fun(); alert(a); </script > </head > <body > </body > </html >
061 this 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > this</title > <script > /* 解析器在调用函数时,每次都会向函数内部传递一个隐含的参数 这个隐含的参数是this ,this 指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式的不同,this 会指向不同的对象 1. 以函数的形式调用时,this 永远都是window 1. 以方法的形式调用时,this 就是调用方法的对象 */ function fun (a, b ) { console .log(this ); } var obj = { name: "张加林" , age: 20, sayName: fun } console .log(fun == obj.sayName); fun(); obj.sayName(); </script > </head > <body > </body > </html >
062 this补充 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > this补充</title > <script > var name = "全局" ; function fun ( ) { console .log(this .name); } var obj = { name: "张加林" , age: 20, sayName: fun } var obj2 = { name: "zl" , age: 21, sayName: fun } fun(); obj.sayName(); obj2.sayName(); </script > </head > <body > </body > </html >
063 使用工厂方法创建对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 使用工厂方法创建对象</title > <script > /* 使用工厂方法创建对象 */ function createPerson (myName, age, gender ) { return { name: myName, age: age, gender: gender, sayName: function ( ) { console .log(this .name); } } } var obj = createPerson("张加林" , 20 , "男" ); var obj2 = createPerson("zl" , 21 , "女" ); console .log(obj); console .log(obj2); obj.sayName(); obj2.sayName(); </script > </head > <body > </body > </html >
064 构造函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 构造函数</title > <script > /* 使用工厂方法创建的对象使用的构造函数都是Object 所以创建的对象都是Object 这个类型,这就导致我们无法区分多种不同类型对象 */ /* 创建构造函数,专门用来创建Person对象的构造函数就是一个普通的函数,创建方式和普通函数没有区别, 不同的是构造函数习惯上要首字母大写 构造函数和普通函数的区别就是调用方式不同 普通函数是直接调用,而构造函数需要使用new 关键字来调用 构造函数执行流程 1.立即创建一个新的对象 2. 将新建的对象设置为函数中的this ,在构造函数中可以使用this 来引用新创建的对象 3.逐行执行函数中的代码 4.将创建的对象作为返回值返回 我们将通过一个构造函数创建的对象,称为构造函数的实例 this 的情况: 1. 当以函数的形式调用时,this 是window 2. 当以方法的形式调用时,谁调用方法,this 就是谁 3. 当以构造函数调用时,this 就是新创建的那个对象 */ function Person (pName, age, gender ) { this .name = pName; this .age = age; this .gender = gender; this .sayName = function ( ) { console .log(this .name); } } function Dog (dName, age, gender ) { this .name = dName; this .age = age; this .gender = gender; this .sayName = function ( ) { console .log(this .name); } } var p = new Person("张加林" , 20 , "男" ); var d = new Dog("小白" , 3 , "公" ); console .log(p); console .log(d); /* 使用instanceof 可以检查一个对象是否是一个类的实例 语法: 对象 instanceof 构造函数 如果是,则返回true ,否则返回false 所有对象都是Object 的后代 所以任何对象和Object 做instanceof 检查都会返回true */ console .log(p instanceof Person); console .log(p instanceof Object ); console .log(d instanceof Person); console .log(d instanceof Object ); </script > </head > <body > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 构造函数修改</title > <script > function Person (name, age, gender ) { this .name = name; this .age = age; this .gender = gender; } Person.prototype.sayName = function ( ) { console .log(this .name); } var p = new Person("张加林" , 20 , "男" ); var p2 = new Person("zl" , 21 , "nv" ); p.sayName(); p2.sayName(); </script > </head > <body > </body > </html >
065 构造函数修改 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 构造函数修改</title > <script > /* 创建一个Person构造函数 在person构造函数中,为每一个对象都添加了一个sayName方法,目前我们的方法是在构造函数内部创建的,也就是构造函数每执行一次,就会创建一个新的sayName方法 也就是所有实例的sayName方法是唯一的,这样会导致构造函数每执行一次就会创建一个新的方法,这是完全没有必要的,完全可以使用所有的对象共享同一个方法 */ function Person (name, age, gender ) { this .name = name; this .age = age; this .gender = gender; } /* 将函数定义在全局作用域,污染了全局作用域的命名空间 而且定义在全局作用域中也很不安全 */ function sayName ( ) { console .log(this .name); } var p = new Person("张加林" , 20 , "男" ); var p2 = new Person("zl" , 21 , "nv" ); </script > </head > <body > </body > </html >
066 原型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 原型对象prototype</title > <script > /* 原型prototype 我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个对象就是我们所谓的prototype原型对象,不同的函数有自己不同的prototype 如果函数作为普通函数调用prototype没有任何作用 当函数通过构造函数的形式调用时,他所创建的对象都会有一个隐含的属性,指向该构造函数的原型对象,可以通过__proto__来访问该属性 原型对象就相当于一个公共的区域,所有同一类的实例都可以访问到这个原型对象 我们可以将对象中共有的内容,统一设置到原型对象中 当我们访问对象中的一个属性方法时,它会先在对象自身寻找,如果有则直接使用;如果没有,则会去原型对象中寻找,如果找到则直接使用 以后我们创建构造函数时,可以将这些对象共有的属性和方法统一添加到构造函数的原型对象中,这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些方法和属性了 */ function Person ( ) { } function MyClass ( ) { } console .log(Person.prototype); console .log(MyClass.prototype); console .log(MyClass.prototype == Person.prototype); var mc = new MyClass(); var mc2 = new MyClass(); console .log(mc.__proto__); console .log(mc.__proto__ == MyClass.prototype); console .log(mc.__proto__ == mc2.__proto__); MyClass.prototype.a = 123; console .log(mc.a); mc.a = "我是mc中的中的a" ; MyClass.prototype.sayHello = function ( ) { console .log("hello" ); } mc.sayHello(); </script > </head > <body > </body > </html >
067 原型对象
1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 原型对象</title > <script > function MyClass ( ) { } </script > </head > <body > </body > </html >
068 toString() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > toString()</title > <script > /* */ function Person (name, age, gender ) { this .name = name; this .age = age; this .gender = gender; } var per = new Person("张加林" , 20 , "男" ); console .log(per); console .log(per.toString()); console .log(per.__proto__.__proto__.hasOwnProperty("hasOwnProperty" )); Person.prototype.toString = function ( ) { return "Person[name=" + this .name + ",age = " + this .age + ",gender=" + this .gender + "]" } console .log(per.toString()); console .log(per); </script > </head > <body > </body > </html >
069 垃圾回收 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 垃圾回收</title > <script > /* 垃圾回收(GC) - 就像人的生活中会产生垃圾一样,程序运行过程中也会产生垃圾,这些垃圾积攒过多,会导致程序运行过慢 所以我们需要一个垃圾回收机制,来处理程序运行过程中产生的垃圾 - 当一个对象没有任何变量或属性对它进行引用,此时我们将永远无法操作该对象,此时这种对象就是一种垃圾,这种对象过多会占用大量的内存空间,导致程序运行变缓,必须进行清理 - JS中有自动的垃圾回收机制,会自动将这些;垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作,不同的浏览器回收机制不同 - 我们只需要将不再使用的对象设置为null 即可 */ var obj = new Object (); obj = null ; </script > </head > <body > </body > </html >
070 数组 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 数组</title > <script > </script > </head > <body > </body > </html >
071 数组字面量 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 数组字面量</title > <script > </script > </head > <body > </body > </html >
072 数组的四个方法
1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 数组的四个方法</title > <script > var arr = ["a" , "b" , "c" ]; var length = arr.push("d" , "e" , "f" ); console .log(arr, length); </script > </head > <body > </body > </html >
073 数组的遍历 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 数组的遍历</title > <script > </script > </head > <body > </body > </html >
074 练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 练习</title > <script > function Person (name, age ) { this .name = name; this .age = age; } var p = new Person("a" , 8 ); var p1 = new Person("b" , 18 ); var p2 = new Person("c" , 28 ); var p3 = new Person("d" , 38 ); var p4 = new Person("e" , 15 ); var per = [p, p1, p2, p3, p4]; function isAdult (arr ) { var res = []; for (var i = 0 ; i < arr.length; i++) { if (arr[i].age >= 18) res.push(arr[i]); } return res; } console .log(isAdult(per)); </script > </head > <body > </body > </html >
075 forEach 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > forEach</title > <script > var arr = ["a" , "b" , "c" , "d" , "e" , "f" ]; arr.forEach(function (value, index, arr ) { console .log(value, index, arr); }) </script > </head > <body > </body > </html >
076 splice和slice 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > splice和slice</title > <script > var arr = ["a" , "b" , "c" , "d" , "e" , "f" ]; console .log(arr.slice(0 , 2 )); console .log(arr.slice(0 , -1 )); </script > </head > <body > </body > </html >
077 数组去重练习 1 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 练习</title > <script > var arr = [1 , 2 , 3 , 4 , 5 , 6 , 3 , 7 , 5 , 6 , 4 , 0 , 4 , 5 , 6 , 7 , 3 , 3 , 5 ]; function deleteRepeat (a ) { for (var i = 0 ; i < arr.length; i++) { for (var j = i + 1 ; j + 1 < arr.length; j++) { if (arr[i] == arr[j]) { arr.splice(j, 1 ); j--; } } } } deleteRepeat(arr); console .log(arr); </script > </head > <body > </body > </html >
078 数组的剩余方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 数组剩余方法</title > <script > /* concat()可以连接连接两个或多个数组,并将新的数组返回 - 该方法不会对原数组产生影响 */ var arr1 = [1 , 2 , 3 , 4 , 5 ]; var arr2 = [3 , 4 , 5 , 6 , 7 ]; var arr3 = [31 , 43 , 54 , 65 , 72 ]; var res = arr1.concat(arr2, arr3, "张加林" , "噜噜噜" ); console .log(res); /* join()将数组所有元素放入一个字符串,元素通过指定的分隔符进行分割 - 该方法可以将数组转换为字符串 - 该方法不会影响原数组,而是将转换后的字符串作为结果返回 - 在join()方法中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符;如果不使用连接符,则默认使用,作为连接符,不想有连接符可以传递空串"" 作为参数 */ var res = arr1.join("——" ); console .log(res); console .log(typeof res, typeof arr1); /* reverse()颠倒数组中元素的顺序 - 该方法用于反转数组 - 该方法会直接修改原数组 */ arr1.reverse(); console .log(arr1); /* sort():可以用来对原数组进行排序 - 会影响原数组,默认按照unicode编码进行排序 - */ arr = ["d" , "z" , "c" , "x" , "e" ]; arr.sort(); console .log(arr); /* 即使对于纯数字的数字,使用sort(),也会按照Unicode编码进行排序。 所以对数字进行排序时,可能会得到错误的结果; 我们可以自己指定排序规则 我们可以在sort()中添加一个回调函数,来指定排序规则 回调函数中我们需要定义两个形参,浏览器将会分别使用数组中的元素作为实参去调用回调函数 - 浏览器会根据回调函数的返回值来决定元素的位置顺序位置, 如果返回一个大于0的值,则元素将会交换位置 如果返回一个小于0的值,则位置不变 如果返回一个等于0的值,则认为两个元素相等,也不交换位置 - 如果升序排,返回a-b 如果降序排列,返回b-a */ arr = [4, 5]; arr.sort(function (a, b ) { console .log(a); console .log(b); }); arr = [3, 5, 6, 11, 4, 2]; arr.sort(); arr = [3, 5, 6, 11, 4, 2]; arr.sort(function ( ) { return -1 ; }); arr = [3, 5, 6, 11, 4, 2]; arr.sort(function (a, b ) { return a - b; }); console .log(arr); </script > </head > <body > </body > </html >
079 call()和apply() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > call和apply</title > <script > /* call()和apply() - 这两个方法都是函数对象的方法,需要通过函数对象来调用 - 当对函数调用call()和apply(),都会调用函数 - 在调用call()和apply()可以将对象指定一个对象为第一参数 此时这个对象将会成为函数执行时的this - call()方法可以将实参在对象之后依次传递 - apply()方法需要将实参封装到一个数组中统一传递 - this 的情况: 1. 以函数的形式调用时,this 永远都是window 2. 以方法的形式调用,this 是调用方法的对象 3. 以构造函数的方式调用,this 是新创建对象 4. 使用call和apply调用时,this 是指定的对象 */ function fun ( ) { console .log(this ); } fun(); fun.call(); fun.apply(); var obj = {}; fun.call(obj); fun.apply(obj); obj = { name: "张加林" , sayName: function ( ) { console .log(this .name); } }; obj2 = { name: "zl" }; obj.sayName(); obj.sayName.apply(obj2); function fun2 (a, b ) { console .log(a); console .log(b); } fun2.call(obj, 2 , 3 ); fun2.apply(obj, [2 , 3 ]); </script > </head > <body > </body > </html >
080 arguments 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > argument</title > <script > /* 在调用函数时,浏览器每次都会传递两个隐含参数 1. 函数的上下文,this 2. 封装实参的arguments - arguments 是一个"类" 数组对象,它可以通过索引来操作数据,也可以获取长度 - 在调用函数时,我们所传递的实参都会封装到arguments 中保存 - arguments .length获取实参的长度,表示传递实参的数目 - 即使不定义形参,也可以通过arguments 来使用实参,只是比较麻烦 arguments [0 ]为第一个实参,依次类推,与定义形参与否无关 - arguments 中有一个属性叫callee, - 这个属性对应一个函数对象,就是当前正在执行的函数的对象 */ function fun ( ) { console .log(arguments instanceof Array ); console .log(Array .isArray(arguments )); console .log(arguments .length); console .log(arguments [0 ]); console .log(arguments .callee == fun); } fun(2 , 3 , 4 , 4 ); </script > </head > <body > </body > </html >
081 Date对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Date对象</title > <script > /* Date 对象 - 在JS中使用Date 对象来表示一个时间 - 如果直接使用构造函数创建一个Date 对象,则会封装为当前代码执行的时间 - 创建一个指定的时间对象,需要在构造函数中传递一个表示时间的字符串作为参数 mm/dd/yyyy hh:mm:ss */ var d = new Date (); console .log(d); var d2 = new Date ("10/11/2021 23:11:11" ); console .log(d2); /* getDate() - 获取当前日期对象是几日 */ var date = d2.getDate(); console .log("date = " + date); /* getDay() - 获取当前日期对象是周几(返回周日0 周一1 周二2 周三3 周四4 周五5 周六6) */ var day = d2.getDay(); console .log("day = " + day); /* getMonth() - 获取当前时间对象的月份 - 返回一个0-11的值 0表示月份 1表示2月 …… 11表示12月份 */ var month = d2.getMonth(); console .log(month); /* getFullYear() - 获取当前日期对象的年份 - getYear()废弃 */ var year = d2.getFullYear(); console .log(year); /* getHours() getMinutes() getSeconds() getMillseconds() getTime() - 获取当前时间对象的时间戳 - 时间戳timestamp:格林威治标准时间的1970年1月1日0时0分0秒,到当前日期时间所花费的毫秒数 - 1s = 1000ms - 计算机顶层在保存时间时,使用的都是时间戳 */ var d3 = new Date ("1/1/1970 0:0:0" ); console .log(d3.getTime()); var startTtime = Date .now(); /* 测试代码块 */ var endTime = Date .now(); console .log(startTtime - endTime); </script > </head > <body > </body > </html >
082 Math对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Math对象</title > <script > /* Math - Math 和其他的对象不同,不是一个构造函数 它属于一个工具类,不用创建对象,里面封装了数学相关的属性和方法 */ console .log(Math ); /* Math 对象属性 E 返回算数常数e,即自然对数的底数(约等于2.718) LN2 返回2的自然对数(约等于0.693) LN10 返回2的自然对数(约等于2.302) LOG2E 返回以2为底的e的对数(约等于1.414) LOG10E 返回以10为底的e的对数(约等于0.434) PI 返回圆周率(约等于3.14159) SQRT1_2 返回2的平方根的倒数(约等于0.707) SORT2 返回2的平方根(约等于1.414) */ /* Math .abs()计算一个数的绝对值 Math .ceil() 对一个数进行向上取整,小数位有值就向上进1 Math .floor() 对一个数进行向下取整,小数位部分会被舍弃 相比parseInt ()来说,效率高得多,但是处理不了"123px" 这种类似的字符串 Math .round() 对数字进行四舍五入取整 Math .random() - 可以用来生成一个0-1之间的随机数,(0,1)开区间 - */ console .log(Math .abs(-1 )); console .log(Math .ceil(1.0001 )); console .log(Math .ceil(-1.0001 )); console .log(Math .floor(1.99999 )); console .log(Math .floor(-1.99999 )); console .log(Math .floor("1.99" )); console .log(Math .floor("1.99px" )); console .log(Math .round(Math .random() * 10 )); console .log(Math .round(Math .random() * 9 ) + 1 ); console .log(Math .ceil(Math .random() * 10 )); /* 生成一个x到y之间的随机数 Math .round(Math .random() * (y - x)) + x Math .floor(Math .random() * (y - x + 1 )) + x */ console .log(Math .ceil(Math .random() * 10 + 90 )); /* 返回多个值中的最值, max(x,y) min(x,y) */ console .log(Math .max(1 , 3 , 64 , 545 , 545 , 45545 , 1 )); /* Math .pow(x,y) 返回x的y次幂 Math .sqrt(x) 返回x的平方根 */ console .log(Math .pow(2 , 3 )); </script > </head > <body > </body > </html >
083 包装类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 包装类</title > <script > /* 基本数据类型 String Number Boolean Undefined Null 引用数据类型 Object 在Js中为我们提供了包装类,通过包装类,可以将基本数据类型转换为对象 String - 可以将基本数据类型字符串转换为String 对象 Boolean - 可以将基本数据类型的布尔值转换为布尔值 Number - 可以将基本数据类型的数字转换为Number 对象 注意:我们在实际开发过程中,基本不会使用基本数据类型的对象 如果使用基本数据类型的对象,在做一些比较的时候可能会带来一些不可预料的后果 */ var num = new Number (3 ); console .log(num); console .log(typeof num); var str = new String ("你好" ); console .log(str); console .log(typeof str); var bool = new Boolean (true ); console .log(bool); console .log(typeof bool); num.hello = "abcdefghijklmnopqrstuvwxyz" ; console .log(num); var num2 = new Number (3 ); console .log(num == num2); var bool2 = true ; console .log(bool == bool2); console .log(bool === bool2); var b = new Boolean (false ); if (b) { console .log("执行" ); } /* 方法和属性只能添加给对象,不能添加给基本数据类型 当我们对一些基本数据类型调用属性和方法,浏览器会临时使用包装类将其转换为对象,然后再调用对象的属性和方法 调用完成后,再将其转换为基本数据类型 由此说明:可以通过基本数据类型直接调用对象的方法 */ var b = 1234 ; b = b.toString(); console .log(b); b.hello = "你好" ; /* 此处由基本数据类型转换为对象,添加hello给对象1 ,但是添加完毕后,对象1 就被销毁了;读取b的hello属性,先将基本数据类型转换为对象2 ,然后寻找hello属性,但是对象2 中没有hello属性,所以返回undefined */ console .log(b.hello); </script > </head > <body > </body > </html >
084 字符串的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 字符串方法</title > <script > var str = "Hello" ; /* 在底层字符串是以数组的形式保存的 ["H" ;"e" ,"l" ,"l" ,"o" ] */ console .log(str.length); console .log(str[0 ]); /* length属性 - 可以用来获取字符串的长度 charAt() - 可以返回字符串中指定位置的字符 - 根据索引获取指定的字符 - 和[]获取类似 charCodeAt() - 返回指定位置的Unicode编码 fromCharCode() - 可以根据字符编码获取字符 concat() - 用于连接两个或多个字符串 - 不会影响原字符串 - 作用和+号相同 indexOf() - 该方法可以检索一个字符串中是否含有指定的内容 - 如果含有该字符串,返回其第一次出现的位置 如果没有找到指定的内容,返回-1 - 可以使用第二参数指定开始检索位置 lastIndexOf() - 该方法的用法和IndexOf()一样 不同的是,indexOf是从前往后检索 lastIndexOf是从后往前检索 - 也可以指定开始检索位置 */ var zero = str.charAt(0 ); console .log(zero); zero = str.charCodeAt(0); console .log(zero); var result = String .fromCharCode(12036 ); console .log(result); result = str.concat("张加林" , "zl" ); console .log(result); result = str.indexOf("l" ); console .log(result); result = str.indexOf("l" , 3 ); console .log(result); result = str.lastIndexOf("l" ); console .log(result); /* match() replace() search() 三者用于正则表达式部分 slice() - 可以用于从字符串中截取指定的内容 - 不会影响原字符串,而是将截取到的内容返回 - 参数: 第一个参数,开始位置的索引(包括开始位置) 第二个参数,结束位置的索引(不包括结束位置) - 如果省略,则会截取到后面所有的字符串 - 也可以传递一个负数作为参数,负数的话会从后边计算 substring() - 可以用来截取一个字符串,与slice()类似 - 参数: 第一个参数,开始位置的索引(包括开始位置) 第二个参数,结束位置的索引(不包括结束位置) - 不同的是,substring()不能接收负值作为参数,如果传递负值,则默认使用0 - 而且会自动调整参数的位置,如果第二个参数小于第一个,则自动交换 substr() - 用来截取字符串 - 参数: 1.截取开始位置的索引 2.截取的长度 small()/big() 用于把字符串显示为大号 / 小号字体 toLocaleLowerCase()/toLocaleUpperCase() 不会改变原字符串,针对地区 toLowerCase()/toUpperCase() 不会改变原字符串 toSource() 返回对象的源代码 toString() split() - 可以将一个字符串拆分为一个数组 - 参数: - 需要一个字符串作为参数,将会根据该字符串拆分数组拆分符号会被删除 - 传递一个空串作为参数,则会将每个字符都拆分为数组中的一个元素 valueOf() 可返回 String 对象的原始值,通常由 JavaScript 在后台自动进行调用,而不是显式地处于代码中 */ result = str.slice(0, 2); console .log(result); result = str.slice(2, -1); console .log(result); result = str.substring(1, 2); console .log(result); result = str.substring(1, 0); console .log(result); result = str.substr(3, 2); console .log(result, str); var str2 = "aadf,sdf,fdsafds,fsdsgffg,gdsf" ; result = str2.split("," ); console .log(result); console .log(Array .isArray(result)); console .log(str.toLocaleUpperCase()); </script > </head > <body > </body > </html >
085 正则表达式简介 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!DOCTYPE html > <html lang ="en" > <head > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 正则表达式简介</title > <script > /* 正则表达式用于定义一些字符串规则: 计算机可以根据正则表达式,来检查一个字符串是否符合规则, 获取将字符串中符合规则的内容提取出来 语法: var reg = new RegExp ("正则表达式" ,"匹配模式" ); 使用typeof 检查正则表达式,将会返回object 正则表达式方法: - test() - 使用该方法可以检查一个字符串是否符合正则表达式规则 符合返回true ,否则返回false ;严格区分大小写 构造函数中可以传递一个匹配模式作为第二参数 可以是 - i 忽略大小写 - g 全局匹配模式 */ var str = "bab" ; var reg = new RegExp ("a" ); console .log(reg); console .log(typeof reg); console .log(reg.test(str)); </script > </head > <body > </body > </html >
086 正则语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 正则语法</title > <script > /* 使用字面量创建正则表达式 语法:var 变量 = /正则表达式/ 匹配模式 使用字面量创建正则表达式更加简单,使用构造函数创建更加灵活(可以传入变量) */ var reg = /a/i ; console .log(typeof reg); console .log(reg.test("abc" )); /* 使用|来表示或者的意思 */ reg = /a | b | c/i ; console .log(reg.test("miketaylor" )); /* []里的内容也是或的关系 [a-z] [A-Z] [0-9] */ reg = /[a-z]/i ; console .log(reg.test("3105085561" )); /* [^ ]除了 */ reg = /[^ab]/i ; console .log(reg.test("abababABBA" )); </script > </head > <body > </body > </html >
087 字符串和正则相关的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 字符串和正则相关的方法</title > <script > /* search() - 搜索字符串是否含有指定字符串 - 如果搜索到指定内容返回第一次出现的索引;没有搜索到返回-1 - 可以接收一个正则表达式作为参数,然后根据正则表达式去检索字符串 - search()只会查找第一个,即使设置全局匹配也没用 match() - 可以根据正则表达式,从一个字符串中,将符合条件的内容提取出来 - 默认情况下我们的match只会找到第一个符合要求的内容,找到以后就停止检索;为此我没可以设正则表达式为全局匹配模式,这样就会匹配到所有内容 可以为一个正则表达式设置多个匹配模式,且顺序无所谓 - match()会将匹配到的内容封装到一个数组中,即使只返回一个结果 - 默认情况下,我们的match()只会找到第一个符合条件的内容,找到以后就会停止检索,所以我们可以设置正则表达式为全局匹配模式,这样就可以匹配到所有的内容 - 可以为一个正则表达式设置多个匹配模式,且顺序无所谓 replace() - 可以将字符串中指定内容替换为新的内容 - 参数: 1.被替换的内容,可以接收一个正则表达式作为参数 2.新的内容 - 默认只会替换第一个,可以设置全局匹配模式 split() - 根据一个规则将一个字符串拆分为一个数组 - 方法中可以传递一个正则表达式作为参数去拆分字符串 - 该方法即使不指定全局匹配模式,也会全都拆分 */ var str = 'das1fdsa4d2gsfds1af2gdd2sdgfdsf' ; var res = str.split(/[a-z]+/ ); console .log(res); str = "abc adc abf adc alc apl afi aef" ; console .log(str.search(/a[de]c/ )); console .log(str.match(/a[de]c/g )); res = str.replace(/a[de]c/g , "@@@@@@" ); console .log(res); </script > </head > <body > </body > </html >
088 正则表达式语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 正则表达式语法</title > <script > /* 量词: - 通过量词可以设置一个内容出现的次数 {a,b}:出现a次到b次之间 {c}:刚好出现c次 {m,}:m次以上 n+:匹配任何包含至少一个n的字符串 n*:匹配任何包含0个或多个的字符串 n?:匹配任何包含零个或一个的字符串 n$:匹配任何结尾为n的字符串 ^n:匹配任何开头为n的字符串 如果在正则表达式中同时使用^$,则要求字符串必须完全符合正则表达式 ?=n:匹配任何其后紧接字符串n的字符串 ?!n:匹配任何其后没有紧接指定字符串n的字符串 - 量词只对前面的一个内容起作用 原子组 */ </script > </head > <body > </body > </html >
089 正则表达式语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 正则表达式(二)</title > <script > /* .:表示除换行符外的其他任何字符 可以使用转义字符\ \. 表示. \\ 表示\ 注意:使用构造函数时,由于它的参数是一个字符串,而\则需要使用\\来代替。例如,使用构造函数检查字符串是否含有.:new RegExp ("\\." ); \w:英文字母数字下划线 \W:英文字母数字下划线 \d:任意数字 \D:除了数字 \s:任意一个空白字符匹配,如空格,制表符\t,换行符\n \S:除了空白符外任意一个字符匹配 \b:单词边界 \B:除了单词边界 */ var reg = /\./ ; console .log(reg); reg = /\\/ ; console .log(reg.test("b.\\" )); reg = new RegExp ("\." ); console .log(reg); reg = new RegExp ("\\." ); console .log(reg); reg = /\bchild\b/ ; console .log(reg.test("hello children" )); var str = " mike taylor " ; str = str.replace(/^\s+/g , "" ); str = str.replace(/\s+$/g , "" ); console .log(str); </script > </head > <body > </body > </html >
090 邮件的正则 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 邮件正则</title > <script > /* 规则: - 任意字母数字下划线 . 任意字母数字下划线 @ 任意字母数字. (com|edu|org|net……).cn */ var reg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/ ; var str = "3105085561@qq.com" ; console .log(reg.test(str)); </script > </head > <body > </body > </html >
091 DOM简介 DOM树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > DOM简介</title > </head > <body > <button id ="btn" > 我是一个按钮</button > <script > /* DOM:全称Document Object Model文档对象模型 JS中通过DOM来对HTML文档进行操作。只要理解了DOM就可以随心所欲的操作WEB界面了。 文档:文档表示的是整个的HTML网页文档 对象:对象表示将网页中的每一个部分都转换为了一个对象(包括注释) 模型:使用模型来表示对象之间的关系,这样方便我们获取对象 */ /* 浏览器已经为我们提供了文档节点对象,这个对象是window 的属性,可以直接在页面中使用,文档节点代表的是整个网页。 */ var btn = document .getElementById("btn" ); console .log(btn); btn.innerHTML = "你好" ; </script > </body > </html >
092 事件简介
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 事件的简介</title > <body > <button id ="miketaylor" onclick ="" > 这是一个button</button > <script > /* 事件,就是用户和浏览器之间的交互行为 比如:点击按钮、鼠标移动、关闭窗口…… */ var btn = document .getElementById("miketaylor" ); /* 可以为按钮对应的事件绑定处理函数的形式来响应事件 这样当事件被触发时,其对应的函数将会被调用 */ console .log(btn); btn.onclick = function ( ) { console .log("按钮事件触发" ); } </script > </body > </html >
093 文档的加载
因为浏览器在加载一个页面时,是按照自上而下的顺序加载的,读取到一行就运行一行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 文档的加载</title > <script > /* 浏览器在加载一个页面时,是按照自上而下的顺序加载的,读取到一行就运行一行,如果将script标签写到页面的上边,在代码执行时,页面还没有加载,页面没有加载DOM对象也没有加载会导致无法获取DOM对象 */ /* onload事件会在整个页面加载完成后才触发 为window 绑定一个onload事件 该事件对应的响应函数将会在页面加载完成后执行,这样可以确保我们的代码执行时所有的DOM对象已经加载完毕 */ window .onload = function ( ) { var btn = document .getElementById("miketaylor" ); console .log(btn); btn.onclick = function ( ) { console .log("按钮事件触发" ); } } </script > </head > <body > <button id ="miketaylor" onclick ="" > 这是一个button</button > </body > </html >
094 DOM查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > DOM查询</title > <link rel ="stylesheet" type ="text/css" href ="css/css.css" /> <script type ="text/javascript" > window .onload = function ( ) { var btn01 = document .getElementById("btn01" ); btn01.onclick = function ( ) { var bj = document .getElementById("bj" ); alert(bj.innerHTML); }; var btn02 = document .getElementById("btn02" ); btn02.onclick = function ( ) { var lis = document .getElementsByTagName("li" ); for (var i = 0 ; i < lis.length; i++) { alert(lis[i].innerHTML); } }; var btn03 = document .getElementById("btn03" ); btn03.onclick = function ( ) { var inputs = document .getElementsByName("gender" ); for (var i = 0 ; i < inputs.length; i++) { /* * innerHTML用于获取元素内部的HTML代码的 * 对于自结束标签,这个属性没有意义 */ /* * 如果需要读取元素节点属性, * 直接使用 元素.属性名 * 例子:元素.id 元素.name 元素.value * 注意:class 属性不能采用这种方式,读取class 属性时需要使用 元素.className !!! */ alert(inputs[i].className); } }; }; </script > </head > <body > <div id ="total" > <div class ="inner" > <p > 你喜欢哪个城市? </p > <ul id ="city" > <li id ="bj" > 北京</li > <li > 上海</li > <li > 东京</li > <li > 首尔</li > </ul > <br > <br > <p > 你喜欢哪款单机游戏? </p > <ul id ="game" > <li id ="rl" > 红警</li > <li > 实况</li > <li > 极品飞车</li > <li > 魔兽</li > </ul > <br /> <br /> <p > 你手机的操作系统是? </p > <ul id ="phone" > <li > IOS</li > <li id ="android" > Android</li > <li > Windows Phone</li > </ul > </div > <div class ="inner" > gender: <input class ="hello" type ="radio" name ="gender" value ="male" /> Male <input class ="hello" type ="radio" name ="gender" value ="female" /> Female <br > <br > name: <input type ="text" name ="name" id ="username" value ="abcde" /> </div > </div > <div id ="btnList" > <div > <button id ="btn01" > 查找#bj节点</button > </div > <div > <button id ="btn02" > 查找所有li节点</button > </div > <div > <button id ="btn03" > 查找name=gender的所有节点</button > </div > <div > <button id ="btn04" > 查找#city下所有li节点</button > </div > <div > <button id ="btn05" > 返回#city的所有子节点</button > </div > <div > <button id ="btn06" > 返回#phone的第一个子节点</button > </div > <div > <button id ="btn07" > 返回#bj的父节点</button > </div > <div > <button id ="btn08" > 返回#android的前一个兄弟节点</button > </div > <div > <button id ="btn09" > 返回#username的value属性值</button > </div > <div > <button id ="btn10" > 设置#username的value属性值</button > </div > <div > <button id ="btn11" > 返回#bj的文本值</button > </div > </div > </body > </html >
095 图片切换练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=\ , initial-scale=1.0" > <title > 图片切换练习</title > <style > * { margin : 0 ; padding : 0 ; } .container { width : 500px ; margin : 50px auto; text-align : center; background-color : rgb (122 , 161 , 240 ); padding : 10px ; } img { width : 100% ; } </style > <script > window .onload = function ( ) { /* 点击按钮切换图片 */ var imgArr = ["./img/1.png" , "./img/2.png" , "./img/3.png" , "./img/4.png" ], index = 0 ; var prev = document .getElementById("prev" ); var next = document .getElementById("next" ); /* 要切换图片就是要修改img标签的src属性 要修改一个元素的属性:元素.属性 = 属性值 */ var img = document .getElementsByTagName("img" )[0 ]; prev.onclick = function ( ) { img.src = imgArr[(index - 1 < 0) ? (index = imgArr.length - 1) : (--index)]; } next.onclick = function ( ) { img.src = imgArr[(index + 1 == imgArr.length) ? (index = 0) : (++index)]; } } </script > </head > <body > <div class ="container" > <img src ="./img/1.png" alt ="1" > <button id ="prev" > 上一张</button > <button id ="next" > 下一张</button > </div > </body > </html >
096-097 DOM查询
getElementById
innerHTML
innerText
getElementsByTagName:可以根据标签名来获取一组元素节点对象
getElementsByName:根据name
属性获取一组元素节点对象
childNodes:属性会获取包括文本节点在内的所有节点
children:属性可以获取当前元素的所有子元素
firstChild:firstChild可以获取到当前元素的第一个子节点(包括空白文本节点)
firstElementChild:获取当前元素的第一个子元素
parentNode:父节点
previousSibling
nextSibling
nextElementSibling:previousElementSibling获取前一个兄弟元素,IE8及以下不支持
nodeValue:获取文本节点的文本内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > DOM查询</title > <link rel ="stylesheet" type ="text/css" href ="css/css.css" /> <script type ="text/javascript" > /* * 定义一个函数,专门用来为指定元素绑定单击响应函数 * 参数: * idStr 要绑定单击响应函数的对象的id属性值 * fun 事件的回调函数,当单击元素时,该函数将会被触发 */ function myClick (idStr, fun ) { var btn = document .getElementById(idStr); btn.onclick = fun; } window .onload = function ( ) { var btn01 = document .getElementById("btn01" ); btn01.onclick = function ( ) { var bj = document .getElementById("bj" ); alert(bj.innerHTML); }; var btn02 = document .getElementById("btn02" ); btn02.onclick = function ( ) { var lis = document .getElementsByTagName("li" ); for (var i = 0 ; i < lis.length; i++) { alert(lis[i].innerHTML); } }; var btn03 = document .getElementById("btn03" ); btn03.onclick = function ( ) { var inputs = document .getElementsByName("gender" ); for (var i = 0 ; i < inputs.length; i++) { /* * innerHTML用于获取元素内部的HTML代码的 * 对于自结束标签,这个属性没有意义 */ /* * 如果需要读取元素节点属性, * 直接使用 元素.属性名 * 例子:元素.id 元素.name 元素.value * 注意:class 属性不能采用这种方式, * 读取class 属性时需要使用 元素.className */ alert(inputs[i].className); } }; var btn04 = document .getElementById("btn04" ); btn04.onclick = function ( ) { var city = document .getElementById("city" ); var lis = city.getElementsByTagName("li" ); for (var i = 0 ; i < lis.length; i++) { alert(lis[i].innerHTML); } }; var btn05 = document .getElementById("btn05" ); btn05.onclick = function ( ) { var city = document .getElementById("city" ); /* * childNodes属性会获取包括文本节点在内的所有节点 * 根据DOM标签标签间空白也会当成文本节点 * 注意:在IE8及以下的浏览器中,不会将空白文本当成子节点, * 所以该属性在IE8中会返回4个子元素而其他浏览器是9个 */ var cns = city.childNodes; /*for(var i=0 ; i<cns.length ; i++){ alert(cns[i]); }*/ /* * children属性可以获取当前元素的所有子元素 */ var cns2 = city.children; alert(cns2.length); }; var btn06 = document .getElementById("btn06" ); btn06.onclick = function ( ) { var phone = document .getElementById("phone" ); var fir = phone.firstChild; /* * firstElementChild不支持IE8及以下的浏览器, * 如果需要兼容他们尽量不要使用 */ alert(fir); }; myClick("btn07" , function ( ) { var bj = document .getElementById("bj" ); var pn = bj.parentNode; alert(pn.innerHTML); /* * innerText * - 该属性可以获取到元素内部的文本内容 * - 它和innerHTML类似,不同的是它会自动将html去除 */ }); myClick("btn08" , function ( ) { var and = document .getElementById("android" ); var ps = and.previousSibling; alert(ps); }); myClick("btn09" , function ( ) { var um = document .getElementById("username" ); alert(um.value); }); myClick("btn10" , function ( ) { var um = document .getElementById("username" ); um.value = "今天天气真不错~~~" ; }); myClick("btn11" , function ( ) { var bj = document .getElementById("bj" ); /*var fc = bj.firstChild; alert(fc.nodeValue);*/ alert(bj.firstChild.nodeValue); }); }; </script > </head > <body > <div id ="total" > <div class ="inner" > <p > 你喜欢哪个城市? </p > <ul id ="city" > <li id ="bj" > 北京</li > <li > 上海</li > <li > 东京</li > <li > 首尔</li > </ul > <br > <br > <p > 你喜欢哪款单机游戏? </p > <ul id ="game" > <li id ="rl" > 红警</li > <li > 实况</li > <li > 极品飞车</li > <li > 魔兽</li > </ul > <br /> <br /> <p > 你手机的操作系统是? </p > <ul id ="phone" > <li > IOS</li > <li id ="android" > Android</li > <li > Windows Phone</li > </ul > </div > <div class ="inner" > gender: <input class ="hello" type ="radio" name ="gender" value ="male" /> Male <input class ="hello" type ="radio" name ="gender" value ="female" /> Female <br > <br > name: <input type ="text" name ="name" id ="username" value ="abcde" /> </div > </div > <div id ="btnList" > <div > <button id ="btn01" > 查找#bj节点</button > </div > <div > <button id ="btn02" > 查找所有li节点</button > </div > <div > <button id ="btn03" > 查找name=gender的所有节点</button > </div > <div > <button id ="btn04" > 查找#city下所有li节点</button > </div > <div > <button id ="btn05" > 返回#city的所有子节点</button > </div > <div > <button id ="btn06" > 返回#phone的第一个子节点</button > </div > <div > <button id ="btn07" > 返回#bj的父节点</button > </div > <div > <button id ="btn08" > 返回#android的前一个兄弟节点</button > </div > <div > <button id ="btn09" > 返回#username的value属性值</button > </div > <div > <button id ="btn10" > 设置#username的value属性值</button > </div > <div > <button id ="btn11" > 返回#bj的文本值</button > </div > </div > </body > </html >
098 - 100 全选练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > 全选练习</title > <script type ="text/javascript" > window .onload = function ( ) { /* 全选按钮: - 点击按钮后,四个多选框全都被选中 */ var checkedAllBox = document .getElementById("checkedAllBox" ); var checkAllBtn = document .getElementById("checkedAllBtn" ); checkedAllBtn.onclick = function ( ) { var items = document .getElementsByName("items" ); for (var i = 0 ; i < items.length; i++) { items[i].checked = true ; } checkedAllBox.checked = true ; } var checkedNoBtn = document .getElementById("checkedNoBtn" ); checkedNoBtn.onclick = function ( ) { var items = document .getElementsByName("items" ); for (var i = 0 ; i < items.length; i++) { items[i].checked = false ; } checkedAllBox.checked = false ; } var checkedRevBtn = document .getElementById("checkedRevBtn" ); checkedRevBtn.onclick = function ( ) { var items = document .getElementsByName("items" ); for (var i = 0 ; i < items.length; i++) { items[i].checked = items[i].checked ? false : true ; } } var sendBtn = document .getElementById("sendBtn" ); sendBtn.onclick = function ( ) { var items = document .getElementsByName("items" ); for (var i = 0 ; i < items.length; i++) { if (items[i]) { alert(items[i].value); } } } /* 全选/全不选 - 当它选中时,其余的也选中;当它取消时,其余的也取消 在事件的响应函数中,响应函数是给谁绑定的,this 就是谁 */ checkedAllBox.onclick = function ( ) { var items = document .getElementsByName("items" ); for (var i = 0 ; i < items.length; i++) { items[i].checked = checkedAllBox.checked; } console .log(this === checkedAllBox); }; var items = document .getElementsByName("items" ); for (var i = 0 ; i < items.length; i++) { items[i].onclick = function ( ) { checkedAllBox.checked = true ; for (var j = 0 ; j < items.length; j++) { if (!items[j].checked) { checkedAllBox.checked = false ; break ; } } } } } </script > </head > <body > <form method ="post" action ="" > 你爱好的运动是?<input type ="checkbox" id ="checkedAllBox" /> 全选/全不选 <br /> <input type ="checkbox" name ="items" value ="足球" /> 足球 <input type ="checkbox" name ="items" value ="篮球" /> 篮球 <input type ="checkbox" name ="items" value ="羽毛球" /> 羽毛球 <input type ="checkbox" name ="items" value ="乒乓球" /> 乒乓球 <br /> <input type ="button" id ="checkedAllBtn" value ="全 选" /> <input type ="button" id ="checkedNoBtn" value ="全不选" /> <input type ="button" id ="checkedRevBtn" value ="反 选" /> <input type ="button" id ="sendBtn" value ="提 交" /> </form > </body > </html >
101 DOM查询的剩余方法 document.all
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > DOM查询剩余方法</title > <script > /* */ window .onload = function ( ) { var body1 = document .getElementsByTagName("body" )[0 ]; console .log(body1); /* 在document 中有一个属性body,它保存的是body的引用 */ var body2 = document .body; console .log(body1 === body2); /* body.documentElement保存的是html的根标签 */ var html = document .documentElement; console .log(html); /* document .all代表页面中的所有元素,但是目前已废弃 */ var all1 = document .all; console .log(all1, all1.length); var all2 = document .getElementsByTagName("*" ); /* 根据元素的class 属性值查询一组元素节点对象 getElementsByClassName()可以根据class 属性值获取一组元素节点对象,但是该方法不支持IE8 及其以下版本浏览器 */ var box1 = document .getElementsByClassName("mk" ); console .log(box1.length); /* querySelector() - 需要一个选择器的字符串作为参数,可以根据一个CSS选择器!!!来查询一个元素节点对象 - 虽然IE8中没有getElementsByClassName()但是可以使用querySelector()代替 - 注意:使用该方法总会返回唯一的一个元素,如果有多个元素满足条件,则只会返回第一个满足的对象 */ var s_div = document .querySelector(".ycy" ); console .log(s_div); /* document .querySelectorAll()该方法和querySelector()用法相似,不同的是它会将符合条件的元素封装为一个数组,即使返回的数组只有一个元素 */ var mk_div = document .querySelectorAll(".mk" ); console .log(mk_div.length); } </script > </head > <body > <div class ="mk ycy" > <div > </div > </div > <div class ="mk" > </div > <div class ="mk" > </div > </body > </html >
102 DOM增删改 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > DOM增删改</title > <link rel ="stylesheet" type ="text/css" href ="css/css.css" /> <script type ="text/javascript" > window .onload = function ( ) { myClick("btn01" , function ( ) { //创建广州节点 <li > 广州</li > /* * document .createElement() * 可以用于创建一个元素节点对象, * 它需要一个标签名作为参数,将会根据该标签名创建元素节点对象, * 并将创建好的对象作为返回值返回 */ var li = document .createElement("li" ); /* * document .createTextNode() * 可以用来创建一个文本节点对象 * 需要一个文本内容作为参数,将会根据该内容创建文本节点,并将新的节点返回 */ var gzText = document .createTextNode("广州" ); /* * appendChild() * - 向一个父节点中添加一个新的子节点 * - 用法:父节点.appendChild(子节点); */ li.appendChild(gzText); var city = document .getElementById("city" ); city.appendChild(li); }); myClick("btn02" , function ( ) { var li = document .createElement("li" ); var gzText = document .createTextNode("广州" ); li.appendChild(gzText); var bj = document .getElementById("bj" ); var city = document .getElementById("city" ); /* * insertBefore() * - 可以在指定的子节点前插入新的子节点 * - 语法: * 父节点.insertBefore(新节点,旧节点); */ city.insertBefore(li, bj); }); myClick("btn03" , function ( ) { var li = document .createElement("li" ); var gzText = document .createTextNode("广州" ); li.appendChild(gzText); var bj = document .getElementById("bj" ); var city = document .getElementById("city" ); /* * replaceChild() * - 可以使用指定的子节点替换已有的子节点 * - 语法:父节点.replaceChild(新节点,旧节点); */ city.replaceChild(li, bj); }); myClick("btn04" , function ( ) { var bj = document .getElementById("bj" ); var city = document .getElementById("city" ); /* * removeChild() * - 可以删除一个子节点 * - 语法:父节点.removeChild(子节点); * * 子节点.parentNode.removeChild(子节点); */ bj.parentNode.removeChild(bj); }); myClick("btn05" , function ( ) { var city = document .getElementById("city" ); alert(city.innerHTML); }); myClick("btn06" , function ( ) { var bj = document .getElementById("bj" ); bj.innerHTML = "昌平" ; }); myClick("btn07" , function ( ) { /* createElement()创建元素节点,使用innerHTML添加文本节点,然后appendChild() */ var city = document .getElementById("city" ); /* * 使用innerHTML也可以完成DOM的增删改的相关操作 * 一般我们会两种方式结合使用 */ //city.innerHTML += "<li > 广州</li > "; var li = document .createElement("li" ); li.innerHTML = "广州" ; city.appendChild(li); }); }; function myClick (idStr, fun ) { var btn = document .getElementById(idStr); btn.onclick = fun; } </script > </head > <body > <div id ="total" > <div class ="inner" > <p > 你喜欢哪个城市? </p > <ul id ="city" > <li id ="bj" > 北京</li > <li > 上海</li > <li > 东京</li > <li > 首尔</li > </ul > </div > </div > <div id ="btnList" > <div > <button id ="btn01" > 创建一个"广州"节点,添加到#city下</button > </div > <div > <button id ="btn02" > 将"广州"节点插入到#bj前面</button > </div > <div > <button id ="btn03" > 使用"广州"节点替换#bj节点</button > </div > <div > <button id ="btn04" > 删除#bj节点</button > </div > <div > <button id ="btn05" > 读取#city内的HTML代码</button > </div > <div > <button id ="btn06" > 设置#bj内的HTML代码</button > </div > <div > <button id ="btn07" > 创建一个"广州"节点,添加到#city下</button > </div > </div > </body > </html >
document.createElement
document.createTextNode
appendChild:
父节点.appendChild(节点);
insertBefore:
父节点.insertBefore(新节点,旧节点);
旧节点.parentNode.insertBefore(新节点,旧节点);
replaceChild:
父节点.replaceChild(新节点,旧节点);
旧节点.parentNode.replaceChild(新节点,旧节点);
removeChild:
子节点.parentNode.removeChild(子节点);
父节点.removeChild(子节点);
103-106 添加删除记录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > 添加删除记录练习</title > <link rel ="stylesheet" type ="text/css" href ="css/1.css" /> <script type ="text/javascript" > window .onload = function ( ) { /* 点击超链接删除一个员工信息 */ var allA = document .getElementsByTagName("a" ); for (var i = 0 ; i < allA.length; i++) { allA[i].onclick = function ( ) { /* 点击超链接之后需要删除超链接所在行 注意:在事件的响应函数中,响应函数是给谁绑定的,this 就是谁 */ /* 点击超链接会跳转页面,这是超链接的默认行为,但是此时不希望出现默认行为,可以通过return false 来取消默认行为。 或者可以使用:<a href ="javascript:;" > </a > 来取消默认行为 */ /* confirm用于弹出一个带有确认和取消按钮的提示框,需要字符串作为参数,该参数将会作为提示文字显示出来 用户点击确认返回true ,如果点击取消返回false */ var parentTr = this .parentNode.parentNode; if (confirm("确认删除" + parentTr.getElementsByTagName("td" )[0 ].innerHTML + "吗?" )) { parentTr.parentNode.removeChild(parentTr); } return false ; } } /* 添加员工信息功能 - 点击按钮后,将员工的信息添加到表格中 */ var addEmpButton = document .getElementById("addEmpButton" ); addEmpButton.onclick = function ( ) { var name = document .getElementById("empName" ).value; var email = document .getElementById("email" ).value; var salary = document .getElementById("salary" ).value; var tableList = document .getElementById("employeeTable" ); /* <tr > <td > Tom</td > <td > tom@.com</td > <td > 5000</td > <td > <a href ="deleteEmp?id=001" > Delete</a > </td > </tr > 需要将获取到的信息保存到tr中 向a标签中添加href属性:a.href = 属性值 */ var tr = document .createElement("tr" ); var td1 = document .createElement("td" ); td1.innerHTML = name; var td2 = document .createElement("td" ); td2.innerHTML = email; var td3 = document .createElement("td" ); td3.innerHTML = salary; var td4 = document .createElement("td" ); td4.innerHTML = `<a href ="deleteEmp?id=001" > Delete</a > `; tr.appendChild(td1); tr.appendChild(td2); tr.appendChild(td3); tr.appendChild(td4); tableList.children[0].appendChild(tr); td4.children[0 ].onclick = function ( ) { var parentTr = this .parentNode.parentNode; if (confirm("确认删除" + parentTr.getElementsByTagName("td" )[0 ].innerHTML + "吗?" )) { parentTr.parentNode.removeChild(parentTr); } return false ; } } }; </script > </head > <body > <table id ="employeeTable" > <tr > <th > Name</th > <th > Email</th > <th > Salary</th > <th > </th > </tr > <tr > <td > Tom</td > <td > tom@.com</td > <td > 5000</td > <td > <a href ="deleteEmp?id=001" > Delete</a > </td > </tr > <tr > <td > Jerry</td > <td > jerry@sohu.com</td > <td > 8000</td > <td > <a href ="deleteEmp?id=002" > Delete</a > </td > </tr > <tr > <td > Bob</td > <td > bob@tom.com</td > <td > 10000</td > <td > <a href ="deleteEmp?id=003" > Delete</a > </td > </tr > </table > <div id ="formDiv" > <h4 > 添加新员工</h4 > <table > <tr > <td class ="word" > name: </td > <td class ="inp" > <input type ="text" name ="empName" id ="empName" /> </td > </tr > <tr > <td class ="word" > email: </td > <td class ="inp" > <input type ="text" name ="email" id ="email" /> </td > </tr > <tr > <td class ="word" > salary: </td > <td class ="inp" > <input type ="text" name ="salary" id ="salary" /> </td > </tr > <tr > <td colspan ="2" align ="center" > <button id ="addEmpButton" > Submit </button > </td > </tr > </table > </div > </body > </html >
浏览器生成了tbody包裹了tr,所以需要往tbody
中添加
106 a的索引问题 在上面练习中事件回调函数中,不使用this
,而是使用allA[i]
,会报错,因为allA[i]
是undefined
,这是i
的问题。
1 2 3 4 5 6 7 8 9 for (var i = 0 ; i < allA.length; i++) { allA[i].onclick = function ( ) { alert(allA[i]); return false ; } }
107 操作内联样式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 操作内联样式</title > <style > #box1 { width : 100px ; height : 100px ; background-color : #8080ff ; } </style > <script > window .onload = function ( ) { var btn01 = document .getElementsByTagName("button" )[0 ]; var btn02 = document .getElementsByTagName("button" )[1 ]; var box1 = document .getElementById("box1" ); btn01.onclick = function ( ) { /* 通过JS修改元素的样式 语法:元素.style.样式名 = 样式值; 注意:如果CSS的样式名中含有-,这种名称在JS中是不合法的,比如:background-color 需要将这种样式修改为驼峰命名法 去掉-,然后将-后面的字母大写 backgroundColor borderTopWidth 我们通过style属性设置的样式都是内联样式,而内联样式有较高的优先级,所以通过JS修改的样式往往会立即显示 但是如果在样式中使用了!important,则此时会有较高的优先级,即使通过JS也不能覆盖该样式,此时将会导致JS修改样式失效 所以尽量不要为样式添加!important */ box1.style.width = "300px" ; box1.style.height = "300px" ; box1.style.backgroundColor = "cyan" ; } btn02.onclick = function ( ) { /* 语法:元素.style.样式名 通过style属性设置和读取的都是内联样式 无法读取样式表中的样式 */ console .log(box1.style); console .log(typeof box1.style); alert(box1.style.backgroundColor); alert(typeof box1.style.backgroundColor); } } </script > </head > <body > <button > 效果切换</button > <button > 读取效果</button > <div id ="box1" > </div > </body > </html >
108 获取元素的样式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 获取元素内联样式</title > </head > <style > #box1 { width : 100px ; height : 100px ; background-color : #8080ff ; }</style > <script > window .onload = function ( ) { /* background-color默认值为transparent */ var box1 = document .getElementById("box1" ); var btn01 = document .getElementById("btn01" ); btn01.onclick = function ( ) { /* 读取元素的当前显示样式 语法:元素.currentStyle.样式名 它可以用来读取当前正在显示的样式 如果当前元素没有设置该样式,则获取它的默认值 注意:currentStyle只有IE浏览器支持,其他浏览器不支持! */ /* 在其他浏览器中可以使用 getComputedStyle()这个方法来获取元素当前显示的样式 这个方法是window 的方法,可以直接使用 需要两个参数 第一个:要获取样式的元素 第二个参数:可以传递一个伪元素,一般传递null 该方法会返回一个对象,对象中封装了当前元素对应的样式 可以通过对象.样式名来读取样式 如果获取的样式没有设置,则会获取到真实的值,而不是默认值 比如:没有设置width,他不会获取auto,而是一个长度 但是不支持IE8及其以下浏览器 注意:通过currentStyle和getComputedStyle()读取到的样式都是只读的,不能修改,如果要修改只能通过style属性来修改!!! */ var obj = getComputedStyle(box1, null ); console .log(obj); console .log(typeof obj); console .log(obj.height); console .log(obj.backgroundColor); } /* 定义一个函数来指定元素的当前样式,兼容不同浏览器 参数: obj:要获取样式的元素 name:要获取的样式名 */ function getStyle (obj, name ) { if (window .getComputedStyle) { /* 这里window .属性 用的很巧妙,因为属性不存在返回undefined 而不加window 代表变量,层层寻找没有后会报错 */ return getComputedStyle(obj, null )[name]; } else { return obj.currentStyle[name]; } /* 方案二: if(obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, null )[name]; } 方案一改进: return window .getComputedStyle?getComputedStyle(obj, null )[name]:obj.currentStyle[name] */ } }</script > <body > <button id ="btn01" > 点击</button > <div id ="box1" > </div > </body > </html >
109 getStyle()方法 见108
110 其他样式相关属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 其他样式相关属性</title > <style > #box1 { width : 100px ; height : 100px ; background-color : #8080ff ; padding : 10px ; border : 10px solid cyan; } #box2 { margin : 100px ; background-color : yellowgreen; } #box4 { height : 200px ; width : 200px ; background-color : lightpink; overflow : auto; } #box5 { height : 400px ; width : 400px ; background-color : black; } </style > <script > window .onload = function ( ) { var btn01 = document .getElementById("btn01" ); var box1 = document .getElementById("box1" ); var box4 = document .getElementById("box4" ); btn01.onclick = function ( ) { /* clientWidth clientHeight - 这两个属性可以获取元素的可见宽度和高度 - 这些属性都是不带px的,返回的都是一个数字,可以直接进行计算 - 会获取元素宽度和高度,包括内容区和内边距 - 注意:这些属性都是只读的,不能修改 offsetHeight offsetWidth - 获取元素的整个高度和宽度,包括内容区、内边距和边框 offsetParent - 可以用来获取当前元素的定位父元素 - 获取到离当前元素最近的开启了定位的祖先元素(定位默认为static ,不算做开启定位,absolute/relative才算),如果所有的祖先元素都没有开启定位,则返回body offsetLeft - 当前元素相对于其定位元素的水平偏移量 offsetTop - 当前元素相对于其定位元素的垂直偏移量 scrollHeight scrollWidth - 可以获取元素整个滚动条区域的高度或长度 scrollLeft - 获取水平滚动条滚动的距离 scrollTop - 获取垂直滚动条滚动的距离 */ console .log(box1.clientWidth); console .log(box1.clientHeight); console .log(box1.offsetWidth); console .log(box1.offsetHeight); var op = box1.offsetParent; console .log(op); console .log(box1.offsetLeft); console .log(box1.offsetTop); console .log(box4.clientHeight); console .log(box4.scrollHeight); console .log(box4.scrollWidth); console .log(box4.clientHeight); /* 当满足了scrollHeight - scrollTop == clientHeight 说明了垂直滚动条滚动到底了 当满足了scrollWidth - scrollLeft == clientWidth 说明了水平滚动条滚动到底了 */ console .log(box4.scrollHeight - box4.scrollTop); } } </script > </head > <body > <button id ="btn01" > 点击</button > <br /> <br /> <div id ="box4" > <div id ="box5" > </div > </div > <div id ="box3" style ="position:relative;" > <div id ="box2" > <div id ="box1" > </div > </div > </div > </body > </html >
110(2)练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 练习</title > <style > #content { width : 200px ; height : 200px ; overflow : auto; background-color : #8080ff ; color : cyan; } </style > <script > window .onload = function ( ) { var content = document .getElementById("content" ); var checkBox = document .getElementById("check" ); var submitButton = document .getElementById("submit" ); content.onscroll = function ( ) { console .log(content.scrollHeight - content.scrollTop); if (Math .round(content.scrollHeight - content.scrollTop) == content.clientHeight) { checkBox.disabled = false ; subm.disabled = false ; } } } </script > </head > <body > <h3 > 注册须知</h3 > <p id ="content" > ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼ycy羽川翼 </p > <input type ="checkbox" disabled ="disabled" id ="check" > <input type ="submit" value ="提交" disabled ="disabled" id ="subm" > </body > </html >
111 事件对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > 事件对象</title > <style type ="text/css" > #areaDiv { border : 1px solid black; width : 300px ; height : 50px ; margin-bottom : 10px ; } #showMsg { border : 1px solid black; width : 300px ; height : 20px ; } </style > <script type ="text/javascript" > window .onload = function ( ) { /* * 当鼠标在areaDiv中移动时,在showMsg中来显示鼠标的坐标 */ var areaDiv = document .getElementById("areaDiv" ); var showMsg = document .getElementById("showMsg" ); /* * onmousemove * - 该事件将会在鼠标在元素中移动时被触发 * * 事件对象 * - 当事件的响应函数被触发时,浏览器每次都会将一个事件对象作为实参传递进响应函数, * 在事件对象中封装了当前事件相关的一切信息,比如:鼠标的坐标 键盘哪个按键被按下 鼠标滚轮滚动的方向。。。 */ areaDiv.onmousemove = function (event ) { /* * 在IE8中,响应函数被触发时,浏览器不会传递事件对象, * 在IE8及以下的浏览器中,是将事件对象作为window 对象的属性保存的 */ /*if(!event){ event = window .event; }*/ event = event || window .event; /* * clientX可以获取鼠标指针的水平坐标 * cilentY可以获取鼠标指针的垂直坐标 */ var x = event.clientX; var y = event.clientY; showMsg.innerHTML = "x = " + x + " , y = " + y; }; }; </script > </head > <body > <div id ="areaDiv" > </div > <div id ="showMsg" > </div > </body > </html >
112 div跟随鼠标移动 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > div跟随鼠标移动</title > <style > * { margin : 0 ; padding : 0 ; } #move { background-color : #8080ff ; width : 100px ; height : 100px ; } </style > <script > window .onload = function ( ) { var move = document .getElementById("move" ); document .onmousemove = function (event ) { event = event || window .event; /* clientX、clientY 用于获取鼠标在当前的可见窗口的坐标 */ var x = event.clientX; var y = event.clientY; /* pageX、pageY 用于获取鼠标相对于当前页面的坐标 但是该属性在IE8中不支持,如果需要兼容IE8,就需要其他方法 var x = event.pageX; var y = event.pageY; */ var st1 = document .documentElement.scrollTop; var st2 = document .documentElement.scrollLeft; move.style.marginLeft = x + st2 + "px" ; move.style.marginTop = y + st1 + "px" ; } } </script > </head > <body style ="height:1000px;" > <div id ="move" > </div > </body > </html >
113 事件冒泡 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > #box1{ width : 200px ; height : 200px ; background-color : yellowgreen; } #s1{ background-color : yellow; } </style > <script type ="text/javascript" > window .onload = function ( ) { /* * 事件的冒泡(Bubble) * - 所谓的冒泡指的就是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发 * - 在开发中大部分情况冒泡都是有用的,如果不希望发生事件冒泡可以通过事件对象来取消冒泡 * */ var s1 = document .getElementById("s1" ); s1.onclick = function (event ) { event = event || window .event; alert("我是span的单击响应函数" ); event.cancelBubble = true ; }; var box1 = document .getElementById("box1" ); box1.onclick = function (event ) { event = event || window .event; alert("我是div的单击响应函数" ); event.cancelBubble = true ; }; document .body.onclick = function ( ) { alert("我是body的单击响应函数" ); }; }; </script > </head > <body > <div id ="box1" > 我是box1 <span id ="s1" > 我是span</span > </div > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > #box1 { width : 100px ; height : 100px ; background-color : red; /* * 开启box1的绝对定位 */ position : absolute; } </style > <script type ="text/javascript" > window .onload = function ( ) { /* * 使div可以跟随鼠标移动 */ var box1 = document .getElementById("box1" ); document .onmousemove = function (event ) { event = event || window .event; var st = document .documentElement.scrollTop; var sl = document .documentElement.scrollLeft; /* * clientX和clientY * 用于获取鼠标在当前的可见窗口的坐标 * div的偏移量,是相对于整个页面的 * * pageX和pageY可以获取鼠标相对于当前页面的坐标 * 但是这个两个属性在IE8中不支持,所以如果需要兼容IE8,则不要使用 */ var left = event.clientX; var top = event.clientY; box1.style.left = left + sl + "px" ; box1.style.top = top + st + "px" ; }; var box2 = document .getElementById("box2" ); box2.onmousemove = function (event ) { event = event || window .event; event.cancelBubble = true ; }; }; </script > </head > <body style ="height: 1000px;width: 2000px;" > <div id ="box2" style ="width: 500px; height: 500px; background-color: #bfa;" > </div > <div id ="box1" > </div > </body > </html >
114 事件的委派 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 <!DOCTYPE html > <html > <head > <meta charset ="utf-8" /> <title > </title > <script type ="text/javascript" > window .onload = function ( ) { var u1 = document .getElementById("u1" ); var btn01 = document .getElementById("btn01" ); btn01.onclick = function ( ) { var li = document .createElement("li" ); li.innerHTML = "<a href ='javascript:;' class ='link' > 新建的超链接</a > "; u1.appendChild(li); }; /* * 为每一个超链接都绑定一个单击响应函数 * 这里我们为每一个超链接都绑定了一个单击响应函数,这种操作比较麻烦, * 而且这些操作只能为已有的超链接设置事件,而新添加的超链接必须重新绑定 */ var allA = document .getElementsByTagName("a" ); /*for(var i=0 ; i<allA.length ; i++){ allA[i].onclick = function ( ) { alert("我是a的单击响应函数!!!" ); }; }*/ /* * 我们希望,只绑定一次事件,即可应用到多个的元素上,即使元素是后添加的 * 我们可以尝试将其绑定给元素的共同的祖先元素 * * 事件的委派 * - 指将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素 * 从而通过祖先元素的响应函数来处理事件。 * - 事件委派是利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能 */ u1.onclick = function (event ) { event = event || window .event; /* * target * - event中的target表示的触发事件的对象 */ if (event.target.className == "link" ){ alert("我是ul的单击响应函数" ); } }; }; </script > </head > <body > <button id ="btn01" > 添加超链接</button > <ul id ="u1" style ="background-color: #bfa;" > <li > <p > 我是p元素</p > </li > <li > <a href ="javascript:;" class ="link" > 超链接一</a > </li > <li > <a href ="javascript:;" class ="link" > 超链接二</a > </li > <li > <a href ="javascript:;" class ="link" > 超链接三</a > </li > </ul > </body > </html >
115 事件的绑定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <script type ="text/javascript" > window .onload = function ( ) { /* * 点击按钮以后弹出一个内容 */ var btn01 = document .getElementById("btn01" ); /* * 使用 对象.事件 = 函数 的形式绑定响应函数, * 它只能同时为一个元素的一个事件绑定一个响应函数, * 不能绑定多个,如果绑定了多个,则后边会覆盖掉前边的 */ /*btn01.onclick = function(){ alert(1); };*/ /*btn01.onclick = function(){ alert(2); };*/ /* * addEventListener() * - 通过这个方法也可以为元素绑定响应函数 * - 参数: * 1.事件的字符串,不要on * 2.回调函数,当事件触发时该函数会被调用 * 3. 是否在捕获阶段触发事件,需要一个布尔值,一般都传false * * 使用addEventListener()可以同时为一个元素的相同事件同时绑定多个响应函数, * 这样当事件被触发时,响应函数将会按照函数的绑定顺序执行 * * 这个方法不支持IE8及以下的浏览器 */ /*btn01.addEventListener("click",function(){ alert(1); },false ); btn01.addEventListener("click" ,function ( ) { alert(2); },false ); btn01.addEventListener("click" ,function ( ) { alert(3); },false );*/ /* * attachEvent() * - 在IE8中可以使用attachEvent()来绑定事件 * - 参数: * 1.事件的字符串,要on * 2.回调函数 * * - 这个方法也可以同时为一个事件绑定多个处理函数, * 不同的是它是后绑定先执行,执行顺序和addEventListener()相反 */ /*btn01.attachEvent("onclick",function(){ alert(1); }); btn01.attachEvent("onclick" ,function ( ) { alert(2); }); btn01.attachEvent("onclick" ,function ( ) { alert(3); });*/ /*btn01.addEventListener("click",function(){ alert(this ); },false );*/ /*btn01.attachEvent("onclick",function(){ alert(this ); });*/ bind(btn01 , "click" , function ( ) { alert(this ); }); }; /* * addEventListener()中的this ,是绑定事件的对象 * attachEvent()中的this ,是window * 需要统一两个方法this */ /* * 参数: * obj 要绑定事件的对象 * eventStr 事件的字符串(不要on) * callback 回调函数 */ function bind (obj , eventStr , callback ) { if(obj.addEventListener){ obj.addEventListener(eventStr , callback , false ); }else { /* * this 是谁由调用方式决定 * callback.call(obj) */ obj.attachEvent("on" +eventStr , function ( ) { callback.call(obj); }); } } </script > </head > <body > <button id ="btn01" > 点我一下</button > </body > </html >
117 事件的传播 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > #box1{ width : 300px ; height : 300px ; background-color : yellowgreen; } #box2{ width : 200px ; height : 200px ; background-color : yellow; } #box3{ width : 150px ; height : 150px ; background-color : skyblue; } </style > <script type ="text/javascript" > window .onload = function ( ) { /* * 分别为三个div绑定单击响应函数 */ var box1 = document .getElementById("box1" ); var box2 = document .getElementById("box2" ); var box3 = document .getElementById("box3" ); /* * 事件的传播 * - 关于事件的传播网景公司和微软公司有不同的理解 * - 微软公司认为事件应该是由内向外传播,也就是当事件触发时,应该先触发当前元素上的事件, * 然后再向当前元素的祖先元素上传播,也就说事件应该在冒泡阶段执行。 * - 网景公司认为事件应该是由外向内传播的,也就是当前事件触发时,应该先触发当前元素的最外层的祖先元素的事件, * 然后在向内传播给后代元素 * - W3C综合了两个公司的方案,将事件传播分成了三个阶段 * 1.捕获阶段 * - 在捕获阶段时从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件 * 2.目标阶段 * - 事件捕获到目标元素,捕获结束开始在目标元素上触发事件 * 3.冒泡阶段 * - 事件从目标元素向他的祖先元素传递,依次触发祖先元素上的事件 * * - 如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true * 一般情况下我们不会希望在捕获阶段触发事件,所以这个参数一般都是false * * - IE8及以下的浏览器中没有捕获阶段 */ bind(box1,"click" ,function ( ) { alert("我是box1的响应函数" ) }); bind(box2,"click" ,function ( ) { alert("我是box2的响应函数" ) }); bind(box3,"click" ,function ( ) { alert("我是box3的响应函数" ) }); }; function bind (obj , eventStr , callback ) { if(obj.addEventListener){ obj.addEventListener(eventStr , callback , true ); }else { /* * this 是谁由调用方式决定 * callback.call(obj) */ obj.attachEvent("on" +eventStr , function ( ) { callback.call(obj); }); } } </script > </head > <body > <div id ="box1" > <div id ="box2" > <div id ="box3" > </div > </div > </div > </body > </html >
118 拖拽 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > #box1{ width : 100px ; height : 100px ; background-color : red; position : absolute; } #box2{ width : 100px ; height : 100px ; background-color : yellow; position : absolute; left : 200px ; top : 200px ; } </style > <script type ="text/javascript" > window .onload = function ( ) { /* * 拖拽box1元素 * - 拖拽的流程 * 1.当鼠标在被拖拽元素上按下时,开始拖拽 onmousedown * 2.当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove * 3.当鼠标松开时,被拖拽元素固定在当前位置 onmouseup */ var box1 = document .getElementById("box1" ); box1.onmousedown = function (event ) { event = event || window .event; var ol = event.clientX - box1.offsetLeft; var ot = event.clientY - box1.offsetTop; document .onmousemove = function (event ) { event = event || window .event; var left = event.clientX - ol; var top = event.clientY - ot; box1.style.left = left+"px" ; box1.style.top = top+"px" ; }; document .onmouseup = function ( ) { document .onmousemove = null ; document .onmouseup = null ; }; }; }; </script > </head > <body > <div id ="box1" > </div > <div id ="box2" > </div > </body > </html >
119 拖拽 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > #box1 { width : 100px ; height : 100px ; background-color : red; position : absolute; } #box2 { width : 100px ; height : 100px ; background-color : yellow; position : absolute; left : 200px ; top : 200px ; } </style > <script type ="text/javascript" > window .onload = function ( ) { var box1 = document .getElementById("box1" ); var box2 = document .getElementById("box2" ); box1.onmousedown = function (event ) { /* * setCapture() * - 只有IE支持,但是在火狐中调用时不会报错, * 而如果使用chrome调用,会报错 */ /*if(box1.setCapture){ box1.setCapture(); }*/ box1.setCapture && box1.setCapture(); event = event || window .event; var ol = event.clientX - box1.offsetLeft; var ot = event.clientY - box1.offsetTop; document .onmousemove = function (event ) { event = event || window .event; var left = event.clientX - ol; var top = event.clientY - ot; box1.style.left = left + "px" ; box1.style.top = top + "px" ; }; document .onmouseup = function ( ) { document .onmousemove = null ; document .onmouseup = null ; box1.releaseCapture && box1.releaseCapture(); }; /* * 当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容, * 此时会导致拖拽功能的异常,这个是浏览器提供的默认行为, * 如果不希望发生这个行为,则可以通过return false 来取消默认行为 * * 但是这招对IE8不起作用 */ return false ; }; }; </script > </head > <body > 我是一段文字 <div id ="box1" > </div > <div id ="box2" > </div > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <script type ="text/javascript" > window .onload = function ( ) { var btn01 = document .getElementById("btn01" ); var btn02 = document .getElementById("btn02" ); btn01.onclick = function ( ) { alert(1); }; btn02.onclick = function ( ) { alert(2); }; btn01.setCapture(); }; </script > </head > <body > <button id ="btn01" > 按钮01</button > <button id ="btn02" > 按钮02</button > </body > </html >
121 滚轮事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 滚轮的事件</title > <style > #box1 { width : 100px ; height : 100px ; background-color : #8080ff ; } </style > <script > window .onload = function ( ) { /* 当滚轮向下滚动时,box1变长 当滚轮向上滚动时,box1变短 */ var box1 = document .getElementById("box1" ); /* onmousewheel鼠标滚轮滚动的事件,会在滚轮滚动时触发,但是火狐浏览器不支持该属性 在火狐中需要使用DOMMouseScroll来绑定滚动事件 注意该事件需要通过addEventListener()函数来绑定 */ box1.onmousewheel = function (event ) { event = event || window .event; /* event.wheelDelta 可以获取鼠标滚轮滚动的方向 向上滚动120,向下滚动-120 这个值不看大小,只看正负 event.wheelDelta属性火狐不支持,火狐中使用event.detail来获取滚动方向 向上-3,向下3 */ if (event.wheelDelta > 0 || event.detail < 0) { box1.style.height += box1.clientHeight - 10; } else { box1.style.height += box1.clientHeight + 10; } /* 使用addEventListener()方法绑定响应函数,取消默认行为不能使用return false 需要使用event来取消默认行为 但是IE8不支持event.preventDefault();如果直接调用会报错 */ event.preventDefault || event.preventDefault(); /* 当滚轮滚动时,如果浏览器有滚动条,滚动条会随之滚动,这是浏览器的默认行为,如果不希望发生,则可以取消默认行为 */ return false ; }; bind(box1, "DOMMouseScroll" , box1.onmousewheel); function bind (obj, eventStr, callback ) { if (obj.addEventListener) { obj.addEventListener(eventStr, callback, false ); } else { obj.attachEvent("on" + eventStr, function ( ) { callback.call(obj); }); } } } </script > </head > <body style ="height:2000px;" > <div id ="box1" > </div > </body > </html >
122 键盘事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 键盘事件</title > <script > window .onload = function ( ) { /* 键盘事件: onkeydown - 按键被按下 - 对于onkeydown来说,如果一直按着某个键不松开,则事件会一直连续触发 - onkeydown连续触发时,第一次和第二次之间间隔会非常大,其他的会非常快,这种设计是为了防止误操作 onkeyup - 按键被松开 键盘事件一般绑定给一些可以获取焦点的对象或者document */ var input = document .getElementsByTagName("input" )[0 ]; var check = document .getElementById("check" ); input.onkeyup = function ( ) { console .log(this ); /* 在文本框中输入内容,属于onkeydown的默认行为,如果在onkeydown中取消了默认行为,则输入的内容,不会出现在文本框中 return false ; */ check.innerHTML = this .value.match(/\D/ ) ? "错误" : "正确" ; } } </script > </head > <body > <input type ="text" /> <span id ="check" > </span > </body > </html >
注意到底是绑定keydown
还是keyup
。
123 键盘移动div 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 键盘移动div</title > <style > #box { height : 100px ; width : 100px ; background-color : #8080ff ; position : relative; } </style > <script > window .onload = function ( ) { var box = document .getElementById("box" ); document .onkeydown = function (event ) { event = event || window .event; var x = box.offsetLeft; var y = box.offsetTop; console .log(box); switch (event.key) { case "ArrowLeft" : box.style.left = x - 20 + "px" ; break ; case "ArrowRight" : box.style.left = x + 10 + "px" ; break ; case "ArrowDown" : box.style.top = y + 10 + "px" ; break ; case "ArrowUp" : box.style.top = y - 20 + "px" ; break ; } } } </script > </head > <body > <div id ="box" > </div > </body > </html >
124 Navigator 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > navigator</title > <script > /* BOM - 浏览器对象模型 - BOM可以使我们通过JS来操作浏览器 - 在BOM中为我们提供了一组对象,用来完成对浏览器的操作 Window - 代表的是整个浏览器 Navigator - 代表的是当前浏览器的信息,通过该对象可以识别不同的浏览器 Location - 代表当前浏览器的地址栏信息,通过Location可以获取地址栏信息,或者操作浏览器跳转页面 History - 代表的浏览器的历史记录,可以通过该对象来操作浏览器向前或向后翻页 而且该操作只在当次访问有效 Screen - 代表的是用户屏幕的信息,通过该对象可以获取到用户显示器的相关信息 这些BOM对象在浏览器中都是作为window 对象的属性保存的。 可以通过window 对象来使用,也可以直接使用 */ console .log(navigator, window .navigator); console .log(location, window .location); console .log(history, window .history); console .log(screen, window .screen); /* Navigator - 代表的当前浏览器的信息,通过该对象可以识别不同的浏览器 - 由于历史原因,Navigator中大部分属性都已经不能帮助我们识别浏览器了 - 一般我们只会使用userAgent来判断浏览器的信息 userAgent是一个字符串,这个字符串中包含有用来描述浏览器信息的内容,不同的浏览器会有不同的userAgent */ console .log(navigator.appName); console .log(navigator.userAgent); /* EDGE Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50 Chrome Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 IE11 Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko */ /* 如果通过UserAgent不能判断,还可以通过一些浏览器特有的对象,来判断浏览器的信息 比如: ActiveXObject IE特有(IE8-11 都有,8 -10 window .ActiveObject返回true ,但是IE11返回false ,有一说一真恶心) 所以需要使用("ActiveXObject" in window ) 来判断 */ </script > </head > <body > </body > </html >
125 history 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > History</title > <script > window .onload = function ( ) { /* History - 对象可以用来操作了浏览器向前或者向后翻页 history.length属性可以获取到当前访问的链接数量 */ console .log(history); console .log(history.length); var btn1 = document .getElementsByTagName("button" )[0 ]; var btn2 = document .getElementsByTagName("button" )[1 ]; btn1.onclick = function ( ) { /* back() - 用来回退到上一个页面,作用与浏览器的回退按钮一致。 */ history.back(); } btn2.onclick = function ( ) { /* forward() - 用来跳转到下一个页面,作用与前进按钮一致。 */ history.forward(); } /* go - 可以用来跳转到指定的页面 - 它需要一个整数作为参数 1.表示向前跳转一个页面 2.表示向前跳转两个页面 -1.表示向后跳转一个页面 -2.表示向后跳转两个页面 */ } </script > </head > <body > <h1 > 测试History</h1 > <button > 跳转回上一个页面</button > <button > 跳转到下一个页面</button > </body > </html >
126 location 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Location</title > <script > window .onload = function ( ) { /* Location对象 - 该对象中封装了浏览器中地址栏的信息 */ var btn1 = document .getElementsByTagName("button" )[0 ]; btn1.onclick = function ( ) { console .log(location); /* 如果直接将location属性修改为一个完整的路径,或相对路径,则页面回自动跳转到该路径,并会生成相应的历史记录 */ /* assign - 用来跳转到其他的页面,作用和直接修改location一样 */ location.assign("https://miketaylorjuly123.cn" ); /* reload() - 用于重新加载当前文档,作用与刷新按钮一致,但是火狐会有缓存,可以通过指定参数true 进行强制清空缓存刷新 - 如果在方法中传递一个参数true ,作为参数,则会强制清空缓存刷新页面 */ /* replace - 可以使用一个新的页面来替换当前页面,调用完毕后也会跳转页面 - 但是注意,他不会生成历史记录,无法进行回退 */ } } </script > </head > <body > <h1 > Location</h1 > <button > 测试</button > </body > </html >
127 定时器简介 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 定时器简介</title > <style > </style > <script > /* setInterval () - 开启定时器,可以将一个函数每隔一段时间执行一次 - 可以将一个函数,每隔一段时间执行一次 - 参数: - 1.回调函数,该函数会每隔一段时间被调用一次 2.每次调用间隔的时间,单位为毫秒 - 返回值 返回一个Number 类型的数据 返回值用来作为定时器的唯一标识 clearInterval () - 用于关闭定时器 - 方法中需要一个定时器的标识作为参数,这样将关闭标识对应的定时器 */ window .onload = function ( ) { var count = document .getElementById("count" ); /* 如果希望一段程序每间隔一段时间调用,可以使用定时器调用 */ var num = 1 ; var timer = setInterval (function ( ) { count.innerHTML = num++; if (num == 99) { count.innerHTML = "羽川翼!" ; clearInterval (timer); } }, 20); }; </script > </head > <body > <h2 id ="count" > 1</h2 > </body > </html >
128 切换图片练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 切换图片练习</title > <script > var imgArray = ["./img/1.png" , "./img/2.png" , "./img/3.png" , "./img/4.png" ]; var index = 0 ; var timer; window .onload = function ( ) { var img = document .getElementsByTagName("img" )[0 ]; var btn01 = document .getElementsByTagName("button" )[0 ]; var btn02 = document .getElementsByTagName("button" )[1 ]; btn01.onclick = function ( ) { /* 每点击一次就会开启一个定时器,而且定时器标识被覆盖,导致关不掉除最后一个定时器外的定时器 */ clearInterval (timer); timer = setInterval (() => { index = (index + 1) % imgArray.length; img.src = imgArray[index]; }, 3000); btn02.onclick = function ( ) { /* clearInterval ()可以接收任意的参数 如果参数是一个有效的定时器标识,则停止对应的定时器 如果参数不是一个有效的标识,则什么也不会发生,不会报错 */ clearInterval (timer); console .log(timer); } } } </script > <style > * { margin : 0 ; padding : 0 ; } div { width : 600px ; margin : 0 auto; } img { width : 100% ; } button :last-child { float : right; } </style > </head > <body > <div > <img src ="./img/1.png" alt ="" > <button id ="btn01" > 开始</button > <button id ="btn02" > 暂停</button > </div > </body > </html >
129 修改div练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 键盘移动div</title > <style > #box { height : 100px ; width : 100px ; background-color : #8080ff ; position : relative; } </style > <script > window .onload = function ( ) { /* 问题:长按后,连续移动前有明显的卡顿情况 */ var box = document .getElementById("box" ); var direction = null ; setInterval (() => { switch (direction) { case "ArrowLeft" : box.style.left = box.offsetLeft - 20 + "px" ; break ; case "ArrowRight" : box.style.left = box.offsetLeft + 10 + "px" ; break ; case "ArrowDown" : box.style.top = box.offsetTop + 10 + "px" ; break ; case "ArrowUp" : box.style.top = box.offsetTop - 20 + "px" ; break ; } }, 30); document .onkeydown = function (event ) { event = event || window .event; direction = event.key; } document .onkeyup = function ( ) { direction = null ; } } </script > </head > <body > <div id ="box" > </div > </body > </html >
130 延时调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 延时调用</title > <script > var num = 1 ; setInterval (function ( ) { console .log(num++); }, 3000); /* setTimeout - 延时调用:一个函数不是马上执行,而是隔一段时间执行,而且只会执行一次 - 定时调用执行多次,延时调用执行一次 延时调用和定时调用实际上是可以相互转换代替的,开发中可以根据自己的需要选择 */ var timer = setInterval (function ( ) { console .log(num++); }, 3000); clearTimeout (timer); </script > </head > <body > </body > </html >
131 定时器的应用(一) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > * { margin : 0 ; padding : 0 ; } #box1 { width : 100px ; height : 100px ; background-color : red; position : absolute; left : 0 ; } </style > <script type ="text/javascript" > window .onload = function ( ) { var box1 = document .getElementById("box1" ); var btn01 = document .getElementById("btn01" ); var timer; btn01.onclick = function ( ) { clearInterval (timer); timer = setInterval (function ( ) { var oldValue = parseInt (getStyle(box1, "left" )); var newValue = oldValue + 10 ; if (newValue > 800) { newValue = 800; } box1.style.left = newValue + "px" ; if (newValue == 800) { clearInterval (timer); } }, 30); }; }; /* * 定义一个函数,用来获取指定元素的当前的样式 * 参数: * obj 要获取样式的元素 * name 要获取的样式名 */ function getStyle (obj, name ) { if (window .getComputedStyle) { return getComputedStyle(obj, null )[name]; } else { return obj.currentStyle[name]; } } </script > </head > <body > <button id ="btn01" > 点击按钮以后box1向右移动</button > <br /> <br /> <div id ="box1" > </div > <div style ="width: 0; height: 1000px; border-left:1px black solid; position: absolute; left: 800px;top:0;" > </div > </body > </html >
132 定时器的应用(三) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > *{ margin : 0 ; padding : 0 ; } #box1{ width : 100px ; height : 100px ; background-color : red; position : absolute; left : 0 ; } </style > <script type ="text/javascript" > window .onload = function ( ) { var box1 = document .getElementById("box1" ); var btn01 = document .getElementById("btn01" ); var btn02 = document .getElementById("btn02" ); btn01.onclick = function ( ) { move(box1 , 800 , 10); }; btn02.onclick = function ( ) { move(box1 , 0 , 10); }; }; var timer; /* * 参数: * obj:要执行动画的对象 * target:执行动画的目标位置 * speed:移动的速度(正数向右移动,负数向左移动) */ function move (obj , target ,speed ) { clearInterval (timer); var current = parseInt (getStyle(obj,"left" )); if(current > target){ speed = -speed; } timer = setInterval (function ( ) { var oldValue = parseInt (getStyle(obj,"left" )); var newValue = oldValue + speed; if((speed < 0 && newValue < target) || (speed > 0 && newValue > target)){ newValue = target; } obj.style.left = newValue + "px" ; if(newValue == target){ clearInterval (timer); } },30); } /* * 定义一个函数,用来获取指定元素的当前的样式 * 参数: * obj 要获取样式的元素 * name 要获取的样式名 */ function getStyle (obj , name ) { if (window .getComputedStyle){ return getComputedStyle(obj , null )[name]; }else { return obj.currentStyle[name]; } } </script > </head > <body > <button id ="btn01" > 点击按钮以后box1向右移动</button > <button id ="btn02" > 点击按钮以后box1向左移动</button > <br /> <br /> <div id ="box1" > </div > <div style ="width: 0; height: 1000px; border-left:1px black solid; position: absolute; left: 800px;top:0;" > </div > </body > </html >
133 定时器的应用(三) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > *{ margin : 0 ; padding : 0 ; } #box1{ width : 100px ; height : 100px ; background-color : red; position : absolute; left : 0 ; } #box2{ width : 100px ; height : 100px ; background-color : yellow; position : absolute; left : 0 ; top : 200px ; } </style > <script type ="text/javascript" src ="js/tools.js" > </script > <script type ="text/javascript" > window .onload = function ( ) { var box1 = document .getElementById("box1" ); var btn01 = document .getElementById("btn01" ); var btn02 = document .getElementById("btn02" ); btn01.onclick = function ( ) { move(box1 ,"left" , 800 , 20 ); }; btn02.onclick = function ( ) { move(box1 ,"left" , 0 , 10 ); }; var btn03 = document .getElementById("btn03" ); btn03.onclick = function ( ) { move(box2 , "left" ,800 , 10 ); }; var btn04 = document .getElementById("btn04" ); btn04.onclick = function ( ) { move(box2 , "width" , 800 , 10 , function ( ) { move(box2 , "height" , 400 , 10 , function ( ) { move(box2 , "top" , 0 , 10 , function ( ) { move(box2 , "width" , 100 , 10 , function ( ) { }); }); }); }); }; }; </script > </head > <body > <button id ="btn01" > 点击按钮以后box1向右移动</button > <button id ="btn02" > 点击按钮以后box1向左移动</button > <button id ="btn03" > 点击按钮以后box2向右移动</button > <button id ="btn04" > 测试按钮</button > <br /> <br /> <div id ="box1" > </div > <div id ="box2" > </div > <div style ="width: 0; height: 1000px; border-left:1px black solid; position: absolute; left: 800px;top:0;" > </div > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 function move (obj, attr, target, speed, callback ) { clearInterval (obj.timer); var current = parseInt (getStyle(obj, attr)); if (current > target) { speed = -speed; } obj.timer = setInterval (function ( ) { var oldValue = parseInt (getStyle(obj, attr)); var newValue = oldValue + speed; if ((speed < 0 && newValue < target) || (speed > 0 && newValue > target)) { newValue = target; } obj.style[attr] = newValue + "px" ; if (newValue == target) { clearInterval (obj.timer); callback && callback(); } }, 30 ); }function getStyle (obj, name ) { if (window .getComputedStyle) { return getComputedStyle(obj, null )[name]; } else { return obj.currentStyle[name]; } }
134 轮播图——自动放映(自己实现) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 轮播图</title > <style > * { margin : 0 ; padding : 0 ; } #container { width : 361px ; height : 200px ; margin : 50px auto; background-color : #8080ff ; padding : 10px 0 ; position : relative; overflow : hidden; } #imgList { position : absolute; left : 0px ; } li { height : 200px ; float : left; list-style : none; margin : 0 20px ; } li img { height : 100% ; } </style > <script > window .onload = function ( ) { var imgList = document .getElementById("imgList" ); var container = document .getElementById("container" ); var imgs = document .getElementsByTagName("img" ); imgList.style.width = 361 * imgs.length + "px" ; imgList.style.left = 0 + "px" ; /* 每向左移动361px,就会显示下一张图片 */ var timer; var index = 0 ; var speed = 10 ; var positionLeft; var flag = true ; setInterval (() => { clearInterval (timer); if (index != imgs.length - 1 && flag == true ) { console .log("##" + imgList.style.left); positionLeft = -361 * (++index % imgs.length); timer = setInterval (() => { imgList.style.left = (parseInt (getStyle(imgList, "left" )) - speed) + "px" ; if (positionLeft > parseInt (getStyle(imgList, "left" ))) { imgList.style.left = -361 * (index % imgs.length) + "px" ; clearInterval (timer); } }, 10); } else { console .log("@@" + imgList.style.left); flag = false ; positionLeft = -361 * (--index % imgs.length); timer = setInterval (() => { imgList.style.left = (parseInt (getStyle(imgList, "left" )) + speed) + "px" ; if (positionLeft < parseInt (getStyle(imgList, "left" ))) { imgList.style.left = -361 * (index % imgs.length) + "px" ; if (index == 0) { flag = true ; } clearInterval (timer); } }, 10); } }, 1000) } function getStyle (obj, name ) { if (window .getComputedStyle) { /* 这里window .属性 用的很巧妙,因为属性不存在返回undefined 而不加window 代表变量,层层寻找没有后会报错 */ return getComputedStyle(obj, null )[name]; } else { return obj.currentStyle[name]; } } </script > </head > <body > <div id ="container" > <ul id ="imgList" > <li > <img src ="./img/1.png" alt ="" > </li > <li > <img src ="./img/2.png" alt ="" > </li > <li > <img src ="./img/3.png" alt ="" > </li > <li > <img src ="./img/4.png" alt ="" > </li > </ul > </div > </body > </html >
134 轮播图——点击跳转 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > * { margin : 0 ; padding : 0 ; } /* * 设置outer的样式 */ #outer { width : 520px ; height : 333px ; margin : 50px auto; background-color : greenyellow; padding : 10px 0 ; position : relative; overflow : hidden; } #imgList { list-style : none; position : absolute; /* * 每向左移动520px,就会显示到下一张图片 */ left : 0px ; } #imgList li { float : left; margin : 0 10px ; } #navDiv { position : absolute; bottom : 15px ; /*设置left值 outer宽度 520 navDiv宽度 25*5 = 125 520 - 125 = 395/2 = 197.5 * */ } #navDiv a { float : left; width : 15px ; height : 15px ; background-color : red; margin : 0 5px ; opacity : 0.5 ; filter : alpha (opacity=50 ); } #navDiv a :hover { background-color : black; } </style > <script type ="text/javascript" src ="js/tools.js" > </script > <script type ="text/javascript" > window .onload = function ( ) { var imgList = document .getElementById("imgList" ); var imgArr = document .getElementsByTagName("img" ); imgList.style.width = 520 * imgArr.length + "px" ; var navDiv = document .getElementById("navDiv" ); var outer = document .getElementById("outer" ); navDiv.style.left = (outer.offsetWidth - navDiv.offsetWidth) / 2 + "px" ; var index = 0 ; var allA = document .getElementsByTagName("a" ); allA[index].style.backgroundColor = "black" ; /* 点击超链接切换到指定的图片 点击第一个超链接,显示第一个图片 点击第二个超链接,显示第二个图片 * */ for (var i = 0 ; i < allA.length; i++) { allA[i].num = i; allA[i].onclick = function ( ) { index = this .num; /* * 第一张 0 0 * 第二张 1 -520 * 第三张 2 -1040 */ setA(); move(imgList, "left" , -520 * index, 20 , function ( ) { }); }; } function setA ( ) { for (var i = 0 ; i < allA.length; i++) { allA[i].style.backgroundColor = "" ; } allA[index].style.backgroundColor = "black" ; }; }; </script > </head > <body > <div id ="outer" > <ul id ="imgList" > <li > <img src ="img/1.jpg" /> </li > <li > <img src ="img/2.jpg" /> </li > <li > <img src ="img/3.jpg" /> </li > <li > <img src ="img/4.jpg" /> </li > <li > <img src ="img/5.jpg" /> </li > </ul > <div id ="navDiv" > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > </div > </div > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 function move (obj, attr, target, speed, callback ) { clearInterval (obj.timer); var current = parseInt (getStyle(obj, attr)); if (current > target) { speed = -speed; } obj.timer = setInterval (function ( ) { var oldValue = parseInt (getStyle(obj, attr)); var newValue = oldValue + speed; if ((speed < 0 && newValue < target) || (speed > 0 && newValue > target)) { newValue = target; } obj.style[attr] = newValue + "px" ; if (newValue == target) { clearInterval (obj.timer); callback && callback(); } }, 30 ); }function getStyle (obj, name ) { if (window .getComputedStyle) { return getComputedStyle(obj, null )[name]; } else { return obj.currentStyle[name]; } }
134 轮播图——教程完整 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > </title > <style type ="text/css" > * { margin : 0 ; padding : 0 ; } /* * 设置outer的样式 */ #outer { width : 520px ; height : 333px ; margin : 50px auto; background-color : greenyellow; padding : 10px 0 ; position : relative; overflow : hidden; } #imgList { list-style : none; position : absolute; /* * 每向左移动520px,就会显示到下一张图片 */ left : 0px ; } #imgList li { float : left; margin : 0 10px ; } #navDiv { position : absolute; bottom : 15px ; /*设置left值 outer宽度 520 navDiv宽度 25*5 = 125 520 - 125 = 395/2 = 197.5 * */ } #navDiv a { float : left; width : 15px ; height : 15px ; background-color : red; margin : 0 5px ; opacity : 0.5 ; filter : alpha (opacity=50 ); } #navDiv a :hover { background-color : black; } </style > <script type ="text/javascript" src ="js/tools.js" > </script > <script type ="text/javascript" > window .onload = function ( ) { var imgList = document .getElementById("imgList" ); var imgArr = document .getElementsByTagName("img" ); imgList.style.width = 520 * imgArr.length + "px" ; var navDiv = document .getElementById("navDiv" ); var outer = document .getElementById("outer" ); navDiv.style.left = (outer.offsetWidth - navDiv.offsetWidth) / 2 + "px" ; var index = 0 ; var allA = document .getElementsByTagName("a" ); allA[index].style.backgroundColor = "black" ; /* 点击超链接切换到指定的图片 点击第一个超链接,显示第一个图片 点击第二个超链接,显示第二个图片 * */ for (var i = 0 ; i < allA.length; i++) { allA[i].num = i; allA[i].onclick = function ( ) { clearInterval (timer); index = this .num; /* * 第一张 0 0 * 第二张 1 -520 * 第三张 2 -1040 */ setA(); move(imgList, "left" , -520 * index, 20 , function ( ) { autoChange(); }); }; } autoChange(); function setA ( ) { if (index >= imgArr.length - 1) { index = 0; imgList.style.left = "0px" ; } for (var i = 0 ; i < allA.length; i++) { allA[i].style.backgroundColor = "" ; } allA[index].style.backgroundColor = "black" ; }; var timer; function autoChange ( ) { timer = setInterval (() => { index++; index %= imgArr.length; move(imgList, "left" , -520 * index, 30 , function ( ) { setA(); }); }, 2000) } }; </script > </head > <body > <div id ="outer" > <ul id ="imgList" > <li > <img src ="img/1.jpg" /> </li > <li > <img src ="img/2.jpg" /> </li > <li > <img src ="img/3.jpg" /> </li > <li > <img src ="img/4.jpg" /> </li > <li > <img src ="img/5.jpg" /> </li > <li > <img src ="img/1.jpg" /> </li > </ul > <div id ="navDiv" > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > <a href ="javascript:;" > </a > </div > </div > </body > </html >
137 类的操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 类的操作</title > <style > .b1 { width : 100px ; height : 100px ; background-color : #8080ff ; } .b2 { width : 50px ; height : 50px ; background-color : lightcoral; } .b3 { border-radius : 20% ; } </style > <script > window .onload = function ( ) { var btn01 = document .getElementById("btn01" ); var box = document .getElementById("box" ); btn01.onclick = function ( ) { /* 通过sytle属性来修改元素的样式,每修改一个样式,浏览器都需要重新渲染一次页面 这样的执行性能较差,而且这种形式当我们要修改多个样式时,也不太方便,还存在代码耦合问题,所以不建议这样修改样式 box.style.background = "cyan" ; box.style.height = "300px" ; box.style.width = "300px" ; */ /* 一行代码修改多个样式 我们希望一行代码修改多个样式 */ /* 我们可以通过修改元素的class 属性来间接的修改样式 这样一来,我们只需要修改一次,既可以同时修改多个样式,此时浏览器只需要重新渲染页面一次,性能较高,并且这种方式表现和行为进一步分离 但是存在问题: .b1 { width: 100px; height: 100px; background-color: #8080ff; } .b2 { height: 50px; background-color: lightcoral; } b2覆盖b1后,width效果会消失 */ addClass(box, "b3" ); toggleClass(box, "b2" ); } } function addClass (obj, cn ) { /* 定义一个函数,用来向一个元素添加指定的class 属性值 参数: obj:要添加class 属性的元素 cn:要添加的class 值 */ if (hasClass(obj, cn)) { obj.className += " " + cn; } } function hasClass (obj, cn ) { var reg = new RegExp ("\\b" + cn + "\\b" ); if (reg.test(obj.className)) { return false ; } else { return true ; } } function deleteClass (obj, cn ) { /* 删除一个元素中指定的class 属性值 */ var reg = new RegExp ("\\b" + cn + "\\b" ); obj.className = obj.className.replace(reg, "" ); } function toggleClass (obj, cn ) { /* toggleClass可以用来切换一个类 如果元素中有该类,则删除 如果元素中没有该类则添加 */ if (hasClass(obj, cn)) { addClass(obj, cn); } else { deleteClass(obj, cn); } console .log("d" ); } </script > </head > <body > <button id ="btn01" > 修改box样式</button > <div id ="box" class ="b1" > </div > </body > </html >
138 二级菜单 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 二级菜单</title > <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > 二级菜单</title > <style type ="text/css" > * { margin : 0 ; padding : 0 ; list-style-type : none; } a , img { border : 0 ; text-decoration : none; } body { font : 12px /180% Arial, Helvetica, sans-serif, "新宋体" ; } </style > <link rel ="stylesheet" href ="./css/sdmenu.css" > <script src ="./js/tools.js" > </script > <script > window .onload = function ( ) { /* 我们的每一个菜单都是一个div 当div具有collapsed这个类时,div就是折叠状态 当div没有这个类时,div就是展开状态 */ /* 点击菜单,切换菜单状态 */ var menuSpan = document .querySelectorAll(".menuSpan" ); var openDiv = menuSpan[0 ].parentNode; for (var i = 0 ; i < menuSpan.length; i++) { menuSpan[i].onclick = function ( ) { var parentDiv = this .parentNode; toggleMenu(parentDiv); if (openDiv != parentDiv && hasClass(openDiv, "collapsed" )) { /* 为了可以统一处理动画的过渡效果,我们希望在这将addClass改为toggleClass 此处toggleClass()不需要有移除功能 */ toggleMenu(openDiv); } openDiv = parentDiv; }; } /* 切换菜单后的折叠拉伸效果 */ function toggleMenu (obj ) { var begin = obj.offsetHeight; toggleClass(obj, "collapsed" ); var end = obj.offsetHeight; /* 动画效果就是将高度从begin向end过渡 将元素的高度重置为begin */ obj.style.height = begin + "px" ; move(obj, "height" , end, 10 , function ( ) { obj.style.height = "" ; }); } } </script > </head > <body > <div id ="my_menu" class ="sdmenu" > <div > <span class ="menuSpan" > 在线工具</span > <a href ="#" > 图像优化</a > <a href ="#" > 收藏夹图标生成器</a > <a href ="#" > 邮件</a > <a href ="#" > htaccess密码</a > <a href ="#" > 梯度图像</a > <a href ="#" > 按钮生成器</a > </div > <div class ="collapsed" > <span class ="menuSpan" > 支持我们</span > <a href ="#" > 推荐我们</a > <a href ="#" > 链接我们</a > <a href ="#" > 网络资源</a > </div > <div class ="collapsed" > <span class ="menuSpan" > 合作伙伴</span > <a href ="#" > JavaScript工具包</a > <a href ="#" > CSS驱动</a > <a href ="#" > CodingForums</a > <a href ="#" > CSS例子</a > </div > <div class ="collapsed" > <span class ="menuSpan" > 测试电流</span > <a href ="#" > Current or not</a > <a href ="#" > Current or not</a > <a href ="#" > Current or not</a > <a href ="#" > Current or not</a > </div > </div > </body > </html > </head > <body > </body > </html >
140 JSON 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > JSON</title > <script > /* JSON - JS中的对象只有JS自己认识,其他语言不认识 - JSON 就是一个特殊格式的字符串,这个字符串可以被任意语言识别,并且可以转换为任意语言中的对象,JSON 在开发中主要用来进行数据的交互 - JSON JavaScript Object Notation对象表示法 - JSON 和JS对象的格式一致,只不过JSON 字符串中的属性名必须加双引!!! - 其他的和JS语法一致 - JSON 分类: - 数组{} - 对象[] - JSON 中允许的值 - 字符串 - 数值 - 对象,普通对象,不能时函数 - null - 数组 - 布尔值 */ var obj = '{"name":"ycy","age":18,"gender":"girl"}' ; var obj2 = { name : "ycy" , age : 18 , gender : "girl" }; var arr = '[1,2,3,4,"hello",true]' ; /* 将JSON 字符串转换为JS中的对象 在JS中,为我们提供了一个工具类,就叫JSON 这个对象可以帮助我们将一个JS对象转化为JSON 格式,也可以将一个JSON 格式对象转化为JS对象 JSON .parse() - 可以将JSON 字符串转换为JS对象 - 需要一个JSON 字符串作为对象,会将该字符串转换为JS对象后返回 JSON .stringify() - 可以将一个JS对象转换为JSON 字符串 - 需要一个JS对象作为参数,会返回一个JSON 字符串 JSON 这个对象在IE7及其以下不支持 */ var o = JSON .parse(obj); console .log(o); var o2 = JSON .parse(arr); console .log(o2); var json1 = JSON .stringify(obj2); console .log(json1); </script > <style > </style > </head > <body > </body > </html >
兼容IE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > JSON</title > <script src ="./js/json2.js" > </script > <script > var obj = '({"name":"ycy","age":18,"gender":"girl"})' ; /* eval () - 这个函数可以用来执行一段字符串形式的JS代码,并将执行结果返回 - 如果使用eval ()执行的字符串中含有{},它会将{}当做代码块,如果不希望将其当做代码块解析,则需要在字符串前后各加一个括号 - eval ()这个函数功能强大,可以直接执行一个字符串中的JS代码,但是在开发中尽量不要使用,首先性能差,其次有安全隐患 */ var obj = eval ('(' + obj + ')' ); console .log(obj); </script > <style > </style > </title > </head > <body > </body > </html >
JavaScript高级 基础深入总结 02 基本数据类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 01_数据类型</title > </head > <body > <script type ="text/javascript" > var a console .log(a, typeof a, a === undefined ) console .log(a === typeof a) a = 3 console .log(typeof a === 'number' ) a = 'atguigu' console .log(typeof a === 'string' ) a = true console .log(typeof a === 'boolean' ) a = null console .log(a === null ) console .log(typeof a) console .log('--------------------------------' ) var b1 = { b2: [2 , 'abc' , console .log], b3: function ( ) { console .log('b3()' ) } } console .log(b1 instanceof Object , typeof b1) console .log(b1.b2 instanceof Array , typeof b1.b2) console .log(b1.b3 instanceof Function , typeof b1.b3) console .log(typeof b1.b2[2 ]) console .log(b1.b2[2 ]('abc' )) </script > </body > </html >
03 相关问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 01_相关问题</title > </head > <body > <script type ="text/javascript" > function Person (name, age ) { this .name = name this .age = age } var p = new Person("张加林" , 20 ) /* 最好不要直接使用Person("张加林" , 20 )调用构造函数 */ console .log(p) var a1 var a2 = null console .log(a1, a2) var a3 = null var name = 'Tom' var age = 12 a3 = { name: name, age: age } a3 = null </script > </body > </html >
04 数据、变量、内存 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
05 相关问题
关于引用变量赋值问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <body > <script type ="text/javascript" > var obj1 = {} var obj2 = obj1 obj2.name = 'Tom' console .log(obj1.name) function f1 (obj ) { obj.age = 12 } f1(obj2) console .log(obj1.age) var obj3 = { name : 'Tom' } var obj4 = obj3 obj3 = { name : 'JACK' } console .log(obj4.name) function f2 (obj ) { obj = { name : 'Bob' } } f2(obj4) console .log(obj4.name) console .log("----------------" ) var a = { name : 'zjl' } var b = { name : 'zjl' } a.name = 'ycy' console .log(b.name); </script > </body >
易错点 1 2 3 4 5 6 7 8 9 a = { name : 'zjl' }function fun1 (obj ) { obj = { name : "羽川翼" } console .log(a.name) console .log(obj.name) } fun1(a)console .log(a)
调用函数时,将数据a赋值给形参obj,此时a和obj都指向堆中的同一个{ name: 'zjl' }
,在函数内部修改obj指向的对象,由:2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象 ,所以a仍然指向{ name: 'zjl' }
,而obj指向{ name: "羽川翼" }
,obj只是具有局部作用域,而且函数执行完成后会被销毁。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 a = 3 function fun1 (v ) { v = 666 console .log(a) } fun1(a)console .log(a) function fun2 (a ) { a = 666 console .log(a) } fun2(a)console .log(a)
06 相关问题2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <body > <script type ="text/javascript" > function f (a ) { console .log(a) } var n = 4 f(n) function f2 (a ) { a.name = 'atguigu' } n = {} f2(n) console .log(n.name) </script > </body >
内存管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <body > <script type ="text/javascript" > var obj = {} obj = null function fn ( ) { var a = 3 var b = {} } fn() </script > </body >
07 对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <body > <script type ="text/javascript" > var p = { name: 'Tom' , age: 12, setName: function (name ) { this .name = name }, setAge: function (age ) { this .age = age } } console .log(p.name, p['age' ]) p.setName('Jack' ) p['age' ](23 ) console .log(p['name' ], p.age) </script > </body >
属性名相关问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <body > <script type ="text/javascript" > var p = {} p['content-type' ] = 'text/json' var prop = 'xxx' var value = 123 p[prop] = value console .log(p['content-type' ], p[prop]) </script > </body >
08 函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <body > <script type ="text/javascript" > /* 函数也是对象 */ function fn ( ) { } console .log(fn instanceof Object ) console .log(fn.prototype) console .log(fn.call) fn.t1 = 'atguigu' fn.t2 = function ( ) { console .log('t2() ' + this .t1) } fn.t2() </script > </body >
09 回调函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <body > <button id ="btn" > 测试点击事件</button > <script type ="text/javascript" > var btn = document .getElementById('btn' ) btn.onclick = function ( ) { alert(this .innerHTML) } setInterval (function ( ) { alert('到点啦!' ) }, 2000) </script > </body >
10 IIFE(立即调用函数表达式 / 匿名函数自调用) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script type ="text/javascript" > (function (i ) { var a = 4 function fn ( ) { console .log('fn ' , i+a) } fn() })(3)</script >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <body > <script type ="text/javascript" > (function (i ) { var a = 4 function fn ( ) { console .log('fn ' , i + a) } fn() })(3) var a = 4 console .log(a) ; (function ( ) { var a = 1 function test ( ) { console .log(++a) } window .$ = function ( ) { return { test: test } } })() $().test() console .log(a)
11 函数中的this 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 <body > <script type ="text/javascript" > function Person (color ) { console .log(this ) this .color = color; this .getColor = function ( ) { console .log(this ) return this .color; }; this .setColor = function (color ) { console .log(this ) this .color = color; }; } Person("red" ); var p = new Person("yello" ); p.getColor(); var obj = {}; p.setColor.call(obj, "black" ); var test = p.setColor; test(); function fun1 ( ) { function fun2 ( ) { console .log(this ); } fun2(); } fun1(); </script > </body >
12 分号问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <script type ="text/javascript" > var a = 3 ; (function ( ) { }) /* 错误理解: 将3看成是函数调用 var a = 3 (function ( ) { }) */ var b = a ;[1 , 3 , 5 ].forEach(function (item ) { console .log(item) }) /* 错误理解: a = b[5 ].forEach(function (e ) { console .log(e) })</script >
函数高级 15 函数的prototype
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <body > <script type ="text/javascript" > console .log(Date .prototype, typeof Date .prototype) function fn ( ) { } console .log(fn.prototype, typeof fn.prototype) console .log(Date .prototype.constructor === Date ) console .log(fn.prototype.constructor === fn) function F ( ) { } F.prototype.age = 12 F.prototype.setAge = function (age ) { this .age = age } var f = new F() console .log(f.age) f.setAge(23) console .log(f.age) </script > </body >
16 显式原型和隐式原型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 02_显式原型与隐式原型</title > </head > <body > <script type ="text/javascript" > function Fn ( ) { } var fn = new Fn() console .log(Fn.prototype, fn.__proto__) </script > </body > </html >
17 原型链 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <body > <script type ="text/javascript" > function Fn ( ) { this .test1 = function ( ) { console .log('test1()' ) } } console .log(Fn.prototype) Fn.prototype.test2 = function ( ) { console .log('test2()' ) } var fn = new Fn() fn.test1() fn.test2() console .log(fn.toString()) console .log(fn.test3) fn.test3() </script > </body >
var Foo = new Function()
,所以所有函数都有隐式原型属性,指向Function的显示原型。
注意:
function Function()
实例对象的显示原型和隐式原都型指向Function.prototype
https://www.processon.com/view/link/619c9b56e401fd183dbdee8f
18 原型链补充 函数的显式原型指向的对象默认是空Object对象(但是Object不满足)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <body > <script > function Fn ( ) { this .test1 = function ( ) { console .log('test1()' ) } } /* 1. 函数的显式原型指向的对象默认是空Object 实例对象(但是Object 不满足) */ console .log(Fn.prototype instanceof Object ) console .log(Object .prototype instanceof Object ) console .log(Function .prototype instanceof Object ) /* 2. 所有函数都是Function 的实例对象(包含Function 本身) */ console .log(Function .__proto__ === Function .prototype) /* 2. Object 的原型对象是原型链的尽头 */ console .log(Object .prototype.__proto__) </script > </body >
19 原型链属性问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <body > <script > function Fn ( ) { } Fn.prototype.a = 'xxx' var fn1 = new Fn() console .log(fn1.a, fn1) var fn2 = new Fn() fn2.a = 'yyy' console .log(fn1.a, fn2.a, fn2) </script > </body >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <body > <script type ="text/javascript" > function Person (name, age ) { this .name = name; this .age = age; } Person.prototype.setName = function (name ) { this .name = name; } Person.prototype.sex = '男' ; var p1 = new Person('Tom' , 12 ) p1.setName('Jack' ) console .log(p1.name, p1.age, p1.sex) p1.sex = '女' console .log(p1.name, p1.age, p1.sex) var p2 = new Person('Bob' , 23 ) console .log(p2.name, p2.age, p2.sex) </script > </body >
20 探索instanceof
instanceof是如何判断的?
Function是通过new自己产生的实例
案例一 1 2 3 4 function Foo ( ) { }var f1 = new Foo();console .log(f1 instanceof Foo); console .log(f1 instanceof Object );
案列二 1 2 3 4 5 6 7 console .log(Object instanceof Function ); console .log(Object instanceof Object ); console .log(Function instanceof Function ); console .log(Function instanceof Object ); function Foo ( ) {}console .log(Object instanceof Foo);
22 变量提升与函数提升
1 2 3 console .log(a1) var a1 = 3
1 2 3 4 5 6 7 a2() var a1 = 3 function a2 ( ) { console .log('a2()' ) }
易错 1 2 3 4 5 f3() var f3 = function ( ) { console .log('f3()' ) }
23 执行上下文
代码分类(位置)
全局执行上下文
在执行全局代码前将window确定为全局执行上下文
对全局数据进行预处理
var定义的全局变量(直接a = 1是不行的,不会被预处理)==>undefined, 添加为window的属性
function声明的全局函数==>赋值(fun), 添加为window的方法
this==>赋值(window)
开始执行全局代码
函数执行上下文
在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象
对局部数据进行预处理
形参变量==>赋值(实参)==>添加为执行上下文的属性
arguments==>赋值(实参列表), 添加为执行上下文的属性
var定义的局部变量==>undefined, 添加为执行上下文的属性
function声明的函数 ==>赋值(fun), 添加为执行上下文的方法
this==>赋值(调用函数的对象)
开始执行函数体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script type ="text/javascript" > var a1 = 1 function fn ( ) { console .log(a1) console .log(a2) a3() console .log(this ) console .log(arguments ) var a2 = 3 function a3 ( ) { console .log('a3()!!' ) } } fn(2, 3)</script >
24 执行上下文栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <body > <script type ="text/javascript" > var a = 10 var bar = function (x ) { var b = 5 foo(x + b) } var foo = function (y ) { var c = 5 console .log(a + c + y) } bar(10 ) </script > </body >
25 上下文面试题 第一题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <body > <script type ="text/javascript" > console .log('global begin: ' + i) var i = 1 foo(1); function foo (i ) { if (i == 4) { return ; } console .log('foo() begin:' + i); foo(i + 1 ) console .log('foo() end:' + i); } console .log('global end: ' + i) </script > </body >
第二题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <body > <script type ="text/javascript" > /* 测试题1: 函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被变量赋值后覆盖 */ function a ( ) {} var a; console .log(typeof a) /* 测试题2: 变量预处理, in操作符 */ if (!(b in window )) { var b = 1 ; } console .log(b) /* 测试题3: 函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被变量赋值后覆盖,这里是函数被赋值操作覆盖了 */ var c = 1 function c (c ) { console .log(c) var c = 3 } c(2 ) </script > </body >
026 复习 JS是基于原型对象的继承,JAVA和Python是基于类的继承。
027 作用域与作用域链
区别1
全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定,而不是在函数调用时
全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建
函数执行上下文环境是在调用函数时, 函数体代码执行之前创建
区别2
作用域是静态的, 只要函数定义好了就一直存在, 且不会再变化
上下文环境是动态的, 调用函数时创建, 函数调用结束时上下文环境就会被释放
联系
执行上下文环境(对象)是从属于所在的作用域
全局上下文环境==>全局作用域
函数上下文环境==>对应的函数使用域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <body > <script type ="text/javascript" > var a = 2 ; function fn1 ( ) { var b = 3 ; function fn2 ( ) { var c = 4 ; console .log(c); console .log(b); console .log(a); console .log(d); } fn2(); } fn1(); </script > </body >
注意:函数作用域内读取不到指定变量会抛异常!!!
28 面试题 第一题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <script type ="text/javascript" > /* 问题: 结果输出多少? 作用域在函数定义时就已经确定 */ var x = 10 ; function fn ( ) { console .log(x); } function show (f ) { var x = 20 ; f(); } show(fn) </script >
第二题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <script type ="text/javascript" > /* 说说它们的输出情况 1.ƒ () { console .log(fn) } 2. Uncaught ReferenceError : fn2 is not defined at Object .fn2 应该改为:this .fn2 */ var fn = function ( ) { console .log(fn) } fn() var obj = { fn2: function ( ) { console .log(fn2) } } obj.fn2()</script >
29 循环遍历加监听 错误代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <body > <button > 测试1</button > <button > 测试2</button > <button > 测试3</button > <script type ="text/javascript" > var btns = document .getElementsByTagName('button' ) for (var i=0 ,length=btns.length;i<length;i++) { var btn = btns[i] btn.onclick = function ( ) { alert('第' +(i+1 )+'个' ) } } </script > </body >
将i保存为下标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <body > <button > 测试1</button > <button > 测试2</button > <button > 测试3</button > <script > var btns = document .getElementsByTagName("button" ) for (var i = 0 ; i < btns.length; i++) { btns[i].index = i + 1 btns[i].onclick = function ( ) { alert('这是第' + this .index + '个button' ) } } </script > </body >
利用闭包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <body > <button > 测试1</button > <button > 测试2</button > <button > 测试3</button > <script type ="text/javascript" > var btns = document .getElementsByTagName('button' ) for (var i = 0 , length = btns.length; i < length; i++) { (function (i ) { var btn = btns[i] btn.onclick = function ( ) { alert('第' + (i + 1 ) + '个' ) } })(i) } </script > </body >
30 理解闭包 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <body > <script type ="text/javascript" > function fn1 ( ) { var a = 3 function fn2 ( ) { console .log(a) } return fn2 } fn1() </script > </body >
31 常见的闭包 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <body > <script type ="text/javascript" > function fn1 ( ) { var a = 2 function fn2 ( ) { a++ console .log(a) } return fn2 } var f = fn1() f() f() function showMsgDelay (msg, time ) { setTimeout (function ( ) { console .log(msg) }, time) } showMsgDelay('hello' , 1000 ) </script > </body >
32 闭包的作用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <body > <script type ="text/javascript" > function fun1 ( ) { var a = 3 ; function fun2 ( ) { a++; console .log(a); } return fun2; } var f = fun1(); f(); f(); </script > </body >
33 闭包的生命周期 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <body > <script type ="text/javascript" > function fun1 ( ) { var a = 3 ; function fun2 ( ) { a++; console .log(a); } return fun2; } var f = fun1(); f(); f(); f = null </script > </body >
34 闭包应用 自定义JS模块 例一 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function coolModule ( ) { var msg = 'atguigu' var names = ['I' , 'Love' , 'you' ] function doSomething ( ) { console .log(msg.toUpperCase()) } function doOtherthing ( ) { console .log(names.join(' ' )) } return { doSomething: doSomething, doOtherthing: doOtherthing } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <body > <script type ="text/javascript" src ="05_coolModule.js" > </script > <script type ="text/javascript" > var module = coolModule() module .doSomething() module .doOtherthing() </script > </body >
例二 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (function (window ) { var msg = 'atguigu' var names = ['I' , 'Love' , 'you' ] function a ( ) { console .log(msg.toUpperCase()) } function b ( ) { console .log(names.join(' ' )) } window .coolModule2 = { doSomething: a, doOtherthing: b } })(window )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <body > <script type ="text/javascript" src ="05_coolModule2.js" > </script > <script type ="text/javascript" > coolModule2.doSomething() coolModule2.doOtherthing()</script > </body >
35 闭包缺点——内存溢出和内存泄漏 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <body > <script type ="text/javascript" > function fn1 ( ) { var a = 2 ; function fn2 ( ) { a++; console .log(a); } return fn2; } var f = fn1(); f(); f(); f = null </script > </body >
内存溢出
一种程序运行出现的错误
当程序运行需要的内存超过了剩余的内存时,就抛出内存溢出的错误
内存泄漏
占用的内存没有及时释放
内存泄漏积累多了容易导致内存溢出
常见内存泄漏
意外的全局变量
没有及时清理的计时器或回调函数
闭包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <body > <script > var obj = {}; for (var i = 0 ; i < 10000 ; i++) { obj[i] = new Array (100000000 ); console .log("--------------" ); } function fn ( ) { a = 3 console .log(a) } fn() var id = setInterval (function ( ) { console .log('------------' ) }, 10000) function fn1 ( ) { var a = 1 function fn2 ( ) { a++ console .log(a) } return fn2 } var f = fn1() </script > </body >
36 面试题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <script type ="text/javascript" > /* 说说它们的输出情况 */ var name = "The Window" ; var object = { name: "My Object" , getNameFunc: function ( ) { return function ( ) { return this .name; }; } }; console .log(object.getNameFunc()()); var name2 = "The Window" ; var object2 = { name2: "My Object" , getNameFunc: function ( ) { var that = this ; return function ( ) { return that.name2; }; } }; console .log(object2.getNameFunc()()); </script >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <script type ="text/javascript" > /* 说说它们的输出情况 */ function fun (n, o ) { console .log(o) return { fun: function (m ) { return fun(m, n) } } } var a = fun(0 ) a.fun(1) a.fun(2) a.fun(3 ) var b = fun(0 ).fun(1 ).fun(2 ).fun(3 ) var c = fun(0 ).fun(1 ) c.fun(2) c.fun(3 ) </script >
37 对象创建模式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <body > <script type ="text/javascript" > /* 一个人: name:"Tom" , age : 12 */ var p = new Object () p.name = 'Tom' p.age = 12 p.setName = function (name ) { this .name = name } p.setaAge = function (age ) { this .age = age } console .log(p) </script > </body >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <script type ="text/javascript" > var p = { name: 'Tom' , age: 23, setName: function (name ) { this .name = name } } console .log(p.name, p.age) p.setName('JACK' ) console .log(p.name, p.age) var p2 = { name: 'BOB' , age: 24, setName: function (name ) { this .name = name } }</script > </body >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <body > <script type ="text/javascript" > function createPerson (name, age ) { var p = { name: name, age: age, setName: function (name ) { this .name = name } } return p } var p1 = createPerson('Tom' , 12 ) var p2 = createPerson('JAck' , 13 ) console .log(p1) console .log(p2) </script > </body >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <body > <script type ="text/javascript" > function Person (name, age ) { this .name = name this .age = age this .setName = function (name ) { this .name = name } } var p1 = new Person('Tom' , 12 ) var p2 = new Person('Tom2' , 13 ) console .log(p1, p1 instanceof Person) </script > </body >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <body > <script type ="text/javascript" > function Person (name, age ) { this .name = name this .age = age } Person.prototype.setName = function (name ) { this .name = name } var p1 = new Person('Tom' , 12 ) var p2 = new Person('JAck' , 23 ) p1.setName('TOM3' ) console .log(p1) Person.prototype.setAge = function (age ) { this .age = age } p1.setAge(23) console .log(p1.age) Person.prototype = {} p1.setAge(34) console .log(p1) var p3 = new Person('BOB' , 12 ) p3.setAge(12)</script > </body >
38 原型链继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <body > <script type ="text/javascript" > function Supper ( ) { this .superProp = 'The super prop' } Supper.prototype.showSupperProp = function ( ) { console .log(this .superProp) } function Sub ( ) { this .subProp = 'The sub prop' } Sub.prototype = new Supper() Sub.prototype.constructor = Sub Sub.prototype.showSubProp = function ( ) { console .log(this .subProp) } var sub = new Sub() sub.showSubProp() sub.showSupperProp()</script > </body >
https://www.processon.com/view/link/619e3f107d9c083e98aafa1b
39 组合继承 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 02_借用构造函数继承</title > </head > <body > <script type ="text/javascript" > function Person (name, age ) { this .name = name this .age = age } function Student (name, age, price ) { Person.call(this , name, age) this .price = price } var s = new Student('Tom' , 20 , 12000 ) console .log(s.name, s.age, s.price) </script > </body > </html >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <body > <script type ="text/javascript" > function Person (name, age ) { this .name = name this .age = age } Person.prototype.setName = function (name ) { this .name = name } function Student (name, age, price ) { Person.call(this , name, age) this .price = price } Student.prototype = new Person() Student.prototype.constructor = Student Student.prototype.setPrice = function (price ) { this .price = price } var s = new Student('Tom' , 12 , 10000 ) s.setPrice(11000) s.setName('Bob' ) console .log(s) console .log(s.constructor) </script > </body >
40 复习 new一个对象背后做了什么?
创建一个空对象
给对象设置__proto__,值为构造函数对象的prototype属性值,this.__proto__ = this.prototype
执行构造函数体(给对象添加属性和方法)
42 进程与线程 1.进程:程序的一次执行, 它占有一片独有的内存空间
2.线程: CPU的基本调度单位, 是程序执行的一个完整流程
3.进程与线程
一个进程中一般至少有一个运行的线程: 主线程
一个进程中也可以同时运行多个线程, 我们会说程序是多线程运行的
一个进程内的数据可以供其中的多个线程直接共享
多个进程之间的数据是不能直接共享的
4.浏览器运行是单进程还是多进程?
5.如何查看浏览器是否是多进程运行的呢?
6.浏览器运行是单线程还是多线程?
7.JS是单线程还是多线程?
js是单线程运行的
但使用H5中的 Web Workers可以多线程运行
43 浏览器内核
什么是浏览器内核?
不同的浏览器可能不太一样
Chrome, Safari: webkit
firefox: Gecko
IE: Trident
360,搜狗等国内浏览器: Trident + webkit
内核由很多模块组成
主线程
html,css文档解析模块 : 负责页面文本的解析
dom/css模块 : 负责dom/css在内存中的相关处理
布局和渲染模块 : 负责页面的布局和效果的绘制
分线程
定时器模块 : 负责定时器的管理
网络请求模块 : 负责服务器请求(常规/Ajax)
事件响应模块 : 负责事件的管理
44 定时器思考 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <body > <button id ="btn" > 启动定时器</button > <script type ="text/javascript" > document .getElementById('btn' ).onclick = function ( ) { var start = Date .now() console .log('启动定时器' ) setTimeout (function ( ) { console .log('定时器执行了: ' , Date .now()-start) }, 100) for (var i = 0 ; i < 1000000000 ; i++) { } console .log('完成长时间工作' , Date .now()-start) }</script > </body >
45 JS是单线程执行的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <body > <script type ="text/javascript" > setTimeout (function ( ) { console .log('timeout 3' ) alert('3333' ) }, 3000) setTimeout (function ( ) { console .log('timeout 2' ) alert('2222' ) }, 2000) setTimeout (function ( ) { console .log('timeout 0' ) alert('0000' ) }, 0) console .log('alert之前' ) alert('提示...' ) console .log('alert之后' ) </script > </body >
46 事件循环模型
事件轮询:从任务队列中循环取出回调函数放入执行栈中处理(一个接一个)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <body > <button id ="btn" > 测试</button > <script type ="text/javascript" > function fn1 ( ) { console .log('fn1()' ) } fn1() document .getElementById('btn' ).onclick = function ( ) { console .log('处理点击事件' ) } setTimeout (function ( ) { console .log('到点了' ) }, 2000) function fn2 ( ) { console .log('fn2()' ) } fn2()</script > </body >
47 Web Workers多线程
js是单线程的,但是浏览器是多线程的,js碰到异步任务,并没有自己处理,而是交给了浏览器的其他线程。
Web Workers 是 HTML5 提供的一个javascript多线程解决方案
我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面
但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质
使用:
创建在分线程执行的js文件
在主线程中的js中发消息并设置回调
缺点:
慢
不能跨域加载JS
worker内代码不能访问DOM(更新UI)
不是每个浏览器都支持这个新特性
H5规范提供了js分线程的实现, 取名为: Web Workers
相关API
Worker: 构造函数, 加载分线程执行的js文件
Worker.prototype.onmessage: 用于接收另一个线程的回调函数
Worker.prototype.postMessage: 向另一个线程发送消息
work.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function fibonacci (n ) { return n <= 2 ? 1 : fibonacci(n - 1 ) + fibonacci(n - 2 ); }console .log(this );var onmessage = function (event ) { var number = event.data; console .log("分线程接受主线程发送的数据" + number); var result = fibonacci(number); postMessage(result); console .log("分线程向主线程返回数据:" + result); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <body > <input type ="text" placeholder ="数值" id ="number" > <button id ="btn" > 计算</button > <script > var input = document .getElementById("number" ) document .getElementById("btn" ).onclick = function ( ) { var number = input.value; var worker = new Worker('work.js' ) worker.onmessage = function (event ) { console .log('主线程接收分线程返回的数据:' + event.data) alert(event.data) } worker.postMessage(number) console .log('主线程向分线程发送数据:' + number) } </script > </body >
补漏 原型链+this 1 2 3 4 5 6 7 8 9 10 11 12 13 function Person (name, age, gender ) { this .name = name; this .age = age; this .gender = gender; } Person.prototype.getName = function ( ) { console .log("this" ,this instanceof Person) return this .name; }let p = new Person("张加林" , 20 , "male" ); p.getName();console .log(p)
以方法的形式调用时,this就是调用方法的对象,所以通过this可以访问到实例对象身上的属性。