一、概念
二、JS语法
1.js语句
以分号结尾
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js语法</title>
</head>
<body>
<script>
var num = 10; //声明变量num
var username = “赵姐”; //声明变量username
console.log(num,username); //在控制台打印输出
</script>
</body>
</html>
2.标识符(identifier)
指的是用来识别各种值的合法名称。最常见的 标识符就是变量名。
3.js引入方式
...
<body>
<script src="xxx.js"></script> //引入js文件
<script src="http://xxxxx"></script> //引入网络来源文件
</body>
...
4.js注释与常见输出方式
(1)注释:单行(//)、多行(/* 注释内容*/) 快捷键:ctrl+/
(2)输出方式:弹出窗、页面输出、控制台输出
...
<script>
alert("弹出框中的内容");
document.write("页面显示的内容");
console.log("控制台输出的内容");
</script>
...
5.js的数据类型
(详细见:JavaScript 数据类型 | 菜鸟教程)
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。
null一般代表对象为“没有”
undefined一般代表数值为“没有”
引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
...
<script>
//复合数据类型,object
var user = {
age:18,
name:"xiaohuihui",
marriage:false,
</script>
...
6.typeof运算符
判断数据类型
typeof "xiaoweiwei" // 返回 string
typeof 3.14 // 返回 number
typeof false // 返回 boolean
typeof [1,2,3,4] // 返回 object
typeof {name:'xiaoweiwei', age:18} // 返回 object
7.运算符
(详细见:JavaScript 运算符 | 菜鸟教程、JavaScript 比较和逻辑运算符 | 菜鸟教程)
注意: == 等于 ===绝对等于(值和类型均相等)
8.随意笔记
switch(条件表达式){
case"结果1":
....
break;
case"结果2":
break;
default:
...
}
三元符:条件? 真值:假值
break语句和continue语句
- break语句用于跳出代码块或循环
- continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环
9.字符串常用方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>字符串常用方法</title>
</head>
<body>
<script>
// 1.charAt()获取指定位置的字符
var str = "I love web";
length = str.length; //获取字符串长度
str1 = str.charAt(0); //获取指定位置的字符,参数是从 0 开始编号的
str2 = str.charAt(11); //如果参数为负数,或大于等于字符串的长度, charAt 返回空字符串
document.write("length = ", length, "<br>"); //return 10
document.write("str1 = ", str1, "<br>"); //return I
document.write("str2 = ", str2, "<br>"); //return ""
// 2.charCodeAt()获取指定位置的字符的 Unicode 编码
str3 = str.charCodeAt(0) //获取指定位置的字符的 Unicode 编码,参数是从 0 开始编号的
document.write("str3 = ", str3, "<br>"); // return 73
// 3.concat()链接字符串
var s1 = 'xiaohuihui';
var s2 = ' is so cute';
s3 = s1.concat(s2); //返回一个新字符串,不改变原字符串
document.write("s3 = ", s3, "<br>"); //return xiaohuihui is so cute
document.write("s1 = ", s1, "<br>"); //return xiaohuihui
// 4.substring()截取字符串
var s4 = 'I love web';
s5 = s4.substring(0, 6); //参数是开始位置和结束位置,不包含结束位置,返回一个新的字符串,不改变原字符串
s6 = s4.substring(6); //如果省略第二个参数,则表示子字符串一直到原字符串的结束
s7 = s4.substring(10, 6); //如果第一个参数大于第二个参数,会自动更换两个参数的位置
s8 = s4.substring(-1); //如果参数是负数,会自动将负数转为0
document.write("s5 = ", s5, "<br>"); //return I love
document.write("s6 = ", s6, "<br>"); //return web
document.write("s7 = ", s7, "<br>"); //return web
document.write("s8 = ", s8, "<br>"); //return I love web
//5.substr()截取字符串
var s9 = 'I love web';
s10 = s9.substr(0, 6); //参数是开始位置和长度,返回一个新的字符串,不改变原字符串
s11 = s9.substr(6); //如果省略第二个参数,则表示子字符串一直到原字符串的结束
s12 = s9.substr(10, -6); //如果第一个参数大于第二个参数,会自动转为0
s13 = s9.substr(-6); //如果第一个参数是负数,表示倒数计算的字符位置。
document.write("s10 = ", s10, "<br>"); //return I love
document.write("s11 = ", s11, "<br>"); //return web
document.write("s12 = ", s12, "<br>"); //return ""
document.write("s13 = ", s13, "<br>"); //return ve web
//6.indexof()匹配字符串
var s14 = 'I love web';
s15 = s14.indexOf('love'); //返回字符串中匹配到的第一个字符的位置,不区分大小写,返回-1表示没有匹配到
s16 = s14.indexOf('love', 3); //从指定位置开始匹配
s17 = s14.indexOf('love', -1); //如果参数是负数,则从字符串的末尾开始匹配
s18 = s14.indexOf('love', 10); //如果参数大于字符串的长度,则从字符串的末尾开始匹配
document.write("s15 = ", s15, "<br>"); //return 2
document.write("s16 = ", s16, "<br>"); //return -1
document.write("s17 = ", s17, "<br>"); //return 2
document.write("s18 = ", s18, "<br>"); //return -1
//7.trim()去除字符串两端的空格,该方法去除的不仅是空格,还包括制表符(\t 、 \v)、换行符(\n)和回车符(\r)
var s19 = ' I love web ';
s20 = s19.trim();
s21 = s19.trimEnd();
s22 = s19.trimStart();
document.write("s20 = ", s20, "<br>"); //return I love web
document.write("s21 = ", s21, "<br>"); //return I love web
document.write("s22 = ", s22, "<br>"); //return I love web
//8.split()将字符串分割成数组
var s23 = 'I|love|web';
s24 = s23.split('|');
s25 = s23.split('');
s26 = s23.split();
s27 = s23.split('|', 2);
document.write("s24 = ", s24, "<br>"); //return ["I", "love", "web"]
document.write("s25 = ", s25, "<br>"); //return ["I", "l", "o", "v", "e", "w", "b", "e"]
document.write("s26 = ", s26, "<br>"); //return ["I|love|web"]
document.write("s27 = ", s27, "<br>"); //return ["I", "love"]
//9.99九九乘法表
for (var i = 1; i <= 9; i++) {
document.write("<br>");
for (var j = 1; j <= i; j++) {
sum = i * j;
document.write(j,"*", i, "=", sum, " ");
}
}
</script>
</body>
</html>
10.数组(array)常用方法
是按次序排列的一组值。每个值的位置都有编号(从 0开始),整个数组用方括号表示。
(1)数组的遍历可以考虑使用for循环、while循环或 for...in遍历数组。数组越界输出undefined
var a = ["苹果","香蕉","梨","荔枝","草莓"];
for (var i in a) {
console.log(a[i]);
}
console.log(Array.isArray(a)); //判断是否为数组,返回值有true,false
(2)数组静态方法Array.isArray():该方法返回一个布尔值,表示参数是否为数组。它可以弥补 typeof 运算符的不足。
(3)数组方法push()/pop()
- push 方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。
- pop 方法用于删除数组的最后一个元素,并返回该元素。
- 注意,这两种方法会改变原数组。
(4)数组方法shift()/unshift()
shift 方法用于删除数组的第一个元素,并返回该元素。 unshift 方法用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度。 注意,这两种方法会改变原数组。
(5)数组方法join():以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。如果数组成员是undefined或null或空位,会被转成空字符串。数组的join配合字符串的split可以实现数组与字符串的互换。
(6)数组方法concat():用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。除了数组作为参数, concat 也接受其他类型的值作为参数,添加到目标数组尾部。应用场景:上拉加载,合并数据。
(7)reverse()方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。
(8)indexOf()方法返回给定元素在数组中第一次出现的位置,如果没有出 现则返回 -1。接受第二个参数,表示搜索的开始位置。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>数组</title>
</head>
<body>
<script>
var a = ["苹果","香蕉","梨","荔枝","草莓"];
// 1.数组的遍历
for (var i in a) {
console.log("遍历 " + i + a[i]);
}
//2.Array.isArray()数组静态方法,判断是否为数组,返回值有true,false
console.log("Array.isArray:",Array.isArray(a)); //return true
//3.pop()在数组末尾删除元素
console.log("pop:" , a.pop()) //return "草莓"
console.log("pop()在数组末尾删除元素", a);
//4.push()在数组末尾添加元素
console.log("push:" + a.push("西瓜")) //return 5
console.log("push()在数组末尾添加元素", a);
var b = ["苹果","香蕉","梨","荔枝","草莓"];
//5.shift()在数组开头删除元素
console.log("shift:",b.shift()); //return "苹果"
console.log("shift()在数组开头删除元素", b);
//6.unshift()在数组开头添加元素
console.log("unshift:",b.unshift("葡萄")); //return 5
console.log("unshift()在数组开头添加元素", b);
//7.join()将数组转换为字符串
var c = ["Hello","world","!"];
s1 = c.join(" ")
console.log("join()将数组转换为字符串",s1); //return Hello world !
console.log(s1.split(" ")); //return ["Hello", "world", "!"]
//8.concat()连接数组
var d = ["Hello","world","!"];
var e = ["你好","世界","!"];
var f = d.concat(e);
console.log("concat()连接数组",f); //return ["Hello", "world", "!", "你好", "世界", "!"]
//9.split()将字符串转换为数组,reverse()数组反转,join()数组转换为字符串
var g = "Hello world !";
var h = g.split(" ").reverse().join(" ");
console.log("split()将字符串转换为数组,reverse()数组反转,join()数组转换为字符串",h); //return ! world Hello
//10.indexOf()查找数组元素,返回值有索引值,没有返回-1
var i = ["Hello","world","!"];
console.log("indexOf()查找数组元素",i.indexOf("world")); //return 1
console.log("indexOf()查找数组元素",i.indexOf("你好")); //return -1
console.log("indexOf()查找数组元素",i.indexOf("!",1)); //return 2
</script>
</body>
</html>
三、函数
函数的声明:
function 函数名(参数1,.....){
函数体
}
1.对象(object)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象</title>
</head>
<body>
<script>
var obj = {
name: "小明",
age: 18,
sex: "女",
say: function () {
console.log("我叫" + this.name + "今年" + this.age + "岁了");
},
container:{
name:"小红",
age:20
}
}
obj.say();
console.log(obj.container.name);
</script>
</body>
</html>
2.Math对象
- Math.abs()方法返回参数值的绝对值
- Math.max()方法返回参数之中最大值, Math.min()返回最小值。如果参数为空,Math.min 返回 Infinity , Math.max 返回 -Infinity
Math.floor()方法返回小于参数值的最大整数;Math.ceil()方法返回大于参数值的最小整数。 Math.random()返回0到1之间的一个伪随机数,可能等于0,但是一定小于1。
3.Data对象
实例方法 get 类getTime() :返回实例距离 1970 年 1 月 1 日 00:00:00 的毫秒数getDate() :返回实例对象对应每个月的几号(从 1 开始)getDay() :返回星期几,星期日为 0 ,星期一为 1 ,以此类推getYear() :返回距离 1900 的年数getFullYear() :返回四位的年份getMonth() :返回月份(0表示 1 月, 11 表示 12 月)getHours() :返回小时( 0-23 )getMilliseconds() :返回毫秒( 0-999 )getMinutes() :返回分钟( 0-59 )getSeconds() :返回秒( 0-59 )
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Date</title>
<style>
body {
text-align: center;
font-size: 70px;
color: red;
background-color: #f0f0f0;
}
</style>
</head>
<body>
<script>
function leftDays(){
var now = new Date();
var end = new Date(now.getFullYear(),11,31,23,59,59,999);
var msPerDay = 24*60*60*1000;
var result = Math.floor((end.getTime()-now.getTime())/msPerDay);
document.write("距离元旦剩余天数:",result);
}
leftDays();
</script>
</body>
</html>
四、DOM概述
1.节点
DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM 树),就是由各种不同类型的节点组成。
节点的类型:
- Document:整个文档树的顶层节点
- DocumentType:doctype标签
Element :网页的各种 HTML 标签 Attribute:网页元素的属性(比如 class="right" ) Text:标签之间或标签包含的文本 Comment:注释 DocumentFragment:文档的片段Node.nodeType 属性不同节点的 nodeType 属性值和对应的常量如下
- 文档节点(document):9,对应常量 Node.DOCUMENT_NODE
- 元素节点(element):1,对应常量Node.ELEMENT_NODE
- 属性节点(attr):2,对应常量Node.ATTRIBUTE_NODE
- 文本节点(text):3,对应常量Node.TEXT_NODE
- 文档片断节点(DocumentFragment):11,对应常量Node.DOCUMENT_FRAGMENT_
2.document对象_方法/获取元素
- document.getElementsByTagName():搜索目标标签名,返回标签中的内容
- document.getElementsByClassName():搜索目标标签所带的类名,返回标签中的内容
- document.getElementsByName():搜索name,返回对象
- document.getElementById():搜索目标ID,返回标签中的内容
- document.querySelector():接受一个 CSS 选择器作为参数,返回匹配该选择器的元素节点。
- document.querySelectorAll():与 querySelector 用法类似,区别是返回一个NodeList 对象,包含所有匹配给定选择器的节点。
3.document对象_方法/创建元素
- document.createElement():添加标签节点,并返回该节点。
- document.createTextNode():添加文本节点,并返回该节点。
- document.createAttribute():添加属性节点,并返回该节点。
4.Element对象_属性
- ××.id:返回指定元素的id属性,该属性可读写。
- ××.className:读写当前元素节点的 class 属性。它的值是一个字符串,每个 class 之间用空格分割。
- ××.classList:
- ××.classList.add():增加一个class。
- ××.classList.remove():移除一个class。
- ××.classList.contains():检查当前元素是否包含某个class。
- ××.classList.toggle():将某个class移入或移出当前元素
- ××.innerHTML:修改内容
- ××.innerText:修改内容
- innerHTML和innerText的区别:
- innerHTML可以识别标签(识别http,跳转)
- innerText会把标签识别成一个字符串(识别字符串,返回字符串)
5.Element获取元素位置
属性 | 描述 |
clientHeight |
获取元素高度包括 padding 部分,但是不包括 border 、 margin
|
clientWidth |
获取元素宽度包括 padding 部分,但是不包括 border 、 margin
|
scrollHeight |
元素总高度,它包括 padding ,但是不包括 border 、 margin包括溢出的不可见内容
|
scrollWidth |
元素总宽度,它包括 padding ,但是不包括 border 、 margin包括溢出的不可见内容
|
scrollLeft |
元素的水平滚动条向右滚动的像素数量
|
scrollTop |
元素的垂直滚动条向下滚动的像素数量
|
offsetHeight |
元素的
CSS
垂直高度(单位像素),包括元素本身的高度、padding 和
border
|
offsetWidth |
元素的
CSS
水平宽度(单位像素),包括元素本身的高度、
padding
和
border
|
offsetLeft |
到定位父级左边界的间距
|
offsetTop |
到定位父级上边界的间距
|
HTML DOM 教程:HTML DOM 教程 | 菜鸟教程
五、CSS操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS操作</title>
</head>
<body>
<div class="box" id="box"></div>
<script>
var box = document.getElementById("box")
// 1.HTML元素的style属性
// box.setAttribute("style", "width:200px;height:200px;background:darksalmon;")
//2.样式表
// box.style.width = "300px"
// box.style.height = "300px"
// box.style.backgroundColor = "darksalmon"
//3.style.cssText
// box.style.cssText = "width:400px;height:400px;background:darksalmon;"
</script>
</body>
</html>
六、事件处理程序
1.HTML事件处理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTML事件处理</title>
</head>
<body>
<button onclick="htmlclick()">按钮</button>
<script>
// HTML事件:缺点:HTML和JS没有分开
function htmlclick(){
console.log("点击了按钮")
}
</script>
</body>
</html>
2.DOM0级事件处理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM0级事件处理</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
// DOM0事件:优点:HTML和JS是分离的 缺点:无法同时添加多个事件
var btn = document.getElementById("btn")
// 被覆盖了
btn.onclick = function () {
console.log("点击了1");
}
btn.onclick = function () {
console.log("点击了2");
}
</script>
</body>
</html>
3.DOM2级事件处理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM2级事件处理</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
// DOM2事件:优点:事件不会被覆盖 缺点:写起来麻烦
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
console.log("点击了1");
})
btn.addEventListener("click",function(){
console.log("点击了2");
})
</script>
</body>
</html>
七、鼠标事件
- onclick:按下鼠标时触发
- ondblclick:在同一个元素上双击鼠标时触发
- onmousedown:按下鼠标键时触发
- onmouseup:释放按下的鼠标键时触发
- onmousemove:当鼠标在节点内部移动时触发。当鼠标持续移动时,该事件会连触发。
- onmouseenter:鼠标进入一个节点时触发,进入子节点不会触发这个事件
- onmouseleave:鼠标离开一个节点时触发,离开父节点不会触发这个事件
- onmouseover:鼠标进入一个节点时触发,进入子节点会再一次触发这个事件
- onmouseout:鼠标离开一个节点时触发,离开父节点也会触发这个事件
- onwheel:滚动鼠标的滚轮时触发
这些方法在使用的时候,除了 DOM2 级事件,都需要添加前缀 on
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>鼠标事件</title>
<style>
.btn5{
width: 100px;
height: 100px;
background-color:aquamarine;
}
.fatherstyle{
width: 400px;
height:400px;
background-color:burlywood;
}
.sonstyle{
width: 200px;
height:200px;
background-color:blueviolet;
}
</style>
</head>
<body>
<button id="btn1">单击</button>
<button id="btn2">双击</button>
<button id="btn3">鼠标按下</button>
<button id="btn4">鼠标抬起</button>
<button id="btn5" class="btn5">鼠标移动</button>
<div id="father1" class="fatherstyle">
<div id="son1" class="sonstyle">
<p>鼠标进入mouseenter和离开mouseleave</p>
</div>
</div>
<div id="father2" class="fatherstyle">
<div id="son2" class="sonstyle">
<p>鼠标进入mouseover</p>
</div>
</div>
<div id="father3" class="fatherstyle">
<div id="son3" class="sonstyle">
<p>鼠标离开mouseout</p>
</div>
</div>
<script>
var btn1 = document.getElementById("btn1");
var btn2 = document.getElementById("btn2");
var btn3 = document.getElementById("btn3");
var btn4 = document.getElementById("btn4");
var btn5 = document.getElementById("btn5");
var father1 = document.getElementById("father1");
var father2 = document.getElementById("father2");
var father3 = document.getElementById("father3");
btn1.onclick = function(){
console.log("单击事件");
}
btn2.ondblclick = function(){
console.log("双击事件");
}
btn3.onmousedown = function(){
console.log("鼠标按下");
}
btn4.onmouseup = function(){
console.log("鼠标抬起");
}
btn5.onmousemove = function(){
console.log("鼠标移动了");
}
father1.onmouseenter = function(){
console.log("鼠标进入了1");
}
father1.onmouseleave = function(){
console.log("鼠标离开了1");
}
father2.onmouseover = function(){
console.log("鼠标进入了2");
}
father3.onmouseout = function(){
console.log("鼠标离开了3");
}
</script>
</body>
</html>
八、Event事件对象
1.Event对象属性
- Event.Target:返回事件当前所在节点
- Event.type:返回一个字符串,表示事件类型。事件的类型是在生成事件的时候。该属性只读
2.Event对象方法
- Event.preventDefault():取消浏览器对当前事件的默认行为。比如点击链接后,浏览器默认会跳转到另一个页面,使用这个方法以后,就不会跳转了
- Event.stopPropagation():阻止事件在 DOM 中继续传播,防止再触发定义在别的节点上的监听函数,但是不包括在当前节点上其他的事件监听函数
<!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>Document</title>
<style>
.root{
width: 200px;
height: 200px;
background-color: #999;
}
.box{
width: 100px;
height: 100px;
background-color:red;
}
</style>
</head>
<body>
<div class="root" id="root">
<div class="box" id="box"></div>
</div>
<script>
var root = document.getElementById("root")
var box = document.getElementById("box")
root.onclick = function(){
console.log("root");
}
box.onclick = function(e){
e.stopPropagation(); //如果注释掉这一行,点击box会打印root和box
console.log("box");
}
</script>
</body>
</html>
九、键盘事件
- keydown:按下键盘时触发。
- keypress:按下有值的键时触发,即按下 Ctrl、Alt、Shift、Meta 这样无值的键,这个事件不会触发。对于有值的键,按下时先触发keydown事件,再触发这个事件
- keyup:松开键盘时触发该事件
<!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>Document</title>
</head>
<body>
<input type="text" id="username">
<input type="text" id="password">
<script>
var username = document.getElementById("username");
username.onkeydown = function(e){
console.log("按下了");
}
username.onkeyup = function(e){
console.log(e.target.value); // value属性就是输入框的数据
}
// Ctrl、Alt、Shift、Meta :数字和字母是有值的,其他的无值
username.onkeypress = function(){
console.log("keypress");
}
var password = document.getElementById("password")
password.onkeyup = function(e){
//keyCode:代表每个按键的唯一标识
console.log(e.keyCode);
if(e.keyCode === 13){
console.log("开始搜索");
}
}
</script>
</body>
</html>
十、表单事件
- oninput事件:实时监听输入的数据
- onselect事件:选中的文本
- onChange事件:失去焦点和回车才会触发
- 这两个事件发生在表单对象 <form> 上,而不是发生在表单的成员上。
- onreset事件:清空表单
- onsubmit事件:提交表单
<!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>Document</title>
</head>
<body>
<input type="text" id="username">
<input type="text" id="password">
<script>
var username = document.getElementById("username");
username.oninput = function(e){
console.log(e.target.value); // 读取数据
}
username.onselect = function(){
console.log("选中了");
}
// 失去焦点和回车的时候触发
var password = document.getElementById("password")
password.onchange = function(e){
console.log(e.target.value);
}
</script>
</body>
</html>
<!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>Document</title>
</head>
<body>
<form action="服务器地址" id="myForm">
<input type="text" name="username">
<button id="resetBtn">重置</button>
<button id="submitBtn">提交表单</button>
</form>
<script>
var resetBtn = document.getElementById("resetBtn")
var myForm = document.getElementById("myForm")
var submitBtn = document.getElementById("submitBtn")
resetBtn.onclick = function(){
myForm.reset(); // 触发在表单上:清空表单
}
submitBtn.onclick = function(){
myForm.submit(); // 触发在表单上:提交表单
}
</script>
</body>
</html>
十一、事件代理(事件委托)
<!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>Document</title>
</head>
<body>
<list id="list">
<p>五元素</p>
<li>金</li>
<li>木</li>
<li>水</li>
<li>火</li>
<li>土</li>
</list>
<script>
var list = document.getElementById("list")
//点击事件发生在list列表中
// list.onclick = function(e){
// console.log(e.target.innerHTML);
// }
//点击事件只发生在li上
list.onclick = function(e){
if(e.target.tagName.toLowerCase() === "li"){
console.log(e.target.innerHTML);
}
}
</script>
</body>
</html>
十二、定时器
1.setTimeout()函数
用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器。
setTimeout(function(){
想要做的事情
},
毫秒数)
<!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>Document</title>
</head>
<body>
<script>
// setTimeout(() => {
// console.log("3秒之后执行");
// },3000)
//取消定时器
// clearTimeout(time)
// this永远指向当前调用者
// var username = "xiaohuihui"
// var user = {
// username:"xiyangyang",
// getName:function(){
// setTimeout(function(){
// console.log(this.username);
// },1000)
// }
// }
// user.getName(); //打印出来是:xiaohuihui
var username = "xiaohuihui"
var user = {
username:"xiyangyang",
getName:function(){
var that = this
setTimeout(function(){
console.log(that.username);
},1000)
}
}
user.getName();// 打印出来是:xiyangyang
</script>
</body>
</html>
2.setInterval()函数
十三、防抖和节流
1.防抖(debounce)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
h2{
height: 400px;
}
</style>
</head>
<body>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<script>
function debounce(fn,delay){
var time = null;
//闭包
return function(){
if(time){
clearTimeout(time)
}
time = setTimeout(fn,delay)
}
}
function showTop(){
var scrollTop = document.documentElement.scrollTop;
console.log(scrollTop);
}
window.onscroll = debounce(showTop,2000);
</script>
</body>
</html>
2.节流(throttle)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
h2{
height: 400px;
}
</style>
</head>
<body>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<h2>js学习倒计时芜湖</h2>
<script>
function throttle(fn,delay){
var valid = true;
return function(){
if(!valid){
return false;
}
valid = false;
setTimeout(function(){
fn();
valid = true;
},delay)
}
}
function showTop(){
var scrollTop = document.documentElement.scrollTop;
console.log(scrollTop);
}
window.onscroll = throttle(showTop,2000);
</script>
</body>
</html>
下面介绍一下平时开发中常遇到的场景 :
- 搜索框input事件,例如要支持输入实时搜索可以使用节流方案(间隔一段时间就必须查询相关内容),或者实现输入间隔大于某个值(如500ms),就当做用户输入完成,然后开始搜索,具体使 用哪种方案要看业务需求
- 页面resize事件,常见于需要做页面适配的时候。需要根据最终呈现的页面情况进行dom渲染(这 种情形一般是使用防抖,因为只需要判断最后一次的变化情况)