Python开发【第十二篇】:DOM
ECMAScript是标准,javascript是实现
JS组成
JS = ECMAScript + DOM + BOM
ECMAScript(前身为欧洲计算机制造商协会)
JavaScript的语法规范
DOM(Document Object Model 的简称)
JavaScript操作网页上元素的API
BOM(Browser Object Model 的简称)
JavaScript操作浏览器部分功能的API
一. JavaScript
- Javascript 在开发中绝大多数情况是基于对象的.也是面向对象的.
#直接编写 <script> alert('hello yuan') </script> #导入文件 <script src="hello.js"></script>
一个HTML网页要做到结构、样式、行为相分离
三个常用的输出语句:
document.write(“要输出的内容”)
作用:
l 它主要是用来向body标签中输出write()小括号里面的内容
l document它表示是当前的HTML文档对象
l write在英文中是“写”的意思
l 对象是由属性与方法组成的 对象.属性与对象.方法 从视觉上面来区分属性与方法 属性不带小括号 方法带有小括号
l write它是一个输出的方法
window.alert(“要输出的内容”)
作用:
l 它主要是用来向当前的浏览器窗口中弹出一个警告提示框
l window它表示的是当前的浏览器窗口对象 window对象是js中最顶级的对象 可以省略不写
l alert在英文是“警告”的意思
n var 变量名1,变量名2 一次声明多个变量
修改变量的值
声明一个变量已经给其赋了值 然后再来修改这个变量的值!
格式:
变量名 = “新值” //给变量名重新赋一个值
//单行注释 /* 多行注释 */ //语句必须已分号结束 //声明变量名关键字:var 变量名="值" //JS属于动态类型(同一个变量可以存不同类型数据,如下) //JS的变量名可以使用_,数字,字母,$组成,不能以数字开头。 //变量名是区分大小写的,推荐使用驼峰式命名规则,保留字不能用做变量名。 var name = "zc"; var age = 29; var $ = "男"; console.log("name:",name); console.log("age:",age); console.log("$:",$);
JavaScript数据类型:
JavaScript拥有动态类型
var x; // 此时x是undefined var x = 1; // 此时x是数字 var x = "Alex" // 此时x是字符串
变量的数据类型分为:两大类、七小种
两大类:基本数据类型(标量数据类型)、复合数据类型!
基本数据类型:只能存储一个值
复合数据类型:至少存储一个值,可以存储多个值
数值(Number)
JavaScript不区分整型和浮点型,就只有一种数字类型。
var a = 12.34; var b = 20; var c = 123e5; // 12300000 var d = 123e-5; // 0.00123
还有一种NaN,表示不是一个数字(Not a Number)。
常用方法:
parseInt("123") // 返回123 parseInt("ABC") // 返回NaN,NaN属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。 parseFloat("123.456") // 返回123.456
字符串(String)
var a = "Hello" var b = "world; var c = a + b; console.log(c); // 得到Helloworld
常用方法:
方法 | 说明 |
.length | 返回长度 |
.trim() | 移除空白 |
.trimLeft() | 移除左边的空白 |
.trimRight() | 移除右边的空白 |
.charAt(n) | 返回第n个字符 |
.concat(value, ...) | 拼接 |
.indexOf(substring, start) | 子序列位置 |
.substring(from, to) | 根据索引获取子序列 |
.slice(start, end) | 切片 |
.toLowerCase() | 小写 |
.toUpperCase() | 大写 |
.split(delimiter, limit) | 分割 |
string.slice(start, stop)和string.substring(start, stop): 两者的相同点: 如果start等于end,返回空字符串 如果stop参数省略,则取到字符串末 如果某个参数超过string的长度,这个参数会被替换为string的长度 substirng()的特点: 如果 start > stop ,start和stop将被交换 如果参数是负数或者不是数字,将会被0替换 silce()的特点: 如果 start > stop 不会交换两者 如果start小于0,则切割从字符串末尾往前数的第abs(start)个的字符开始(包括该位置的字符) 如果stop小于0,则切割在从字符串末尾往前数的第abs(stop)个字符结束(不包含该位置字符) slice和substring的区别
布尔值(Boolean):
""(空字符串)、0、null、undefined、NaN都是false。
null和undefined
- null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null;
- undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。
null表示变量的值是空,undefined则表示只声明了变量,但还没有赋值。
对象(Object):
JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...此外,JavaScript 允许自定义对象。
数组
数组对象的作用是:使用单独的变量名来存储一系列的值。类似于Python中的列表。
JS中的排序(不要使用sort,鸡肋):
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
function sortNumber(a,b){
return a - b
}
var arr1 = [11, 100, 22, 55, 33, 44]
arr1.sort(sortNumber)
输出: [11, 22, 33, 44, 55, 100]
关于遍历数组中的元素,可以使用下面的方式:
var a = [10, 20, 30, 40]; for (var i=0;i<a.length;i++) { console.log(i); }
JS数据类型:
对变量或值调用 typeof 运算符将返回下列值之一:
- undefined - 如果变量是 Undefined 类型的
- boolean - 如果变量是 Boolean 类型的
- number - 如果变量是 Number 类型的
- string - 如果变量是 String 类型的
- object - 如果变量是一种引用类型或 Null 类型的
++ |
自加1运算符 |
-- |
自减1运算符 |
注意:
不管是前加加还是后加加自身都会自加1 不管是前减减还是后减减自身都会自减1
运算符分为:
算术运算符
赋值运算符
比较运算符
逻辑运算符
字符串连接运算符
三目运算符
if-else:
var a = 10; if (a > 5){ console.log("yes"); }else { console.log("no"); }
if- else if -else :
var a = 10; if (a > 5){ console.log("a > 5"); }else if (a < 5) { console.log("a < 5"); }else { console.log("a = 5"); }
switch:
var day = new Date().getDay(); switch (day) { case 0: console.log("Sunday"); break; case 1: console.log("Monday"); break; default: console.log("...")(上面case都不满足就执行这一句) }
switch中的case子句通常都会加break语句,否则程序会继续执行后续case中的语句
for:
for (var i=0;i<10;i++) { console.log(i); }
while:
var i = 0; while (i < 10) { console.log(i); i++; }
函数:
// 普通函数定义 function f1() { console.log("Hello world!"); } // 带参数的函数 function f2(a, b) { console.log(arguments); // 内置的arguments对象 console.log(arguments.length); console.log(a, b); } // 带返回值的函数 function sum(a, b){ return a + b; } sum(1, 2); // 调用函数 // 匿名函数方式 var sum = function(a, b){ return a + b; } sum(1, 2); // 立即执行函数 (function(a, b){ return a + b; })(1, 2);
ES6中允许使用“箭头”(=>)定义函数:
var f = v => v; // 等同于 var f = function(v){ return v; }
如果箭头函数不需要参数或需要多个参数,就是用圆括号代表参数部分:
var f = () => 5; // 等同于 var f = function(){return 5}; var sum = (num1, num2) => num1 + num2; // 等同于 var sum = function(num1, num2){ return num1 + num2; }
函数中的arguments参数:
function add(a,b){ console.log(a+b); console.log(arguments.length) } add(1,2) #3 #2
函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回
函数的全局变量和局部变量:
局部变量:
在JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它(该变量的作用域是函数内部)。只要函数运行完毕,本地变量就会被删除。
全局变量:
在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。
变量生存周期:
JavaScript变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
作用域:
首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层
1. 函数的调用 要往回找 函数的定义阶段
2. 首先在函数内部找 -> 内部找不到就往外找,直到找到全局为止
var city = "BeiJing"; function f() { var city = "ShangHai"; function inner(){ var city = "ShenZhen"; console.log(city); } inner(); } f(); //输出结果是? ShenZhen
var city = "BeiJing"; function Bar() { console.log(city); } function f() { var city = "ShangHai"; return Bar; } var ret = f(); ret(); // 打印结果是? BeiJing
闭包:
var city = "BeiJing"; function f(){ var city = "ShangHai"; function inner(){ console.log(city); } return inner; } var ret = f(); ret(); ShangHai
词法分析(尝试理解):
JavaScript中在调用函数的那一瞬间,会先进行词法分析。
词法分析的过程:
当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面:
1:函数参数,如果有,则将此参数赋值给AO,且值为undefined。如果没有,则不做任何操作。
2:函数局部变量,如果AO上有同名的值,则不做任何操作。如果没有,则将此变量赋值给AO,并且值为undefined。
3:函数声明,如果AO上有,则会将AO上的对象覆盖。如果没有,则不做任何操作。
函数内部无论是使用参数还是使用局部变量都到AO上找。
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); } foo(); // 问:执行foo()之后的结果是? 22
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); function age(){ console.log("呵呵"); } console.log(age); } foo();
// 执行后的结果是? ƒ age(){ console.log("呵呵"); } 22 22
词法分析过程: 1、分析参数,有一个参数,形成一个 AO.age=undefine; 2、分析变量声明,有一个 var age, 发现 AO 上面已经有一个 AO.age,因此不做任何处理 3、分析函数声明,有一个 function age(){...} 声明, 则把原有的 age 覆盖成 AO.age=function(){...}; 最终,AO上的属性只有一个age,并且值为一个函数声明 执行过程: 注意:执行过程中所有的值都是从AO对象上去寻找 1、执行第一个 console.log(age) 时,此时的 AO.age 是一个函数,所以第一个输出的一个函数 2、这句 var age=22; 是对 AO.age 的属性赋值, 此时AO.age=22 ,所以在第二个输出的是 2 3、同理第三个输出的还是22, 因为中间再没有改变age值的语句了
1. 分析(分析的函数内部变量定义过程)
1. 先看参数
2. 看有没有局部变量
3. 看有没有函数定义
2. 执行(实际执行代码)
内置对象和方法:
// JS中自定义对象 // var person = {name: '小强', age: 38}; // 在JS的对象中,键(属性)默认不用加引号;并且自动把单引号转成双引号 // console.log(person); // // 单独取对象的属性 // console.log("name:", person.name); // console.log("age:", person.age); // // // 遍历对象的属性 // for (var i in person){ // console.log(i); // console.log(person[i]); // } // Date对象 var d1 = new Date(); console.log(d1); console.log(typeof d1); console.log(d1.toLocaleString()); // 转成字符串格式的本地时间 console.log(typeof d1.toLocaleString()); // 生成指定时间的Date对象 // var d2 = new Date("2004/3/20 11:12"); // console.log(d2.toLocaleString()); // 转成字符串格式的本地时间 // console.log(d2.toUTCString()); // 转成字符串格式的UTC时间 var d2 = new Date("2018-3-11 11:12"); console.log(d2.toLocaleString()); // 转成字符串格式的本地时间 console.log(d2.toUTCString()); // 转成字符串格式的UTC时间 console.log(d2.getDate()); // 获取那一天(多少号) console.log(d2.getDay()); // 获取星期几 console.log(d2.getMonth()); // 获取月份 console.log(d2.getFullYear()); // 获取年 console.log(d2.getHours()); // 获取小时 console.log(d2.getMinutes()); // 获取分钟 console.log(d2.getSeconds()); // 获取秒 console.log(d2.getTime()); // 获取时间戳 // JSON对象 console.log("=============================="); var s = '{"name": "xiaoqiang", "age": 38}'; // 把字符串转换成JS内部的对象 var ret = JSON.parse(s); console.log(ret); console.log(typeof ret); // 把JS内部的对象转换成字符串 var s2 = JSON.stringify(ret); console.log(s2); console.log(typeof s2); // RegExp对象 --> Python re模块 // 生产 RegExp对象 var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$"); var regexpRet1 = reg1.test("xiaoqiang"); console.log(regexpRet1); var regexpRet2 = reg1.test("1xiaoqiang"); console.log(regexpRet2); console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("xiaoqiang")); console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("1xiaoqiang")); // 坑1 (正则表达式中间一定不可以有空格) console.log("============================================"); console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("xiaoqiang")); console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("1xiaoqiang")); // 坑2 // test()不传值相当于传了一个undefined进去 // 然后test()就把这个undefined当成是"undefined"来判断 console.log("============================================"); console.log(/^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test("undefined")); console.log(/^[0-9a-zA-Z][a-zA-Z0-9_]{5,11}$/.test()); console.log(/^[0-9][a-zA-Z0-9_]{5,11}$/.test(undefined)); console.log(/^[0-9][a-zA-Z0-9_]{5,11}$/.test("undefined")); // JS正则的两种模式 // 1. g 表示全局 // 2. i 忽略大小写 var ss = "Alexdashabi"; var s3 = ss.replace(/a/gi, "哈哈哈"); // 不是改变默认的字符串,而是生成了一个新的字符串 console.log(s3); // 坑3 // 当正则表达式使用了全局模式(g)的时候,并且你还让它去检测一个字符串,此时会引出来一个lastIndex // lastIndex会记住上一次匹配成功的位置,并把下一次要开始椒盐的位置记住 // console.log("==============================="); var r = /alex/g; console.log(r.test("alex")); // true console.log(r.lastIndex); // 4 console.log(r.test("alex")); // false console.log(r.lastIndex); console.log(r.test("alex")); // true console.log(r.lastIndex); console.log(r.test("alex")); // false
自定义对象:
var a = {"name": "Alex", "age": 18}; console.log(a.name); console.log(a["age"]);
遍历对象中的内容:
var a = {"name": "Alex", "age": 18}; for (var i in a){ console.log(i, a[i]); }
创建对象:
var person=new Object(); // 创建一个person对象 person.name="Alex"; // person对象的name属性 person.age=18; // person对象的age属性
注意:
ES6中提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当做键。
也就是说,Object结构提供了“字符串--值”的对应,Map结构提供了“值--值”的对应,是一种更完善的Hash结构实现。
var m = new Map(); var o = {p: "Hello World"} m.set(o, "content"} m.get(o) // "content" m.has(o) // true m.delete(o) // true m.has(o) // false map
扩展:
// 父类构造函数 var Car = function (loc) { this.loc = loc; }; // 父类方法 Car.prototype.move = function () { this.loc ++; }; // 子类构造函数 var Van = function (loc) { Car.call(this, loc); }; // 继承父类的方法 Van.prototype = Object.create(Car.prototype); // 修复 constructor Van.prototype.constructor = Van; // 扩展方法 Van.prototype.grab = function () { /* ... */ }; JavaScript面向对象之继承
Date对象:
创建date对像: //方法1:不指定参数 var d1 = new Date(); console.log(d1.toLocaleString()); //方法2:参数为日期字符串 var d2 = new Date("2004/3/20 11:12"); console.log(d2.toLocaleString()); var d3 = new Date("04/03/20 11:12"); console.log(d3.toLocaleString()); //方法3:参数为毫秒数 var d3 = new Date(5000); console.log(d3.toLocaleString()); console.log(d3.toUTCString()); //方法4:参数为年月日小时分钟秒毫秒 var d4 = new Date(2004,2,20,11,12,0,300); console.log(d4.toLocaleString()); //毫秒并不直接显示 Date对象的方法: var d = new Date(); //getDate() 获取日 //getDay () 获取星期 //getMonth () 获取月(0-11) //getFullYear () 获取完整年份 //getYear () 获取年 //getHours () 获取小时 //getMinutes () 获取分钟 //getSeconds () 获取秒 //getMilliseconds () 获取毫秒 //getTime () 返回累计毫秒数(从1970/1/1午夜)
JSON对象:
var str1 = '{"name": "Alex", "age": 18}'; var obj1 = {"name": "Alex", "age": 18}; // JSON字符串转换成对象 var obj = JSON.parse(str1); // 对象转换成JSON字符串 var str = JSON.stringify(obj1);
RegExp对象:
//RegExp对象 //创建正则对象方式1 // 参数1 正则表达式(不能有空格) // 参数2 匹配模式:常用g(全局匹配;找到所有匹配,而不是在第一个匹配后停止)和i(忽略大小写) // 用户名只能是英文字母、数字和_,并且首字母必须是英文字母。长度最短不能少于6位 最长不能超过12位。 // 创建RegExp对象方式(逗号后面不要加空格) var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$"); // 匹配响应的字符串 var s1 = "bc123"; //RegExp对象的test方法,测试一个字符串是否符合对应的正则规则,返回值是true或false。 reg1.test(s1); // true // 创建方式2 // /填写正则表达式/匹配模式(逗号后面不要加空格) var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/; reg2.test(s1); // true // String对象与正则结合的4个方法 var s2 = "hello world"; s2.match(/o/g); // ["o", "o"] 查找字符串中 符合正则 的内容 s2.search(/h/g); // 0 查找字符串中符合正则表达式的内容位置 s2.split(/o/g); // ["hell", " w", "rld"] 按照正则表达式对字符串进行切割 s2.replace(/o/g, "s"); // "hells wsrld" 对字符串按照正则进行替换 // 关于匹配模式:g和i的简单示例 var s1 = "name:Alex age:18"; s1.replace(/a/, "哈哈哈"); // "n哈哈哈me:Alex age:18" s1.replace(/a/g, "哈哈哈"); // "n哈哈哈me:Alex 哈哈哈ge:18" 全局匹配 s1.replace(/a/gi, "哈哈哈"); // "n哈哈哈me:哈哈哈lex 哈哈哈ge:18" 不区分大小写 // 注意事项1: // 如果regExpObject带有全局标志g,test()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找。 // 该属性值默认为0,所以第一次仍然是从字符串的开头查找。 // 当找到一个匹配时,test()函数会将regExpObject.lastIndex的值改为字符串中本次匹配内容的最后一个字符的下一个索引位置。 // 当再次执行test()函数时,将会从该索引位置处开始查找,从而找到下一个匹配。 // 因此,当我们使用test()函数执行了一次匹配之后,如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为 0。 // 如果test()函数再也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为 0。 var reg3 = /foo/g; // 此时 regex.lastIndex=0 reg3.test('foo'); // 返回true // 此时 regex.lastIndex=3 reg3.test('xxxfoo'); // 还是返回true // 所以我们在使用test()方法校验一个字符串是否完全匹配时,一定要加上^和$符号。 // 注意事项2(说出来你可能不信系列): // 当我们不加参数调用RegExpObj.test()方法时, 相当于执行RegExpObj.test("undefined"), 并且/undefined/.test()默认返回true。 var reg4 = /^undefined$/; reg4.test(); // 返回true reg4.test(undefined); // 返回true reg4.test("undefined"); // 返回true
RegExp(正则)
1. 两种定义方式:
1. new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$")
2. /new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$")/
2. 匹配模式
1. g 全局
2. i 忽略大小写
3. 坑
1. 正则表达式中间不能加空格
2. .test() --> .test(undefined) --> .test("undefined")
3. 全局模式下会有一个lastIndex属性
Math对象:
abs(x) 返回数的绝对值。 exp(x) 返回 e 的指数。 floor(x) 对数进行下舍入。 log(x) 返回数的自然对数(底为e)。 max(x,y) 返回 x 和 y 中的最高值。 min(x,y) 返回 x 和 y 中的最低值。 pow(x,y) 返回 x 的 y 次幂。 random() 返回 0 ~ 1 之间的随机数。 round(x) 把数四舍五入为最接近的整数。 sin(x) 返回数的正弦。 sqrt(x) 返回数的平方根。 tan(x) 返回角的正切。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #id1{ 200px; height:50px; } </style> </head> <body> <input type="text" id="id1" onclick="begin()"> <button onclick="end()">停止</button> <script> function showTime() { var current_time=new Date().toLocaleString(); var ele=document.getElementById("id1") ele.value=current_time } var clock1; function begin() { if(clock1==undefined){ showTime(); clock1=setInterval(showTime,1000) } } function end() { clearInterval(clock1); clock1=undefined } </script> </body> </html> setInterval clearInterval 时间框
#打印hello window.alert("hello") #用户选择true或false obj = window.confirm("hello word") console.log(obj) #接收用户文本内容 obj = window.prompt("please input content") console.log(obj) #open() 打开和一个新的窗口 并 进入指定网址 #参数1 什么都不填 就是打开一个新窗口. #参数2.填入新窗口的名字(一般可以不填). #参数3: 新打开窗口的参数. open('http://www.baidu.com','','width=200,resizable=no,height=100'); windows 方法例子 alert confirm prompt open 例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script> function f() { console.log("hello...") } setTimeout(f,1000) </script> </body> </html> setTimeout 点赞功能可能用到,执行一次退出
Location 对象包含有关当前 URL 的信息:
location.
reload
()
#刷新页面
location.assign(URL)
#跳转页面,相当于链接,可以回退
location.replace(newURL)
#跳转页面,覆盖当前页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <button onclick="f()">click</button> <script> function f() { location.reload() } </script> </body> </html> 刷新页面
DOM 节点 :
#根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点(NODE):
#整个文档是一个文档节点(document对象)
#每个 HTML 元素是元素节点(element 对象)
#HTML 元素内的文本是文本节点(text对象)
#每个 HTML 属性是属性节点(attribute对象)
#注释是注释节点(comment对象)
#画dom树是为了展示文档中各个对象之间的关系,用于对象的导航。
节点(自身)属性:
attributes #节点(元素)的属性节点
nodeType #节点类型
nodeValue #节点值
nodeName #节点名称
innerHTML #节点(元素)的文本值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <a href="http://www.baidu.com">zc<span>666</span>></a> <input id="txt" type="text" /> <select id="sel"> <option value="1">上海</option> <option value="2">北京</option> </select> <script> var obj = document.getElementsByTagName("a")[0]; alert(obj.innerText);#值的操作 alert(obj.innerHTML);#值的操作 var val = document.getElementById('txt').value;#标签中的值 console.log(val); obj.innerText = "123"; obj,innerHTML= "<p>123</p>"; </script> </body> </html>
导航属性:
parentElement #父节点标签元素
children #所有子标签
firstElementChild #第一个子标签元素
lastElementChild #最后一个子标签元素
nextElementtSibling #下一个兄弟标签元素
previousElementSibling #上一个兄弟标签元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div class="div1"> <p class="p1">hello p</p> <div class="div1">hello div</div> </div> <script> var ele = document.getElementsByClassName("p1")[0]; console.log(ele); console.log(ele.nodeName); console.log(ele.nodeType); console.log(ele.nodeValue); console.log(ele.innerText) </script> </body> </html> 节点(自身)属性 演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div class="div1"> <p class="p1">hello p</p> <div class="div2">hello div</div> </div> <script> var ele = document.getElementsByClassName("p1")[0]; var ele2 = ele.parentNode; #父亲标签 console.log(ele2.nodeName); var ele3 = ele.nextElementSibling; #兄弟标签 console.log(ele3.nodeName); console.log(ele3.innerHTML) </script> </body> </html> 导航属性 演示
节点查找:
直接查找
document.getElementById(“idname”)
document.getElementsByTagName(“tagname”)
document.getElementsByName(“name”)
document.getElementsByClassName(“name”)
局部查找
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="div1"> <div class="div2">i am div2</div> <div name="yuan">i am div2</div> <div id="div3">i am div2</div> <p>hello p</p> </div> <script> var div1=document.getElementById("div1"); var ele= div1.getElementsByTagName("p"); alert(ele.length); var ele2=div1.getElementsByClassName("div2"); alert(ele2.length); </script> </body> </html> 局部查找只支持两种
onclick 当用户点击某个对象时调用的事件句柄。
ondblclick 当用户双击某个对象时调用的事件句柄。
onfocus 元素获得焦点。 练习:输入框
onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange 域的内容被改变。 应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动)
onkeydown 某个键盘按键被按下。 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress 某个键盘按键被按下并松开。
onkeyup 某个键盘按键被松开。
onload 一张页面或一幅图像完成加载。
onmousedown 鼠标按钮被按下。
onmousemove 鼠标被移动。
onmouseout 鼠标从某元素移开。
onmouseover 鼠标移到某元素之上。
onmouseleave 鼠标从元素离开
onselect 文本被选中。
onsubmit 确认按钮被点击。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div onclick="alert('单击事件')">单击事件</div> <div ondblclick="alert('双击事件')">双击事件</div> <input type="text" value="请输入姓名" onfocus="enter(this)" onblur="exit(this)"> <script> function enter(self){ self.value=""; } function exit(self){ if(self.value.trim()==""){ self.value="请输入姓名"; } } </script> </body> </html> onfocus onblur 表单输入例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <script> window.onload=function () { var ele=document.getElementsByClassName("div1")[0]; console.log(ele.innerText) } </script> </head> <body> <div class="div1">hello div</div> </body> </html> onload js代码最后执行演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <select name="" class="select_pro"> <option value="1">河南省</option> <option value="2">湖南省</option> <option value="3">云南省</option> </select> <select name="" class="select_city"> </select> <script> var info={"河南省":["郑州","洛阳","开封"],"湖南省":["湘潭","长沙","岳阳"],"云南省":["大理","昆明"]} var ele=document.getElementsByClassName("select_pro")[0]; var ele_2=document.getElementsByClassName("select_city")[0]; ele.onchange=function(){ var arrs=ele.children; var sindex=this.selectedIndex; // 得到一个数字 var province=arrs[sindex].innerText; // 得到省份 var citys_arr=info[province]; console.log(citys_arr); var ele2_children=ele_2.children; // for (var j=0;j<ele2_children.length;j++){ // ele_2.removeChild(ele2_children[0]) // } ele_2.options.length=0; // 清空select的子元素 for (var i=0;i<citys_arr.length;i++){ var option=document.createElement("option"); option.innerText=citys_arr[i]; ele_2.appendChild(option); } } </script> </body> </html> onchange 二级联动省份演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .outer{ margin: 0 auto; background-color: darkgray; 80%; height: 600px; margin-top: 30px; word-spacing: -5px; } #left { display: inline-block; 100px; height: 140px; background-color: wheat; text-align: center; } #choice{ display: inline-block; height: 140px; background-color: darkolivegreen; vertical-align: top; padding:0 5px; } #choice button{ margin-top: 20px; } #right{ display: inline-block; 100px ; height: 140px; background-color: wheat; text-align: center; line-height: 140px; } </style> </head> <body> <div class="outer"> <select multiple="multiple" size="5" id="left"> <option>红楼梦</option> <option>西游记</option> <option>水浒传</option> <option>JinPingMei</option> <option>三国演义</option> </select> <span id="choice"> <button id="choose_move"> > </button><br> <button id="all_move"> >> </button> </span> <select multiple="multiple" size="10" id="right"> <option>放风筝的人</option> </select> </div> <script> var choose_move=document.getElementById("choose_move"); var all_move=document.getElementById("all_move"); var right=document.getElementById("right"); var left=document.getElementById("left"); var options=left.options; choose_move.onclick=function(){ for (var i=0; i<options.length;i++){ var option=options[i]; if(option.selected==true){ // var news=option.cloneNode(true); // console.log(news); right.appendChild(option); i--; } } }; all_move.onclick=function(){ for (var i=0; i<options.length;i++){ var option=options[i]; right.appendChild(option); i--; }; }; /* var buttons=document.getElementsByTagName("button"); for(var i=0;i<buttons.length;i++) { buttons[i].onclick = function () { for (var i = 0; i < options.length; i++) { var option = options[i]; if (this.innerText == ">") { if (option.selected == true) { // var news=option.cloneNode(true); // console.log(news); right.appendChild(option); i--; } } else { right.appendChild(option); i--; } } }; } */ </script> </body> </html> select移动
绑定事件方式:
方式一: 标签内绑定
<div id="div" onclick="foo(this)">点我呀</div> <script> function foo(self){ // 形参不能是this; console.log("点你大爷!"); console.log(self); } </script>
方式二: 标签对象.事件=function(){}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <p>PPP</p> <p>PPP</p> <p>PPP</p> <script> //绑定方式二 标签对象.事件=function(){}; var eles =document.getElementsByTagName("p"); for (var i=0;i<eles.length;i++){ eles[i].onclick=function(){ alert(789); } } </script> </body> </html>
事件介绍
事件传播
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .outer{ 200px; height: 200px; background-color: red; } .inner{ 100px; height: 100px; background-color: yellow; } </style> </head> <body> <div class="outer"> <div class="inner"></div> </div> <script> var ele=document.getElementsByClassName("outer")[0]; ele.onclick=function(){ alert(123); }; var ele2=document.getElementsByClassName("inner")[0]; ele2.onclick=function(e){ alert(456); e.stopPropagation(); } </script> </body> </html> stopPropagation 阻止外层的事件传向内层
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" id="d1"> <script> var ele=document.getElementById("d1"); ele.onkeydown=function (e) { var num=e.keyCode; var alph=String.fromCharCode(num); alert(e.keyCode+"-----"+alph) } </script> </body> </html> onkeydown 演示
onmouseout与onmouseleave事件的区别:
#1.不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。
#2.只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #container{ 300px; background-color: purple; text-align: center; } #title{ line-height: 50px; } #list{ display: none; } #list div{ line-height: 50px; } #list .item1{ background-color: green; } #list .item2{ background-color: yellow; } #list .item3{ background-color: blue; } </style> </head> <body> <div id="container"> <div id="title">mouseout演示</div> <div id="list"> <div class="item1">111</div> <div class="item2">222</div> <div class="item3">333</div> </div> </div> <script> var container=document.getElementById("container"); var list=document.getElementById("list"); var title=document.getElementById("title"); title.onmouseover=function () { list.style.display="block" } container.onmouseleave=function(){ list.style.display="none"; }; </script> </body> </html>
onsubmit:
当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.
Event 对象:
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数.我们获得仅仅需要接收一下即可.
比如onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就时KeyCode;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> window.onload=function(){ //阻止表单提交方式1(). //onsubmit 命名的事件函数,可以接受返回值. 其中返回false表示拦截表单提交.其他为放行. var ele=document.getElementById("form"); ele.onsubmit=function(event) { // alert("验证失败 表单不会提交!"); // return false; // 阻止表单提交方式2 event.preventDefault(); ==>通知浏览器不要执行与事件关联的默认动作。 alert("验证失败 表单不会提交!"); event.preventDefault(); } }; </script> </head> <body> <form id="form"> <input type="text"/> <input type="submit" value="点我!" /> </form> </body> </html> 阻止事件发生 两种演示
节点操作:
创建节点:
createElement(标签名) :创建一个指定名称的元素。 例:var tag=document.createElement(“input") tag.setAttribute('type','text');
添加节点:
追加一个子节点(作为最后的子节点)
somenode.appendChild(newnode)
把增加的节点放到某个节点的前边
somenode.insertBefore(newnode,某个节点);
删除节点:
removeChild():获得要删除的元素,通过父元素调用删除
替换节点:
somenode.replaceChild(newnode, 某个节点);
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .div1,.div2,.div3,.div4{ 300px; height: 200px; } .div1{ background-color: green; } .div2{ background-color: red; } .div3{ background-color: blue; } .div4{ background-color: lemonchiffon; } </style> </head> <body> <div class="div1"> <button onclick="add()">add</button> div1</div> <div class="div2"> <button onclick="del()">del</button> div2</div> <div class="div3"> <button onclick="change()">change</button> <p>div3</p> </div> <div class="div4">div4</div> <script> // 把div3 的p改变为image function change() { var img=document.createElement("img"); img.src="meinv.png"; var ele=document.getElementsByTagName("p")[0]; var father=document.getElementsByClassName("div3")[0]; father.replaceChild(img,ele) } // 删除p元素 function del() { var father=document.getElementsByClassName("div1")[0]; var son=father.getElementsByTagName("p")[0] father.removeChild(son) } // 增加p元素 function add() { var ele=document.createElement("p"); ele.innerHTML="hello p"; var father=document.getElementsByClassName("div1")[0]; father.appendChild(ele) } </script> </body> </html> 增 删 改 查 演示
节点属性操作:
改变 HTML 内容
改变元素内容的最简答的方法是使用 innerHTML ,innerText。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .div1{ 300px; height: 200px; } .div1{ background-color: green; } </style> </head> <body> <div class="div1"> <button onclick="add()">add</button> div1</div> <script> function add() { var ele=document.createElement("p"); ele.innerHTML="<h1>hello p</h1>"; var father=document.getElementsByClassName("div1")[0]; father.appendChild(ele) } </script> </body> </html> 改变元素内容 演示
改变 CSS 样式
<p id="p2">Hello world!</p> <script> document.getElementById("p2").style.color="blue"; </script>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .div1{ 300px; height: 200px; } .div1{ background-color: green; } </style> </head> <body> <div class="div1"> <button onclick="add()">add</button> div1</div> <script> function add() { var ele=document.createElement("p"); ele.innerHTML="<h1>hello p</h1>"; ele.style.color="red"; ele.style.fontSize="10px"; var father=document.getElementsByClassName("div1")[0]; father.appendChild(ele) } </script> </body> </html> 改变CSS样式 演示
改变 HTML 属性
elementNode.setAttribute(name,value)
elementNode.getAttribute(name)<-------------->elementNode.value(DHTML)
关于class的操作
elementNode.className
elementNode.classList.add
elementNode.classList.remove
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div class="div1 div2">div1</div> <script> var ele=document.getElementsByTagName("div")[0]; console.log(ele.className); console.log(ele.classList[0]); ele.classList.add("hide"); console.log(ele.className) </script> </body> </html> class操作 演示
案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button onclick="select('all');">全选</button> <button onclick="select('cancel');">取消</button> <button onclick="select('reverse');">反选</button> <table border="1" id="Table"> <tr> <td><input type="checkbox"></td> <td>111</td> </tr> <tr> <td><input type="checkbox"></td> <td>222</td> </tr> <tr> <td><input type="checkbox"></td> <td>333</td> </tr> <tr> <td><input type="checkbox"></td> <td>444</td> </tr> </table> <script> function select(choice){ var ele=document.getElementById("Table"); var inputs=ele.getElementsByTagName("input"); for (var i=0;i<inputs.length;i=i+1){ var ele2=inputs[i]; if (choice=="all"){ ele2.checked=true; }else if(choice=="cancel"){ ele2.checked=false; } else { if (ele2.checked){ ele2.checked=false; }else { ele2.checked=true; } } } } </script> </body> </html> 表格 全选 反选 取消 演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> h1{ background-color: darkgray; color: red; text-align: center; line-height: 50px; } </style> </head> <body> <h1 class="title">欢迎方少伟sb</h1> <script> function test(){ var ele=document.getElementsByClassName("title")[0]; // console.log(ele) // console.log(ele.innerText); // console.log(typeof ele.innerText); var content=ele.innerText; var fist_char=content.charAt(0); var later_string=content.substring(1,content.length); var new_content=later_string+fist_char; // 赋值操作 ele.innerText=new_content; } setInterval(test,1000); </script> </body> </html> 跑马灯例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> <!--公共样式隐藏--> .hide{ display: none; } <!--遮罩层,铺满整个屏幕,上下左右都为零--> .c1{ position: fixed;#绝对定位 top: 0; left: 0; right: 0; bottom: 0; background-color: #0f0f0f; opacity: 0.5;#设置元素的不透明级别 z-index: 9; } <!--固定到遮罩层中间--> .c2{ 500px; height: 400px; background-color: #f9f9f9; position: fixed; left: 50%; top: 50%; margin-top: -200px; margin-left: -250px; z-index: 10; } </style> </head> <body style="margin: 0;"> <div> <input type="button" value="添加" onclick="ShowMod();"> </div> <!--遮罩层开始--> <div id='id1' class="c1 hide"> </div> <!--遮罩层结束--> <!--弹出框开始--> <div id= 'id2'class="c2 hide"> <p class="=c3"><input type="text" placeholder="username"></p> <p><input type="password" placeholder="password"></p> <p><input type="button" value="取消" onclick="HideMod();"> <input type="button" value="确定"></p> </div> <!--弹出框结束--> <script> function ShowMod(){ <!--找到标签获取所有样式,隐藏掉hide,弹窗会显现--> document.getElementById('id1').classList.remove('hide'); document.getElementById('id2').classList.remove('hide'); } function HideMod(){ <!--找到标签获取所有样式,增加hide,隐藏弹窗--> document.getElementById('id1').classList.add('hide'); document.getElementById('id2').classList.add('hide'); } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .g{ color: gray; } .b{ color: black; } </style> </head> <body> <p>当鼠标进入时,移除内容</p> <p>当鼠标退出时,添加内容</p> <!--默认文本方式1--> <input type="text" placeholder="请输入内容:" /> <!--默认文本方式2--> <!--onfocus得到焦点时执行,onblur光标移出时执行--> <input type="text" class="g" value="请输入内容:" onfocus="Fouce(this);" onblur="Blur(this);" /> <script> function Fouce(ths) { ths.className = "b"; var current_val = ths.value; <!--点击清空默认文本--> if (current_val == "请输入内容:"){ ths.value = ""; } } function Blur(ths) { var current_val = ths.value; <!--去掉空格长度为0--> if (current_val == "请输入内容:" || current_val.trim().length == 0){ ths.value = "请输入内容:"; ths.className = "g"; } } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <!--双击触发事件--> <input type="button" value="全选" ondblclick="CheckAll();"/> <input type="button" value="反选" onclick="ReverseAll();" /> <input type="button" value="取消" ondblclick="CancleAll();"/> </div> <table> <thead> <tr> <th>序号</th> <th>用户名</th> <th>年龄</th> </tr> </thead> <tbody id="tb"> <tr> <td><input class="c1" type="checkbox" /></td> <td>zc</td> <td>20</td> </tr> <tr> <td><input class="c1" type="checkbox" /></td> <td>zc</td> <td>20</td> </tr><tr> <td><input class="c1" type="checkbox" /></td> <td>zc</td> <td>20</td> </tr><tr> <td><input class="c1" type="checkbox" /></td> <td>zc</td> <td>20</td> </tr> </tbody> </table> <script> function CheckAll() { var tb = document.getElementById("tb"); var checks = tb.getElementsByClassName("c1"); for (var i=0; i<checks.length;i++){ var current_check = checks[i]; current_check.checked = true; } } function CancleAll() { var tb = document.getElementById("tb"); var checks = tb.getElementsByClassName("c1"); for (var i=0; i<checks.length;i++){ var current_check = checks[i]; current_check.checked = false; } } function ReverseAll() { var tb = document.getElementById("tb"); var checks = tb.getElementsByClassName("c1"); for (var i=0; i<checks.length;i++){ var current_check = checks[i]; if (current_check.checked) { current_check.checked = false; }else{ current_check.checked = true; } } } </script> </body> </html>
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <ul> <li><input type="radio" name="g" value="11">男</li> <li><input type="radio" name="g" value="12">女</li> <li><input type="radio" name="g" value="13">中</li> </ul> <script> var radios = document.getElementsByTagName("input"); </script> </body> </html>
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <select id="sel"> <option value="11">上海</option> <!--默认选中北京--> <!--selectedIndex通过索引获取值--> <option value="22" selected="selected">北京</option> <option value="33">河南</option> <option value="44">河北</option> </select> </body> </html>
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <input type="button" onclick="Func();" value="点我啊"> <div id="i1"> <div class="c1">123</div> <div class="c1" zc="sb">123</div> <div class="c1" zc="sb">123</div> <div class="c1">123</div> <div class="c1" zc="sb">123</div> <div class="c1">123</div> <div class="c1" zc="sb">123</div> <div class="c1">123</div> <div class="c1" zc="sb">123</div> </div> <script> function Func() { <!--获得i1所有标签,循环每一个,判断zc="sb"--> var i1 = document.getElementById("i1"); var divs =i1.children; for (var i=0; i<divs.length;i++){ var current_div = divs[i]; var result = current_div.getAttribute("zc"); console.log(result); if (result == "sb"){ current_div.innerText = "456"; } } } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>tab</title> <style> *{margin:0; padding:0; list-style:none;} body{ font-family: "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei", "9ED14F53", Arial, sans-serif; } h3{ text-align: center; color:darkcyan; margin-top: 30px; letter-spacing: 5px; } .box{ width: 1000px; margin:50px auto 0px; } #title{ line-height: 40px; background-color: rgb(247,247,247); font-size: 16px; font-weight: bold; color: rgb(102,102,102); } #title span{ float: left; width: 166px; text-align: center; } #title span:hover{ /*color: black;*/ cursor: pointer; } #content{ margin-top: 20px; } #content li{ width: 1050px; display: none; background-color: rgb(247,247,247); } #content li div{ width: 156px; margin-right: 14px; float: left; text-align: center; } #content li div a{ font-size: 14px; color: black; line-height: 14px; /* float: left;*/ display: inline-block; margin-top: 10px; } #content li a:hover{ color: #B70606; } #content li div span{ font-size: 16px; line-height: 16px; /*float: left;*/ display: block; color: rgb(102,102,102); margin-top: 10px; } #content img{ float: left; width: 155px; height: 250px; } #title .select{ background-color: #2459a2; color: white; border-radius: 10%; } #content .show{ display: block; } .show span{ color: red!important; font-size: 30px; } </style> </head> <body> <h3 id="wel">京东商城欢迎您</h3> <!-- direction="right up down left" --> <!-- behavior:滚动方式(包括3个值:scroll、slide、alternate) --> <!-- 说明:scroll:循环滚动,默认效果;slide:只滚动一次就停止;alternate:来回交替进行滚动。 --> <!-- scrollamount="5" 滚动速度 --> <marquee behavior="scroll" direction="right">欢迎您苑昊先生</marquee> <script> function test(){ var mywel = document.getElementById("wel"); var content = mywel.innerText; var f_content = content.charAt(0); var l_content = content.substring(1,content.length); var new_content = l_content + f_content; mywel.innerText = new_content; } // setInterval("test();", 500); </script> <div class="box"> <p id="title"> <span class="select">家用电器</span> <span>家具</span> <span>汽车</span> <span>食品</span> <span>女鞋</span> <span>医疗保健</span> </p> <ul id="content"> <li class="show"> <div><img src="https://img10.360buyimg.com/n1/s450x450_jfs/t4786/325/2470647304/119102/9e1a4ed5/59005841Nd786a8df.jpg" alt="冰箱"><a href="#">容声(Ronshen)冰箱</a><span>价格:5600</span></div> <div><img src="https://img12.360buyimg.com/n1/s450x450_jfs/t3037/347/1290968859/201366/7c1028a0/57c00194N9d0a54c6.jpg" alt="洗衣机"><a href="#">海尔洗衣机</a><span>价格:5400</span></div> <div><img src="https://img11.360buyimg.com/n1/jfs/t3289/128/2393835119/236360/af1d283b/57e0f300N53dde603.jpg" alt="电饭煲"><a href="#">福库(CUCKOO)电饭煲</a><span>价格:3999</span></div> <div><img src="https://img13.360buyimg.com/n1/jfs/t3235/137/2361713777/152258/a6908440/57e098c2N44a90a5d.jpg" alt="智能电视"><a href="#">三星智能电视</a><span>价格:8999</span></div> <div><img src="https://img10.360buyimg.com/n1/jfs/t2053/101/1391591157/215066/572e131b/5696ee9bN2376492d.jpg" alt="净水器"><a href="#">净水器</a><span>价格:1300</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t3175/78/2357430273/262835/9a8e7f65/57e0a3e9Nbda39dd2.jpg" alt="空气净化器"><a href="#">空气净化器</a><span>价格:5300</span></div> </li> <li> <div><img src="https://img12.360buyimg.com/n1/jfs/t1948/172/2877517581/556924/682eb107/56f63dc8Naddf77e5.jpg" alt="沙发"><a href="#">沙发</a><span>价格:2900</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t1948/172/2877517581/556924/682eb107/56f63dc8Naddf77e5.jpg" alt="沙发"><a href="#">沙发</a><span>价格:2900</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t1948/172/2877517581/556924/682eb107/56f63dc8Naddf77e5.jpg" alt="沙发"><a href="#">沙发</a><span>价格:2900</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t1948/172/2877517581/556924/682eb107/56f63dc8Naddf77e5.jpg" alt="沙发"><a href="#">沙发</a><span>价格:2900</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t1948/172/2877517581/556924/682eb107/56f63dc8Naddf77e5.jpg" alt="沙发"><a href="#">沙发</a><span>价格:2900</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t1948/172/2877517581/556924/682eb107/56f63dc8Naddf77e5.jpg" alt="沙发"><a href="#">沙发</a><span>价格:2900</span></div> </li> <li> <div><img src="http://img11.360buyimg.com/n1/jfs/t4969/76/45396935/144539/347153d4/58d9cff4N36872ad6.jpg" alt="长安汽车"><a href="#">长安汽车</a><span>价格:12900</span></div> <div><img src="http://img11.360buyimg.com/n1/jfs/t4969/76/45396935/144539/347153d4/58d9cff4N36872ad6.jpg" alt="长安汽车"><a href="#">长安汽车</a><span>价格:12900</span></div> <div><img src="http://img11.360buyimg.com/n1/jfs/t4969/76/45396935/144539/347153d4/58d9cff4N36872ad6.jpg" alt="长安汽车"><a href="#">长安汽车</a><span>价格:12900</span></div> <div><img src="http://img11.360buyimg.com/n1/jfs/t4969/76/45396935/144539/347153d4/58d9cff4N36872ad6.jpg" alt="长安汽车"><a href="#">长安汽车</a><span>价格:12900</span></div> <div><img src="http://img11.360buyimg.com/n1/jfs/t4969/76/45396935/144539/347153d4/58d9cff4N36872ad6.jpg" alt="长安汽车"><a href="#">长安汽车</a><span>价格:12900</span></div> <div><img src="http://img11.360buyimg.com/n1/jfs/t4969/76/45396935/144539/347153d4/58d9cff4N36872ad6.jpg" alt="长安汽车"><a href="#">长安汽车</a><span>价格:12900</span></div> </li> <li> <div><img src="https://img14.360buyimg.com/n1/jfs/t4414/110/2582917360/207971/b7e129ad/58f0ee1fN94425de1.jpg" alt="嘉兴粽子"><a href="#">嘉兴粽子</a><span>价格:1</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t4414/110/2582917360/207971/b7e129ad/58f0ee1fN94425de1.jpg" alt="嘉兴粽子"><a href="#">嘉兴粽子</a><span>价格:1</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t4414/110/2582917360/207971/b7e129ad/58f0ee1fN94425de1.jpg" alt="嘉兴粽子"><a href="#">嘉兴粽子</a><span>价格:1</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t4414/110/2582917360/207971/b7e129ad/58f0ee1fN94425de1.jpg" alt="嘉兴粽子"><a href="#">嘉兴粽子</a><span>价格:1</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t4414/110/2582917360/207971/b7e129ad/58f0ee1fN94425de1.jpg" alt="嘉兴粽子"><a href="#">嘉兴粽子</a><span>价格:1</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t4414/110/2582917360/207971/b7e129ad/58f0ee1fN94425de1.jpg" alt="嘉兴粽子"><a href="#">嘉兴粽子</a><span>价格:1</span></div> </li> <li> <div><img src="https://img14.360buyimg.com/n1/jfs/t3079/298/5759209435/92674/14818594/587f1c33N53e5d2a9.jpg" alt="星期六"><a href="#">星期六</a><span>价格:439</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t3079/298/5759209435/92674/14818594/587f1c33N53e5d2a9.jpg" alt="星期六"><a href="#">星期六</a><span>价格:439</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t3079/298/5759209435/92674/14818594/587f1c33N53e5d2a9.jpg" alt="星期六"><a href="#">星期六</a><span>价格:439</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t3079/298/5759209435/92674/14818594/587f1c33N53e5d2a9.jpg" alt="星期六"><a href="#">星期六</a><span>价格:439</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t3079/298/5759209435/92674/14818594/587f1c33N53e5d2a9.jpg" alt="星期六"><a href="#">星期六</a><span>价格:439</span></div> <div><img src="https://img14.360buyimg.com/n1/jfs/t3079/298/5759209435/92674/14818594/587f1c33N53e5d2a9.jpg" alt="星期六"><a href="#">星期六</a><span>价格:439</span></div> </li> <li> <div><img src="https://img12.360buyimg.com/n1/jfs/t5755/127/1139389729/356866/99d4e869/5923e410Nb2983f70.jpg" alt="汇仁 肾宝片"><a href="#">汇仁 肾宝片</a><span>价格:322</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t5755/127/1139389729/356866/99d4e869/5923e410Nb2983f70.jpg" alt="汇仁 肾宝片"><a href="#">汇仁 肾宝片</a><span>价格:322</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t5755/127/1139389729/356866/99d4e869/5923e410Nb2983f70.jpg" alt="汇仁 肾宝片"><a href="#">汇仁 肾宝片</a><span>价格:322</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t5755/127/1139389729/356866/99d4e869/5923e410Nb2983f70.jpg" alt="汇仁 肾宝片"><a href="#">汇仁 肾宝片</a><span>价格:322</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t5755/127/1139389729/356866/99d4e869/5923e410Nb2983f70.jpg" alt="汇仁 肾宝片"><a href="#">汇仁 肾宝片</a><span>价格:322</span></div> <div><img src="https://img12.360buyimg.com/n1/jfs/t5755/127/1139389729/356866/99d4e869/5923e410Nb2983f70.jpg" alt="汇仁 肾宝片"><a href="#">汇仁 肾宝片</a><span>价格:322</span></div> </li> </ul> </div> <script> var title=document.getElementById('title'); var content=document.getElementById('content'); var category=title.getElementsByTagName('span'); var item=content.getElementsByTagName('li'); for (var i = 0; i < category.length; i++) { category[i].index=i; category[i].onclick=function(){ for (var j = 0; j < category.length; j++) { category[j].className=''; item[j].className=''; } this.className='select'; item[this.index].className='show'; } } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <input type="text" /> <input type="button" value="添加" onclick="AddElement(this);"/> </div> <div> <ul id="commentList"> <li>zc</li> </ul> </div> <!--<script>--> <!--function AddElement(ths) {--> <!--//获取输入的值--> <!--var val = ths.previousElementSibling.value;--> <!--ths.previousElementSibling.value = "";//添加后清空--> <!--var commentList = document.getElementById("commentList");--> <!--//第一种形式通过字符串的形式添加进去的--> <!--<!–var str = "<li>"+ val + "</li>";–>--> <!--<!–commentList.insertAdjacentHTML("beforeEnd",str);//动态内部下边添加标签–>--> <!--<!–commentList.insertAdjacentHTML("beforeBegin",str);//动态往外部上边添加标签–>--> <!--<!–commentList.insertAdjacentHTML("afterBegin",str);//动态内部上边添加标签–>--> <!--<!–commentList.insertAdjacentHTML("afterEnd",str);//动态外部下边添加标签–>--> <!--var tag = document.createElement("li");--> <!--tag.innerText = val;//创建了li标签,并把内容写成了val--> <!--commentList.appendChild(tag);//元素形式,字符串请使用上面那种--> <!--}--> <!--</script>--> <script> function AddElement(ths) { //获取输入的值 var val = ths.previousElementSibling.value; ths.previousElementSibling.value = "";//添加后清空 var commentList = document.getElementById("commentList"); //第二种方式, 元素的方式(推荐使用) var tag = document.createElement("li"); tag.innerText = val;//创建了li标签,并把内容写成了val //插入链接 var temp = document.createElement("a"); temp.innerText = "百度"; temp.href = "http://baidu.com"; tag.appendChild(temp); <!--commentList.appendChild(tag);//元素形式,字符串请使用上面那种--> commentList.insertBefore(tag,commentList.children[0]);//插在最前面 } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2 id="h1">333 <span>123</span> <a>123</a> </h2> <div id="container"> <div class="item">1</div> <div class="item">2</div> </div> <script> var h = document.getElementById("h1"); var c = document.getElementById("container"); c.appendChild(h);//移动到下面 </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ margin: 0; padding: 0; } #father{ width: 400px; height: 5000px; border:1px solid #000; } #son{ width: 600px; height: 5000px; background: linear-gradient(45deg ,red,yellow,green,cyan,blue); } </style> </head> <body> <div id="top">我是可爱的顶部</div> <div id="father"> <div id="son"></div> </div> <a href="#top">返回顶部</a> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .go-top{ position: fixed; right:28px; bottom:18px; backgroup-color:#2459a2; color:white; width:40px; height:40px; } .hide{ display:none; } </style> </head> <body onscroll="Func();"> //局部网页滚动条,返回顶部 <div id="=xo" style="height:200px;overflow:auto" onscroll="Func();"> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> </div> <div id="i1" style="height:2000px"> <h1>nihao</h1> </div> <div id="i2" class="go-top hide"> <!--<!–<a href="#i1">返回顶部</a>–>锚点--> <a href="#" onclick="GoTOP();">返回顶部</a> //#号是什么都不处理 </div> <script> function Func() { //获取当前滚动高度 var scrollTop = document.body.scrollTop; var ii = document.getElementById("i2"); if(scrollTop>10) { ii.classList.remove("hide"); }else{ ii.classList.add("hide"); } } function GoTOP() { document.body.scrollTop = 0; //scrollTop滚动高度 } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin:0;"> <div id="xo" style="height:200px;overflow:auto; 400px;margin:0 auto;border:1px solid red;"> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> <div>123</div> </div> <script> var i = document.getElementById('xo'); //scrollHeight文档的高度:自身+padding //scrollTop:滚动条距离顶部高度 //clientHeight:可见范围的高度:自身+padding //clientTop:边框高度 //offsetTop:当前标签距离顶部(body)定位标签的高度 //offsetHeight:可见范围的高度:自身+padding+border console.log(i.scrollHeight); console.log(i.clientHeight); console.log(i.clientTop); console.log(i.offsetTop); console.log(i.offsetHeight); </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> body{ margin:0; background-color:#dddd; } .w{ margin:0 auto; width:980px; } .pg-header{ background-color:black; color:white; height:48px; } .pg-body .menu{ position:absolute; width:180px; background-color:white; float:left; left:200px } .pg-body .menu .active{ background-color:#425a66; color: } .pg-body .fixed{ position:fixed; top:50px; } .pg-body .content{ position:absolute; width:800px; background-color:white; float:left; left:385px; right:200px; } .pg-body .content .item{ height: 900px; } </style> </head> <body onscroll="Hua();"> <div class="pg-header"> <div class="w"> </div> </div> <div class="pg-body"> <div class="fixed"> <div id="menu" class="menu" > <ul> <li>第一章</li> <li>第二章</li> <li>第三章</li> <li>第四章</li> </ul> </div> </div> <div id="content" class="content"> <div class="item">床前明月光1</div> <div class="item">床前明月光2</div> <div class="item">床前明月光3</div> <div class="item">床前明月光4</div> </div> </div> <script> function Hua(){ var huaGao = document.body.scrollTop; var caiDan =document.getElementById("menu"); if (huaGao>48){ caiDan.classList.add("fixed"); }else{ caiDan.classList.remove("fixed"); } var items =document.getElementById("content").children; for (var i=0;i<items.length;i++){ var currentItem = items[i]; currentItem.offsetTop } } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form id="fom" action="http://www.baidu.com" method="get"> <input name="query" type="text" /> <input type="button" onclick="SubmitForm();" value="提交" /> </form> <input type="button" value="confirm" onclick="Firm();" /> <input type="button" value="Interval" onclick="Interval();" /> <input type="button" value="StopInterval" onclick="StopInterval();" /> <div> <input type="button" value="删除" onclick="Delete();" /> <input type="button" value="保留状态" onclick="UnDelete();" /> <div id="status"></div> </div> <script> function UnDelete(){ clearTimeout(t1); } function Delete(){ document.getElementById("status").innerText = "已删除"; t1 = setTimeout(ClearStatus,5000); } function ClearStatus(){ document.getElementById("status").innerText = ""; } function SubmitForm(){ document.getElementById("fom").innerText = ""; } function Firm(){ var r = confirm("你好"); console.log(r); } function f1(){ console.log(123); } function Interval(){ <!--setInterval("console.log(1)",1000);--> <!--setInterval(f1,1000);--> s1 = setInterval(function(){ console.log(123); },1000); s2 = setInterval(function(){ console.log(13); },2000); console.log(1); } function StopInterval() { clearTimeout(s1); } </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> function func(){ for (var i=0;i<3;i++){ setInterval(function(){ console.log(i); },1000); } } func(); </script> </body> </html> //作用域:每一秒输出3(跨度是3)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="btns"> <input type="button" value="点我1" /> <input type="button" value="点我2" /> <input type="button" value="点我3" /> </div> <script> var btns = document.getElementById('btns').children; for (var j = 0;j<btns.length;j++){ var current_input = btns[j]; current_input.onclick = function(){ alert(j); } } </script> </body> </html> //作用域:点我1,点我2,点我3都输出为3, current_input.onclick = function(){ alert(j); 这个函数外面,没有其他函数只剩下全局变量,全局变量执行结果等于3所以输出都为3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <!--注册事件:--> <!--a.<div onclick="xxxxx"></div>--> <!--b.document......onclick = function()--> <!--this:触发当前事件标签--> <!--event:触发当前标签的事件的内容--> <body> <div onmouseover="Func(this);" onmouseout="Out(this);">123</div> <input type="text" onkeydown="Down(this,event);" />//event当前事件包含的内容 <script> function Down(ths,evn){ console.log(e); } function Func(ths){ ths.style.color = "red";//鼠标放上改变颜色 } function Out(ths){ ths.style.color = "black";//去掉鼠标颜色恢复 } </script> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> //自定义事件:onclick="Func(); //默认事件:href="http://www.baidu.com" //自定义事件>默认事件 //可以更改自定义事件真假来判断它是否执行 <body> <a href="http://www.baidu.com" onclick="Func();">baidu</a> <a href="http://www.baidu.com" onclick="return Func();">baidu</a> <form action="s10.html"> <div id="fo"> <input type="text" /> </div> <input type="submit" value="提交" onclick="SubmitForm();" /> </form> <script> function Func(){ alert(123); } function Func(){ alert(123); return true; } function SubmitForm(){ var inputs = document.getElementById('fo').getElementsByTagName('input'); for(var i = 0;i<inputs.length;i++){ var currentInput = inputs[i]; var val = currentInput.value; if(val.trim().length == 0){ alert('请输入内容'); return false; } } return true; } </script> </body> </html>
js的作用域:
作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种
全局作用域:
var name="yuan";
function foo(){
var age=23;
function inner(){
console.log(age);
}
inner();
}
console.log(name); // yuan
//console.log(age); // Uncaught ReferenceError: age is not defined
foo(); // 23
inner(); // Uncaught ReferenceError: inner is not defined
var name="yuan";
function foo(){
age=23;
var sex="male"
}
foo();
console.log(age); // 23
console.log(sex); // sex is not defined
变量blog拥有全局作用域,而sex在函数外部无法访问到。
(3)所有window对象的属性拥有全局作用域
一般情况下,window对象的内置属性都都拥有全局作用域,例如window.alert()、window.location、window.top等等。
局部作用域:
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域成为函数作用域.
作用域链:
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
//-----**********************例1*********************************
var s=12;
function f(){
console.log(s);
var s=12; // if s=12
console.log(s)
}
f();
//-----**********************例2*********************************
var s=10;
function foo(){
console.log(s);
var s=5;
console.log(s);
function s(){console.log("ok")}// 函数的定于或声明是在词法分析时完成的,执行时已不再有任何操作
console.log(s);
}
foo();
//-----***********************例3********************************
function bar(age) {
console.log(age);
var age = 99;
var sex= 'male';
console.log(age);
function age() {
alert(123)
};
console.log(age);
return 100;
}
result=bar(5);
//-----********************************************************
function bar(age) {
console.log(age);
var age = 99;
var sex="male";
console.log(age);
function age(){
alert(123);
} ;
console.log(age);
return 100;
}
result=bar(5);
一 词法分析过程(涉及参数,局部变量声明,函数声明表达式):
1-1 、分析参数,有一个参数,形成一个 AO.age=undefine;
1-2 、接收参数 AO.age=5;
1-3 、分析变量声明,有一个 var age, 发现 AO 上面有一个 AO.age ,则不做任何处理
1-4 、分析变量声明,有一个 var sex,形成一个 AO.sex=undefine;
1-5 、分析函数声明,有一个 function age(){} 声明, 则把原有的 age 覆盖成 AO.age=function(){};
二 执行过程:
2-1 、执行第一个 console.log(age) 时,当前的 AO.age 是一个函数,所以输出的一个函数
2-2 、这句 var age=99; 是对不 AO.age 的属性赋值, AO.age=99 ,所以在第二个输出的age是 99;
2-3 、同理第三个输出的是 99, 因为中间没有改变 age 值的语句了。
注意:执行阶段:
function age(){
alert(123)
} ;
不进行任何操作,将执行语句复制给age这部操作是在词法分析时,即运行前完成的。