目录
document.getElementsByTagName():
document.getElementsByClassName():
Element.innerHTML和Element.innerText的区别:
数据类型:
JavaScript是一种动态语言,它并不需要明确的数据类型,声明类型通过var进行声明,js的数据类型总共有六种:数值型、字符串、布尔值、undefined、null、对象
这里我们重点将以下对象:
对象又称为合成类型/复合类型,对象可以包含所有数据类型,对象可以包含对象,可以看作是一个存放各种值的容器
变量:
变量的定义
var num = 10;
变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行代码。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,声明和赋值分离了,这就叫做变量提升(hoisting)。
typeof运算符
typeof运算符的作用是判断一个值是什么类型
数值返回number
typeof 123// "number"
字符串返回string
typeof '123'// "string"
布尔值返回boolean
typeof false// "boolean"
对象返回object
typeof {} // "object"
unll和undefined的区别
null与undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。既然含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加复杂度,令初学者困扰吗?这与历史原因有关
函数
函数的声明:
js的函数声明通过function命令声明,function后面是函数名,函数名后面是一对圆括号,圆括号可定义参数,圆括号后面跟着大括号,大括号里放着函数的代码
例子:
function print(s) {
console.log(s);
}
函数提升:
js将函数名视同变量名,当js编译时会将整个函数提升到代码头部,所以这就导致了我们可以先调用函数,然后再实现函数
add();
function add() {}
函数参数:
JavaScript的函数参数不需要给定类型
function square(x) {
console.log(x*x);
}
square(2) // 4
square(3) // 9-
对象
简单来说,对象就是一组“键值对”key-value的集合,是一种无序的复合数据集合,我们可以通过key获得key所对应的value值
对象的定义:
对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型、方法、对象。
var user = {
name:"一拳超人";
age:16;
add:function(a,b){
return a+b;
}
jobs = {
frontEnd:["Web前端","PHP"];
backEnd:["Java","C++"];
}
}
DOM
DOM是js操作网页的接口,全称为“Document Object Model”文档对象模型,它的作用是将网页转为一个JavaScript对象从而可以对网页进行操作
浏览器会根据 DOM 模型,将HTML解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。所有的节点和最终的树状结构,都有规范的对外接口
DOM 只是一个接口规范,可以用各种语言实现。所以严格地说,DOM 不是 JavaScript 语法的一部分,但是 DOM 操作是 JavaScript 最常见的任务,离开了 DOM,JavaScript 就无法控制网页。另一方面,JavaScript 也是最常用于 DOM 操作的语言
节点的类型有七种
Document:整个文档树的顶层节点
DocumentType:doctype标签
Element:网页的各种HTML标签
Attribute:网页元素的属性(比如class="right")
Text:标签之间或标签包含的文本
Comment:注释 DocumentFragment:文档的片段
document对象获取元素
document.getElementById():
返回匹配指定id属性的元素节点,如果没有匹配的则返回null
var ele = document.getElementById("id值");
document.getElementsByTagName():
返回匹配指定元素名的元素节点集,它的返回值是一个类似数组的对象(HTMLCollection),可以使用数组的方式访问该对象存放的匹配的元素节点,没有则返回一个空集
var ele = document.getElementsByTagName("元素名");
console.log(ele[0]);
document.getElementsByClassName():
返回匹配指定class名的元素集,它的返回值也是一个HTMLCollection对像,可以通过数组的方式访问该对象存放的匹配的元素节点
var ele = document.getElementsByClassName(class名);
console.log(ele[0]);
document.querySelector():
接收一个CSS选择器作为参数,返回匹配该选择器的元素节点,如果有多个结点匹配,则只返回第一个匹配的节点,如果没有匹配的节点返回null
document.querySelectorAll():
用法和querySelector函数一样,但是querySelectorAll函数返回匹配的结果集
document对象创建元素
document.createElement():
该方法用来生成元素节点,并返回该节点
var ele = document.createElement("元素名");
document.createTextNode():
该方法用来创建文本内容,参数是文本节点的内容
var text = document.createTextNode("文本内容");
document.createAttribute():
该方法生成一个新的属性节点
var att = document.createAttribute("属性名");
value:
属性值通过属性节点的value属性进行赋值
att.value = 属性值
setAttributeNode():
给元素节点添加属性通过setAttribute方法进行属性的添加
appendChild():
给元素添加内容通过appendChild方法实现
例子:创建元素p,内容为hello,添加class属性为p1,并将这个元素p添加到div元素中
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<style>
.box{
width: 200px;
height: 200px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box"></div>
<script>
//创建元素p
var ele = document.createElement("p");
//创建内容
var text = document.createTextNode("hello");
//将内容放入元素p中
ele.appendChild(text);
//创建属性
var att = document.createAttribute("class");
//设置属性值
att.value = "p1";
//将属性设置给元素p
ele.setAttributeNode(att);
//获取div元素
var div = document.getElementsByTagName("div")[0];
//将元素p放入div元素中
div.appendChild(ele);
console.log(div);
</script>
</body>
</html>
Element对象
我们通过document对象获取的元素或者创建的元素就是Element对象,可以将Element对象当做就是对应的元素,元素有属性那么Element对象也有属性,可以通过Element对象添加属性值给元素添加属性
Element.id:
该属性返回指定元素的id属性,该属性可以读写
// HTML 代码为 <p id="foo">
var p=document.querySelector('p');
Console.log(p.id)// "foo"
Element.className
该属性返回指定元素的class属性,它的值是一个字符串
<body>
<div class="box box1 box2"></div>
<script>
//通过Class获取对应的元素
var div = document.getElementsByClassName("box")[0];
//输出该元素的class属性
console.log(div.className);
//结果为:box box1 box2
</script>
</body>
Element.classList
classList对象有下列方法
- add():增加一个 class。
- remove():移除一个 class。
- contains():检查当前元素是否包含某个 class。
- toggle():将某个 class 移入或移出当前元素。
vardiv=document.getElementById('myDiv');
div.classList.add('myCssClass');
div.classList.add('foo', 'bar');
div.classList.remove('myCssClass');
div.classList.toggle('myCssClass'); // 如果 myCssClass 不存在就加入,否则移除
div.classList.contains('myCssClass'); // 返回 true 或者 false
<body>
<div class="box" id="box"></div>
<script>
//通过id获取对应的元素
var div = document.getElementById("box");
//添加class为box1
div.classList.add("box1");
//删除class名box
div.classList.remove("box");
//输出当前元素的class是否包含某个box。
console.log(div.classList.contains("box"));
//如果 box 不存在就加入,否则移除
div.classList.toggle("box");
console.log(div);
</script>
</body>
Element.innerHTML
可以给元素添加内容
<body>
<div class="box" id="box">asdf</div>
<script>
//获取对应id的Element对象
var div = document.getElementById("box");
//给该对象添加内容
div.innerHTML="waeifjkladsflfsl";
</script>
</body>
Element.innerText
可以个元素添加内容
<body>
<div class="box" id="box">asdf</div>
<script>
//获取对应id的Element对象
var div = document.getElementById("box");
//给该对象添加内容
div.innerText="waeifjkladsflfsl";
</script>
</body>
Element.innerHTML和Element.innerText的区别:
innerHTML是添加一条HTML语句,他可以识别标签
<body>
<div class="box" id="box">asdf</div>
<script>
//通过id获取对应的元素
var div = document.getElementById("box");
//给该元素添加内容(HTML语句)
div.innerHTML="<p>hello world!</p>";
//将该元素的结构打印出来
console.log(div);
</script>
</body>
innerText只是添加内容,会直接将代码渲染为字符串,而不会识别是否为HTML语句
<body>
<div class="box" id="box">asdf</div>
<script>
//通过id获取对应的元素
var div = document.getElementById("box");
//给该元素添加内容
div.innerText="<p>hello world!</p>";
//将该元素的结构打印出来
console.log(div);
</script>
</body>
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 | 到定位父级上边界的间距 |
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<style>
.box{
width: 200px;
height: 200px;
margin: 10px;
padding: 10px;
}
h3{
height: 500px;
}
</style>
</head>
<body>
<div class="box" id="box">
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
</div>
<script>
var box = document.getElementById("box");
//元素的高度:200px
console.log("元素高度(包括padding):"+ box.clientHeight);
console.log("元素宽度(包括padding):"+ box.clientWidth);
//页面的高度(内容撑开的部分)
console.log("元素总高度:"+box.scrollHeight);
console.log("元素总宽度:"+box.scrollWidth);
console.log("垂直高度:"+box.offsetHeight);
console.log("水平宽度:"+box.offsetWidth);
</script>
</body>
</html>
CSS操作
以上都是通过js完成HTML操作,那么如何使用js完成CSS操作呢?
1、操作 CSS 样式最简单的方法,就是使用网页元素节点的setAttribute方法直接操作网页元素的style属性
div.setAttribute(
'style','background-color:red;'+'border:1px solid black;'
);
2、通过元素节点的style属性赋值
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<style>
</style>
</head>
<body>
<div id="box"></div>
<script>
//通过id属性获取对应的元素对象的style属性
var box = document.getElementById("box").style;
//给box对应的元素对象的style属性的属性赋值
box.width = "200px";
box.height = "200px";
box.backgroundColor = "pink";
</script>
</body>
</html>
3、通过元素对象的属性的cssText属性添加css语句
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<div id="box"></div>
<script>
var box = document.getElementById("box").style;
box.cssText = "width:200px;height:200px;background-color:pink";
</script>
</body>
</html>
事件处理程序
HTML事件处理
在HTML的元素中设置属性οnclick=js里边设置的方法,现在我们设置的是鼠标事件,当我们点击鼠标时就会触发
缺点:HTML和js没有分开
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<button onclick="clickHandle()">按钮</button>
<script>
//缺点:HTML和JS没有分开
function clickHandle(){
console.log("点击了按钮");
}
</script>
</body>
</html>
DOM0级事件处理
通过js获取元素对象,通过元素对象的属性设置事件
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
var btn = document.getElementById("btn");
btn.onclick = function(){
console.log("点击了按钮");
}
</script>
</body>
</html>
但是DOM0级事件处理有一个缺点,就是无法添加两个相同的事件,相同事件会被覆盖
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
var btn = document.getElementById("btn");
btn.onclick = function(){
console.log("点击了按钮");
}
btn.onclick = function(){
console.log("点击了按钮1");
}
</script>
</body>
</html>
DOM2级事件处理
通过添加事件监听器实现事件处理
优点:相同的事件不会被覆盖
缺点:写的麻烦
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<button id="btn">按钮</button>
<script>
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
console.log("点击了按钮1");
});
btn.addEventListener("click",function(){
console.log("点击了按钮2");
})
</script>
</body>
</html>
鼠标事件
鼠标事件指与鼠标相关的事件,具体的事件主要有以下一些
- click:按下鼠标时触发
- dblclick:在同一个元素上双击鼠标时触发
- mousedown:按下鼠标键时触发
- mouseup:释放按下的鼠标键时触发
- mousemove:当鼠标在节点内部移动时触发。当鼠标持续移动时,该事件会连触发。
- mouseenter:鼠标进入一个节点时触发,进入子节点不会触发这个事件
- mouseleave:鼠标离开一个节点时触发,离开父节点不会触发这个事件
- mouseover:鼠标进入一个节点时触发,进入子节点会再一次触发这个事件
- mouseout:鼠标离开一个节点时触发,离开父节点也会触发这个事件
Event事件对象属性
实现事件触发的方法是有参数的,参数为Event,这个参数名任意,而这个参数的作用就是监听,当我们触发某个事件时,我们可以通过监听器阻止浏览器的一些默认行为
Event对象属性
- Event.Target
- Event.type
Event.target
Event.target属性返回事件当前所在的节点
// HTML代码为
// <p id="para">Hello</p>
function setColor(e) {
console.log(this===e.target);
e.target.style.color='red';
}
para.addEventListener('click', setColor);
Event.type
Event.type属性返回一个字符串,表示事件类型。事件的类型是在生成事件的时候。该属性只读
Event事件对象方法
通过Event监听器阻止浏览器默认行为,
例如:当我们点击超链接,浏览器会默认跳转到该链接,此时我们就可以通过Event对象的preventDefault()函数阻止浏览器的默认行为
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<a href="https://www.baidu.com/">百度</a>
<script>
var a = document.getElementsByTagName("a")[0];
a.onclick = function(e){
e.preventDefault();
console.log("点击了跳转,但我就不跳");
}
</script>
</body>
</html>
键盘事件
键盘事件由用户击打键盘触发,主要有keydown、keypress、keyup三个事件
- keydown:按下键盘时触发。
- keypress:按下有值的键时触发,即按下 Ctrl、Alt、Shift、Meta 这样无值的键,这个事件不会触发。对于有值的键,按下时先触发keydown事件,再触发这个事件。
- keyup:松开键盘时触发该事件
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<input type="text" id="text">
<script>
var box = document.getElementById("text");
box.onkeydown = function(){
console.log("键盘按下了");
}
box.onkeyup = function (e) {
console.log(e.target.value);
}
box.onkeypress = function(){
console.log("keypress");
}
</script>
</body>
</html>
事件代理
由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件的代理(delegation)
下方有一段代码,当我们点击子类的div时,父类的div事件也会触发
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<style>
#box1{
width: 200px;
height: 200px;
background-color: pink;
}
#box2{
width: 100px;
height: 100px;
background-color: red;
}
</style>
</head>
<body>
<div id="box1">
<div id="box2"></div>
</div>
<script>
var box1 = document.getElementById("box1");
var box2 = document.getElementById("box2");
box1.onclick = function(){
console.log("点击了box1");
}
box2.onclick = function(){
console.log("点击了box2");
}
</script>
</body>
</html>
所以此时我们就可以通过事件代理,完成通过父类解决子类的事件
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<ul id="ul">
<li>列表</li>
<li>列表</li>
<li>列表</li>
</ul>
</div>
<script>
var ul = document.getElementById("ul");
ul.onclick = function(e){
if(e.target.tagName==="LI"){
console.log("li被点击");
}
}
</script>
</body>
</html>
定时器:
setTimeout定时器
JavaScript 提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成。它们向任务队列添加定时任务
setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<script>
var time = setTimeout(function(){
console.log("执行1次");
}, 3000);
time;
</script>
</body>
</html>
三秒过后将会执行代码
setInterval定时器
setInterval定时器的使用方法和setTimeout定时器一样,但是setInterval的作用是每隔n秒执行1次,也就是说setInterval是无限次执行的
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<script>
var time = setInterval(function(){
console.log("执行1次");
}, 3000);
time;
</script>
</body>
</html>
防抖优化:
防抖属于性能优化的知识,但实际上遇到的频率相当高,处理不当或者放任不管就容易引起浏览器卡死。
从滚动条监听的例子说起
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<style>
h3{
height: 500px;
}
</style>
</head>
<body>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<script>
function showTop() {
var scrollTop=document.documentElement.scrollTop;
console.log('滚动条位置:'+scrollTop);
}
//滚动条监听,当我们滑动滚动条时就会触发该监听
window.onscroll=showTop
</script>
</body>
</html>
当我稍微滑动一下滚动条就会触发n多次该事件,那么这样子就会造成浏览器性能的下降
实现原理:
通过一个引用将setTimeout定时器封装起来,当我们要执行改代码时,这个引用就会等于这个定时器,此时timer就是有值的,如果我们再次执行shake这个方法,那么timer此时不为null
if语句判断为true,进入if语句清空前面的定时器,然后再次调用定时器执行该方法
意思其实就是:当我们一直触发该条件时,就不会一直执行代码,而是清除上次的定时器,然后重新开始计时
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<style>
h3{
height: 500px;
}
</style>
</head>
<body>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<script>
function shake(fn,delay){
var timer = null;
return function(){
if(timer){
clearTimeout(timer);
}
timer = setTimeout(fn,delay);
}
}
function showTop() {
var scrollTop = document.documentElement.scrollTop;
console.log('滚动条位置:'+scrollTop);
}
//滚动条监听,当我们停止滑动滚动条0.3秒后就会触发该监听
window.onscroll=shake(showTop,300)
</script>
</body>
</html>
防抖定义
对于短时间内连续触发的事件(上面的滚动事件),防抖的含义就是让某个时间期限(如上面的1000毫秒)内,事件处理函数只执行一次
节流优化:
还是使用滚动事件的例子,如果用户想要的需求是,就算一直滑动滚动条,也会触发滚动事件,每隔n秒触发一次
大家重点看注释部分,通过注释部分可以很好的理解这段代码是如何实现的
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<style>
h3 {
height: 500px;
}
</style>
</head>
<body>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<h3>标题</h3>
<script>
function shake(fn, delay) {
var flag = true;
//以上厕所为例,
//此时如果flag为true,那么厕所没有人
return function () {
if (!flag) {
return false;
}
//如果flag为true,那么顺利进入上厕所
//进入了厕所得锁门吧,所以需要将flag设置为false
flag = false;
//上厕所
setTimeout(function(){
//上厕所
fn();
//上完厕所打开门,将flag转为true
flag = true;
}, delay);
}
}
function showTop() {
var scrollTop = document.documentElement.scrollTop;
console.log('滚动条位置:' + scrollTop);
}
window.onscroll = shake(showTop, 500)
</script>
</body>
</html>
滑动滚动条过后