DOM,BOM
DOM(Document Object Model——文档对象模型)
DOM 介绍
**介绍:**什么是DOM,简单的说DOM是一套对文档的内容进行抽象和概念化的方法。DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API。DOM 是载入到浏览器中的文档模型,以节点树的形式来表现文档,每个节点代表文档的构成部分(例如:页面元素、字符串或注释等等)。DOM 是万维网上使用最为广泛的API之一,因为它允许运行在浏览器中的代码访问文件中的节点并与之交互。节点可以被创建,移动或修改。节点可以关联上事件处理器,一旦某一事件被触发了,那些事件处理器就会被执行。
DOM主要用于操作网页的标签内容,标签样式,标签属性,以及标签(增删改查)
DOM学习的最终目的 完成一些常见网页特效 轮播图 选项卡…
注意:DOM既不是HTML的一部分,也不是JavaScript一部分,而是浏览器厂商都实现了的一些独立的规则,并允许JavaScript可以访问和操作存储在DOM中的内容(DOM 也可以使用其他的语言来实现)
什么是DOM
文档对象模型(Document Object Model,简称DOM),是 W3C 组织推荐的处理可扩展标记语言(html或者xhtml)的标准编程接口。
W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。
事件基础
事件概述
JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。
简单理解: 触发— 响应机制。
- 网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个 事件,然后去执行某些操作。
事件三要素
- 事件源(谁):触发事件的元素
- 事件类型(做什么): 例如 onclick 点击事件
- 事件处理程序(怎么做):事件触发后要执行的代码(函数形式),事件处理函数
事件的绑定方式
- 事件的绑定方式有二种:动态绑定与行内绑定
动态绑定事件
说明: 在JS代码里面,动态给指定DOM元素绑定事件
动态事件绑定的步骤如下:
第一步:获取事件源(获取DOM对象)
第二步:注册事件(绑定事件)
第三步:添加事件处理程序(一般是一个匿名函数)
动态绑定语法
dom对象.on事件类型 = 匿名函数 或者 有名函数名
1
2
3
4
5
6
7
8btn1.onmouseover = function () {
console.log(2222);
}
function fn() {
console.log(3333);
}
btn1.onmouseout = fn;行内绑定事件
说明:所谓的行内绑定事件 是将事件写在HTML标签里面
HTML标签中自带一些事件属性 比如 onclick onmouseover等
DOM元素获取
- DOM把整个页面当做一个文档, DOM中最大的对象就是document对象
1 | console.log(document); |
- 如果想更好的查看某个对象的方法和属性, 可以使用
console.dir()
方法dir
是directory目录的简写
1 | console.dir(document); |
获取DOM元素的方法有如下:
根据ID获取元素
document.getElementById("id属性值")
; 返回值 单个DOM对象或者null1
2
3var oneDiv = document.getElementById("one");
console.log(oneDiv);
console.log(document.getElementById("two"));根据标签名获取元素
document.getElementsByTagName("标签名")
返回值是一个伪数组(类数组对象)1
2
3
4
5
6
7
8
9
10
11
12var objDivs = document.getElementsByTagName("div");
console.log(objDivs);
console.log("");
console.log(Array.isArray(objDivs));
console.log(objDivs.constructor === Array);
console.log(objDivs instanceof Array);
console.log("");
console.log(objDivs[0]);
console.log(objDivs[1]);
console.log(objDivs[2]);
console.log("");
console.log(objDivs.length);根据标签的name属性获取元素 返回值是一个伪数组
document.getElementsByName("name属性值")
1
2
3
4var username = document.getElementsByName("username");
console.log(username);
var usersex = document.getElementsByName("usersex");
console.log(usersex);H5新增获取元素方式 IE低版本浏览器不支持(IE678)
document.getElementsByClassName("class属性值")
返回值是一个伪数组1
2var objTwos = document.getElementsByClassName("two");
console.log(objTwos);document.querySelector("带符号的css选择器")
找到”第一个”符合CSS选择器的元素 🧡1
2
3
4
5console.log(document.querySelector("#one"));
console.log(document.querySelector(".two"));
console.log(document.querySelector("input[name='usersex']"));
console.log(document.querySelector("div"));
console.log(document.querySelector("ul li"));document.querySelectorAll("带符号css选择器")
找到”所有”符合CSS选择器的元素 🧡1
2
3
4
5console.log(document.querySelectorAll("ol li"));
console.log(document.querySelectorAll("dl dd"));
console.log(document.querySelectorAll("div"));
console.log(document.querySelectorAll(".two"));
console.log(document.querySelectorAll("#one"));另外, document对象可以尝试换成其他dom父对象, 表示从指定的dom父对象里面查找元素
1
2var objUl = document.querySelector("ul");
console.log(objUl.querySelectorAll("li"));
获取特殊元素( body,html )
获取body标签
document.body
1
console.log(document.body);
获取html标签
document.documentElement
1
console.log(document.documentElement);
常用事件
onchange事件
- 概念: onchange事件当用户更改<input>、<select>和<textarea> 元素的值并提交这个更改时,onchange 事件在这些元素上触发。和 oninput 事件不一样,onchange 事件并不是每次元素的 value 改变时都会触发。
参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLElement/change_event
1 | // 下拉框的onchange需要给select标签绑定 |
oninput事件
oninput 事件在用户输入时触发
该事件在 <input> 或 <textarea> 元素的值发生改变时触发。
提示: 该事件类似于 onchange 事件。不同之处在于 oninput 事件在元素值发生变化是立即触发,
oninput跟onchange事件的区别:
- onchange 在元素失去焦点时触发
- 在按快捷键ctrl+v粘贴的时候,onkeyup这个事件会触发两次, 但是oninput只触发一次;
- 鼠标右键粘贴,只能触发oninput事件以及onchange事件,不能触发onkeyup事件
1 | var textarea = document.querySelector("textarea"); |
常用键盘事件
键盘事件 触发条件
onkeyup 某个键盘按键被松开时触发
onkeydown 某个键盘按键被按下时触发
onkeypress 某个键盘按键被按下时触发 但是它不识别功能键 比如 ctrl shift 箭头等
注意:
- onkeypress和前面两个onkeyup跟onkeydown的区别是 onkeypress不识别功能键,比如箭头,ctrl,shift 等
- 三个事件的执行顺序是: keydown => keypress => keyup
键盘事件对象
键盘事件对象属性 说明
e.keyCode 返回该键的ASCII值 e.keyCode只有keypress事件可以区分大小写字母
e.key 返回用户按下的物理按键的键名
1 | // 获取dom对象 |
常用鼠标事件
鼠标事件 | 触发条件 |
---|---|
click | 鼠标点击左键触发 |
dblclick | 鼠标双击左键触发 |
mouseover | 鼠标移上触发 |
mouseout | 鼠标移出触发 |
mouseenter | 鼠标进入触发 |
mouseleave | 鼠标离开触发 |
mousemove | 鼠标移动触发 |
mouseup | 鼠标弹起触发 |
mousedown | 鼠标按下触发 |
focus | 获取鼠标焦点触发 |
blur | 失去鼠标焦点触发 |
mouseenter和mouseover的区别
以上两组事件,如果针对的是同一个元素,没有很大区别的
注意: onmouseover和onmouseout会事件冒泡
注意: onmouseenter和onmouseleave不会事件冒泡
scroll事件
scroll事件可以给元素绑定,可以给页面绑定
当元素滚动的时候,就可以触发scroll事件
1
2
3
4var div1 = document.getElementById("div1");
div1.onscroll = function () {
console.log("div1.scrollLeft=>", div1.scrollLeft);
}给页面绑定scroll事件, 可以给document对象, window对象或者body绑定页面滚动事件 一般给window对象绑定
注意: 给html对象绑定scroll事件无效
滚动窗口至文档中的特定位置
语法:
语法一: window.scroll(x-coord,y-coord )
语法二: window.scroll(options)
options 是一个包含三个属性的对象:
top 等同于 y-coord
left 等同于 x-coord
behavior 类型String,表示滚动行为,支持参数 smooth(平滑滚动),instant(瞬间滚动),默认值auto
注意:里面的x和y不需要带px单位 直接写数字即可
另外,还有一个window.scrollTo函数,实际上和 window.scroll是一样的
参考文档:
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scroll
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scrollTo
1 | window.scrollTo( 0, 1000 ); |
window对象的常见事件
页面(窗口)加载事件(两种)
- window对象的load事件 🧡
window.onload()
方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法。window.onload()
通常用于<body>
元素,在页面完全载入后(包括DOM结构, 图片、css文件等等)执行脚本代码- document对象的 DOMContentLoaded 事件
当初始HTML文档已完全加载和解析时,将触发 DOMContentLoaded 事件,而不需要等待样式表,图像和子框架页面加载(事件可以用来检测HTML页面是否完全加载完毕(fully-loaded))。
- 小结:
- DOMContentLoaded 事件绑定的时候, 需要使用事件监听方式绑定
- load事件需要等待HTML结构,CSS样式,图像等都加载完毕以后,再调用load的事件函数
- DOMContentLoaded 仅需要等待HTML结构加载完毕即可调用
调整窗口大小事件
window对象的resize事件 当浏览器可视区域大小发生变化的时候,就会调用resize事件
DOM对象操作
DOM对象操作双标签的标签内容
操作的意思就是可以获取也可以设置
方式一: dom对象.innerText
- innerText获取标签内容的时候,只有文本内容
- innerText设置内容的时候,无法解析HTML标签
1 | btns[0].onclick = function () { |
方式二: dom对象.innerHTML
- innerHTML获取标签内容的时候,会保留标签以及空格换行
- innerHTML设置内容的时候,可以解析HTML标签
1 | btns[1].onclick = function () { |
DOM对象操作表单元素属性
- **注意:**表单元素中有一些属性如:disabled、checked、selected,元素对象的这些属性的值是”布尔型”。
1 | var btns = document.querySelectorAll("button"); |
DOM对象操作样式
- 通过dom对象的style属性操作元素的”行内式样式”
设置单个CSS属性样式 只会覆盖同名属性
dom对象.style.CSS样式属性名 = “CSS样式属性值”;
同时设置多个CSS属性样式
dom对象.style = “css属性名1: css属性值1;css属性名2: css属性值2; css属性名3: css属性值3;…”
注意: 该方式会清空原来的行内式样式属性值
1 | var objDiv = document.querySelector("div"); |
通过DOM对象操作类名,从而操作标签的CSS样式
但是又由于JS中, class是ES6的一个关键字, 所以操作类名的时候 不是使用 dom对象.class 而使用 dom对象.className
1
2
3
4var objDiv = document.querySelector("div");
console.log(objDiv.id);
console.log(objDiv.class);
console.log(objDiv.className);
给dom对象设置类名语法 该方式会覆盖原来的类名
dom对象.className = “类名”;
dom对象.className = “类名1 类名2 类名3…”;
1 | btns[1].onclick = function () { |
H5新增了一种类名操作方式, 通过dom对象的classList属性操作类名
dom对象.classList.value 获取所有类名
dom对象.classList.add(“指定类名”) 添加指定类名 🧡
dom对象.classList.remove(“指定类名”) 删除指定类名 🧡
dom对象.classList.contains(“指定类名”) 判断是否含有指定类名 返回是布尔值
dom对象.classList.toggle(“指定类名”) 切换指定类名 有则删 无则加
1 | var btns = document.querySelectorAll("button"); |
排他操作
- 排他操作的意思就是先清除所有,再设置当前
1 | for (var i = 0; i < items.length; i++) { |
自定义属性操作
HTML除了一些内置属性之外,程序员还可以根据需要自定义一些属性, 自定义的属性建议以data-开头
获取自定义属性,也可以获取内置属性,但是获取类名的时候,需要使用class
dom对象.getAttribute(“自定义属性名或者内置属性名”)
1
2
3
4
5
6btns[2].onclick = function () {
console.log(objA.getAttribute("id"));
console.log(objA.getAttribute("className"));
console.log(objA.getAttribute("href"));
console.log(objA.getAttribute("data-index"));
};设置自定义属性,也可以设置内置属性,但是设置类名的时候,需要使用class
dom对象.setAttribute(“自定义属性名或者内置属性名”, “属性值”)
1
2
3
4
5
6
7btns[3].onclick = function () {
objA.setAttribute("id", "first");
objA.setAttribute("className", "dier");
objA.setAttribute("href", "https://www.jd.com");
objA.setAttribute("data-index", 4);
};删除属性(包括删除内置属性以及删除自定义属性)
dom对象.removeAttribute(“属性名”)
1
2
3
4
5
6btns[4].onclick = function () {
objA.removeAttribute("id");
objA.removeAttribute("href");
objA.removeAttribute("data-index");
};操作”自定义属性”,建议使用 setAttribute,getAttribute
操作”内置属性”,建议使用 dom对象.内置属性名
1
2
3
4
5
6
7
8
9
10btns[5].onclick = function () {
console.log("inputObj.checked=>", inputObj.checked);
console.log('inputObj.getAttribute("checked")=>', inputObj.getAttribute("checked"));
console.log("");
}
btns[6].onclick = function () {
// inputObj.checked = false;
inputObj.setAttribute("checked", false);
}
节点操作(操作DOM结构,添加标签,删除标签等)
节点概述
“网页中的所有内容都是节点”(元素节点、属性节点、文本节点、注释节点等),在DOM 中,节点使用 node 来表示
HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
一般地,节点至少拥有”nodeType(节点类型)”、”nodeName(节点名称)”和”nodeValue(节点值)”这三个基本属性。
nodeType节点类型常用值有以下3个:
元素节点 nodeType为1
属性节点 nodeType为2
文本节点 nodeType为3
补充内容:
通过dom对象.getAttributeNode(“属性名”) 方法从当前元素中通过名称获取属性节点。
父节点.firstChild 返回第一个子节点,找不到则返回null
1 | // 获取元素节点 |
节点操作
父级节点 🧡
节点.parentNode
子节点 🧡
获取所有子节点 了解
父节点.childNodes 返回包含指定节点的子节点的集合
获取子元素节点 🧡
父节点.children
获取第1个子节点
父节点.firstChild 返回第一个子节点,找不到则返回null
包含所有的节点,不管是文本节点还是元素节点
获取最后1个子节点
父节点.lastChild 返回最后一个子节点,找不到则返回null
包含所有的节点,不管是文本节点还是元素节点
获取第1个子元素节点 🧡
父节点.firstElementChild 返回第一个子元素节点,找不到则返回null
获取最后1个子元素节点 🧡
父节点.lastElementChild 返回最后一个子元素节点,找不到则返回null
兄弟节点
下一个兄弟节点
当前元素.nextSibling 返回当前元素的下一个兄弟节点, 找不到返回null 包含元素节点或者 文本节点等等
上一个兄弟节点
当前元素.previousSibling 返回当前元素的上一个兄弟节点, 找不到返回null 包含元素节点或者 文本节点等等
下一个兄弟元素节点(有兼容性问题) IE9以上才支持
当前元素.nextElementSibling 返回当前元素的下一个兄弟元素节点, 找不到返回null
上一个兄弟元素节点(有兼容性问题) IE9以上才支持
当前元素.previousElementSibling 返回当前元素上一个兄弟元素节点, 找不到返回null
创建节点 🧡
document.createElement(“标签名”) 注意: 该方法会返回一个新的”dom对象”
添加节点 🧡
父节点.appendChild(指定节点) 方法将一个节点添加到指定父节点的子节点列表末尾
父节点.insertBefore(节点,指定元素) 方法将一个节点添加到父节点的指定子元素前面
删除节点 🧡
父节点.removeChild(节点) 从父节点中删除一个子节点,返回值是被删除的节点
或者
指定节点.remove(); 删除指定节点
1 | btns[7].onclick = function () { |
复制(克隆)节点
节点.cloneNode( [布尔值] ) 克隆节点/拷贝节点 返回值是节点的一个副本
注意:
- 如果括号参数为空或者false,则是浅拷贝节点,即只克隆复制节点本身,不克隆里面的子节点
- 如果括号参数为true,则是深度拷贝节点,会复制节点本身以及里面所有的子节点
1 | var btns = document.querySelectorAll("button"); |
js动态创建元素的三种方式
区别:
- document.write是直接将内容写入页面的内容流,但是文档流已经执行完毕,则它会导致页面全部重绘
- innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘
- innerHTML创建多个元素效率更好(可以拼接字符串,也可以采取数组形式拼接),结构稍微复杂
- createElement()创建多个元素效率稍低一点点,但是结构更清晰
1 | // 举例: 使用三种不同方式创建100个a标签 |
根据数据动态生成表格
1 | // 数组 |
事件高级
传统注册方式(传统绑定方式)
传统绑定语法语法
dom对象.on事件类型 = 匿名函数 或者 有名函数名
传统绑定方式特点
- 同一个DOM对象绑定同一个类型事件多次, 后面绑定的事件驱动函数会覆盖前面绑定的
- 没有兼容性问题
- 事件驱动函数里面this指向绑定事件的那个DOM对象
1 | var div1 = document.getElementById("div1"); |
事件监听方式
语法
dom对象.addEventListener(“不带on的事件类型” , 匿名函数 或者 有名函数名 );
特点
- 同一个DOM对象绑定同一个类型事件多次, 会绑定顺序叠加触发事件驱动函数
- 有兼容性问题, IE9以及IE9以后的主流浏览器才可以使用该addEventListener监听方式
- 在事件驱动函数中,this指向绑定这个事件的DOM对象
1 | var div1 = document.getElementById("div1"); |
IE9之前事件监听方式 了解
语法
dom对象.attachEvent(“带on的事件类型”, 匿名函数 或者 有名函数名 )
特点
- 同一个DOM对象绑定同一个事件多次, 按绑定顺序的倒序叠加执行事件驱动程序
- 有兼容问题,需要低版本的IE浏览器才可以使用该绑定方式(IE 5 6 7 8 9 10)
- 事件驱动程序中this指向window对象
1 | var div1 = document.getElementById("div1"); |
删除事件(解绑事件)
解绑传统绑定的事件语法
dom对象.on事件类型 = null;
1
div1.onclick = null;
解绑addEventListener绑定的事件语法
dom对象.removeEventListener(“不带on事件类型”, 有名函数名 )
1
div2.removeEventListener("click", fn);
解绑attachEvent绑定的事件语法
dom对象.detachEvent(“带on事件类型”, 有名函数名 )
1
div3.detachEvent("onclick", fn4);
手动触发指定DOM对象的指定事件
语法一 手动触发传统绑定方式 要记
dom对象.on事件类型() 可以手动触发传统绑定的事件
比如:
dom对象.onclick();
1 | var objDiv = document.querySelector("div"); |
事件模型(DOM事件流)
事件
- 事件是HTML和Javascript交互的驱动器, 事件是文档或者浏览器窗口中发生的, 特定的交互瞬间。
- 事件是用户或浏览器自身执行的某种动作, 如 click, load 和 mouseover 都是事件的名字。
- 事件是 javaScript 和 DOM 之间交互的桥梁。
事件流
事件流, 即是一个事件发生的流程或者说流转, 从开始到结束, 都发生了什么
事件发生时会在元素节点之间按照特定的顺序传播, 这个传播过程, 我们就称之为DOM事件流.
事件流有三个阶段
- 捕获阶段 Capture Phase; 从上到下, 层层传递, 直到目标接收
- 目标阶段 Target Phase; 确认目标, 进行处理
- 冒泡阶段 Bubbling Phase; 处理结束, 往上传递.
先捕获阶段=>目标阶段=>冒泡阶段
注意: 监听绑定方式addEventListener()方法中第三个参数可以控制是在冒泡阶段触发还是在捕获阶段触发
注意:
- JS代码建议执行捕获或者冒泡两个阶段中的其中一个阶段
- 传统绑定事件方式跟attachEvent绑定事件的方式只能得到”冒泡阶段”
- addEventListener(type,listener,[,useCapture])第三个参数如果是true,表示在事件捕获阶段调用事件处理程序; 如果是false(默认不写就是false),表示事件冒泡阶段调用事件处理程序.
- 实际开发中我们很少使用事件捕获,我们更关注事件冒泡.
- 另外需要注意, 不是所有事件都会冒泡的, 有些事件是没有冒泡的,比如onmouseenter,onmouseleave
- 事件冒泡有时候会带来麻烦,有时候又会帮助我们很巧妙的做某些事件,我们会学习事件委托,事件委托(事件代理)的原理就是事件冒泡
冒泡阶段触发,需要HTML标签是”嵌套关系(父子关系)”, 而且需要都绑定事件, 接着,触发子元素事件(子元素事件不触发也可以)的时候, 会逐级向上传播, 把父辈元素相同的事件也会触发
逻辑与&& 以及 逻辑或|| 的高级用法
逻辑或 以及 逻辑与 的高级用法( 主要看&& || 前面第一个值转成布尔以后 是真值还是假值 )
&&逻辑与的高级用法 逻辑与,假前真后
只要”&&”前面类型转换以后的值为false,无论”&&”后面是true还是false,结果都将返”&&”前面的值;
只要”&&”前面类型转换以后的值为true,无论”&&”后面是true还是false,结果都将返”&&”后面的值;
1
2
3console.log(10 && "abc"); //abc
console.log(undefined && "abc"); //undefined
console.log(-5 && 6); //6||逻辑或的高级用法 逻辑或, 真前假后
只要”||”前面类型转换以后的值为false, 不管”||”后面是true 还是 false,都返回 “||” 后面的值。
只要”||”前面类型转换以后的值为true, 不管“||”后面是true 还是 false,都返回 “||” 前面的值。
1
2
3
4
5
6
7console.log(undefined || 123); // 123
console.log("" || 123); // 123
console.log(" " || 123); // " "
console.log(true || 123); // true
console.log(false || 123); // 123
console.log("abc" || 123); // "abc"
console.log(NaN || 456); // 456
事件对象的属性和方法
属性/方法 | 描述 |
---|---|
e.target | 返回触发事件的对象。标准属性。 🧡 |
e.srcElement | 返回触发事件的对象。非标准属性,IE6~8使用。 |
e.type | 返回事件的类型字符串,例如 “click”、”mouseover”,不包含”on”前缀。 |
e.stopPropagation() | 阻止事件冒泡的方法。标准方法。 🧡 |
e.cancelBubble = true | 阻止事件冒泡的属性,非标准属性,IE6~8使用。 |
e.preventDefault() | 阻止默认事件(默认行为)的方法。标准方法,例如阻止链接跳转。 🧡 |
e.returnValue = false | 阻止默认事件(默认行为)的属性,非标准属性,IE6~8使用。 |
event(事件对象)详解参考 https://www.cnblogs.com/websmile/p/8807334.html
阻止事件冒泡
1 | // 阻止事件冒泡兼容写法 |
阻止默认行为
默认行为的意思就是浏览器对于某些标签本身会有一些行为,比如a标签, 设置了href属性以后,点击a标签会跳转
1 | var myLink = document.getElementById("myLink"); |
事件委托
什么是事件委托(事件代理), 就是本身要给子元素绑定的事件, 不给子元素绑定, 而是给父辈元素绑定
事件委托的原理: 冒泡
事件委托的作用: 可以给动态新增的元素绑定事件
1 | objUl.onclick = function (e) { |
js三大家族属性
三大系列属性,这三个系列属性可以获取宽度高度以及相应的距离
注意: 三大系列属性返回值都是’数值’,不带单位, 只能”获取”,不能”设置”
元素可视区 client
属性 | 描述 |
---|---|
dom对象.clientWidth | width + 左padding + 右padding |
dom对象.clientHeight | height + 上padding + 下padding |
dom对象.clientLeft | 左边框的大小 |
dom对象.clientTop | 上边框的大小 |
[05-js三大家族-元素可视区 client.html](....\web\每日代码\25_DOM\05-js三大家族-元素可视区 client.html)
元素偏移量 offset
属性 | 描述 |
---|---|
dom对象.offsetWidth | 返回自身包括padding、边框、内容区的总宽度,返回数值不带单位,其实就是盒子的真实宽度 |
dom对象.offsetHeight | 返回自身包括padding、边框、内容区的总高度,返回数值不带单位,其实就是盒子的真实高度 |
dom对象.offsetParent | 返回作为该元素带有”非静态定位最近”的父辈元素,如果父辈元素都没有非静态定位则返回”body”元素 |
dom对象.offsetLeft | 返回元素相对带有”非静态定位最近”的父辈元素左方的偏移量,如果父辈都没有定位则返回相对”body”的”左”方偏移量 |
dom对象.offsetTop | 返回元素相对带有”非静态定位最近”的父辈元素上方的偏移量,如果父辈都没有定位则返回相对”body”的”上方”偏移量 |
元素滚动 scroll
属性 | 描述 |
---|---|
dom对象.scrollWidth | 返回自身实际的宽度,不含边框,返回数值不带单位 |
dom对象.scrollHeight | 返回自身实际的高度,不含边框,返回数值不带单位 |
dom对象.scrollLeft | 返回被卷去的左侧距离,返回数值不带单位 |
dom对象.scrollTop | 返回被卷去的顶部距离,返回数值不带单位 |
window.pageXOffset | html对象获取水平滚动条距离 IE9以及IE9以上主流浏览器可以使用 |
window.pageYOffset | html对象获取垂直滚动条距离 IE9以及IE9以上主流浏览器可以使用 |
body对象获取垂直滚动条距离
1
console.log("body对象获取垂直滚动条距离:" + document.body.scrollTop);
body对象获取水平滚动条距离
1
console.log("body对象获取水平滚动条距离:" + document.body.scrollLeft);
html对象获取垂直滚动条距离
1
console.log("html对象获取垂直滚动条距离:" + document.documentElement.scrollTop);
html对象获取水平滚动条距离
1
console.log("html对象获取水平滚动条距离:" + document.documentElement.scrollLeft);
封装一个兼容写法 获取页面滚动的距离
1
2
3
4
5
6function getScroll() {
return {
x: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
y: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
}
}
[10-js三大家族-元素滚动 scroll.html](....\web\每日代码\25_DOM\10-js三大家族-元素滚动 scroll.html)
鼠标事件对象
鼠标事件中常用的属性及其描述:
属性 | 描述 |
---|---|
e.clientX | 返回鼠标相对于浏览器窗口可视区(不包括滚动条距离)的X坐标 |
e.clientY | 返回鼠标相对于浏览器窗口可视区(不包括滚动条距离)的Y坐标 |
e.pageX | 返回鼠标相对于文档页面(包括滚动条距离)的X坐标,IE9+支持 |
e.pageY | 返回鼠标相对于文档页面(包括滚动条距离)的Y坐标,IE9+支持 |
e.offsetX | 返回鼠标指针相对于目标节点内边(元素内)位置的X坐标 |
e.offsetY | 返回鼠标指针相对于目标节点内边(元素内)位置的Y坐标 |
e.screenX | 返回鼠标相对于电脑屏幕的X坐标 |
e.screenY | 返回鼠标相对于电脑屏幕的Y坐标 |
注意: e.pageX/e.pageY 鼠标在页面中的位置 有兼容性问题 从IE9以后才支持
参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/MouseEvent
**扩展:**IE无法兼容pageX/pageY解决参考: https://www.cnblogs.com/mushuizzz/p/11847172.html
获取鼠标在盒子内的坐标
1 | var objDiv = document.querySelector("div"); |
获取计算以后样式属性值 window.getComputedStyle
通过 dom对象.style.css属性名 的方法获取的样式只能是行内式样式属性值 内嵌式和外链式样式都无法获取
获取计算以后样式属性值 window.getComputedStyle( element, [pseudoElt] ) 该方法返回一个对象
参数说明
- element 用于获取计算样式的Element, 就是DOM对象
- pseudoElt 可选 指定一个要匹配的伪元素的字符串。必须对普通元素省略(或null)。
参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/getComputedStyle
1 | console.log(window.getComputedStyle(myDiv)); |
[02-获取计算以后样式属性值 window.getComputedStyle.html](....\web\每日代码\26_DOM\02-获取计算以后样式属性值 window.getComputedStyle.html)
延时器和定时器
延时器和定时器的方法都属于window对象
参数说明
- function 是你想要在到期时间 (delay毫秒) 之后执行的函数。
- delay 延迟的毫秒数, 取值数值, 单位是毫秒 一秒等于 1000 毫秒
延时器, 延迟多久以后, “仅执行一次”指定的代码块
全局的 setTimeout() 方法设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码。
开启延时器语法
window.setTimeout( function, delay )
返回值timeoutID是一个正整数,表示延时器的编号。这个值可以传递给clearTimeout()来取消该延时器。
清除延时器语法
clearTimeout( timeoutID ) 方法取消了先前通过调用setTimeout()建立的定时器。
参数说明: timeoutID 您要取消定时器的标识符。该 ID 由相应的setTimeout()调用返回。
1 | var btns = document.querySelectorAll("button"); |
定时器, 每隔指定时间, 就执行一次指定的代码块 不断重复执行
setInterval() 方法重复调用一个函数或执行一个代码片段,在每次调用之间具有固定的时间间隔。
开启定时器语法
window.setInterval(function, delay);
返回值一个 interval ID,该 ID 唯一地标识时间间隔,因此你可以稍后通过调用 clearInterval() 来移除定时器。
清除定时器语法
window.clearInterval(intervalID);
1 | function fn() { |
顶级对象window
window对象是浏览器的顶级对象,它具有双重角色.
- 它是JS访问浏览器窗口的一个接口.
- 它是一个全局对象. 定义在全局作用域中的变量、函数会变成window对象的属性和方法
- 在调用的时候可以省略window, 比如我们前面学习alert(),prompt()都属于window对象的方法
- **注意:**window对象下有一个特殊属性window.name, window.name的属性值是一个字符串
- window.top属性也是window对象中一个内置属性, 它的属性值是指向回window对象自身 top属性值修改不了
避免使用name和top作为变量名
name作为变量名的时候, name的值一定会被改成字符串类型
1
2
3
4
5
6var name = 123;
console.log(name, typeof name);
var name = true;
console.log(name, typeof name);
console.log("");
console.log("");top变量名的值会一直指向window对象自身 修改不了
1
2
3
4
5
6
7
8console.log("top=>", top);
console.log("top === window =>", top === window);
var top = 10;
console.log("top=>", top);
var top = false;
console.log("top=>", top);
console.log("");
console.log("");
window对象的属性
属性 | 功能 |
---|---|
window.innerWidth | 获取浏览器内部的宽度,不包含浏览器的左右两边边框。 |
window.innerHeight | 获取浏览器内部的高度,不包含浏览器的菜单栏、地址栏以及上下的边框。 |
window.outerWidth | 获取整个浏览器的宽度,包括浏览器的边框。 |
window.outerHeight | 获取整个浏览器的高度,包括浏览器的边框。 |
确认框
1 | window.confirm("提示信息"); |
封装缓动框架
1 | // 封装一个获取计算以后样式属性值的方法 |
JSON数据格式
什么是JSON数据格式
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。由于其利于阅读和编写、同时也方便机器进行解析和生成。这使得JSON成为最理想的数据交换语言。
JSON数据格式的应用场景
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。由于其利于阅读和编写、同时也方便机器进行解析和生成。这使得JSON成为最理想的数据交换语言。
JSON格式的定义语法(定义JSON对象)
1
2
3
4
5
6
7{
"name":"Mark",
"age":18,
"mobile":"13586007445"
}JSON对象与JS对象的区别
JSON格式的数据,其键名必须使用”双引号”引起来
JSON格式的数据,”不能出现成员方法,只能是成员属性”
JSON格式的数据, 最后一个逗号不能写
注意:访问JSON对象的属性, 跟访问JS对象的属性方式一样
遍历JSON对象的属性, 跟遍历JS对象的属性方式一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 访问json对象属性
console.log(obj.id);
console.log(obj.name);
console.log(obj.age);
console.log(obj["id"]);
console.log(obj["name"]);
console.log(obj["age"]);
console.log("");
console.log("");
// 遍历json对象属性
for (var attr in obj) {
console.log("attr=>", attr);
console.log("obj[attr]=>", obj[attr]);
console.log("");
}JSON数组
JSON数组意思就是把JSON对象放在一个数组里面
JSON格式的字符串与JS对象的转换 🧡
json对象转成json字符串 JSON.stringify(json对象)
1
2var jsonStr = JSON.stringify(obj);
console.log(jsonStr, typeof jsonStr);json字符串转成json对象 JSON.parse(json字符串)
1
2var obj2 = JSON.parse(jsonStr);
console.log(obj2, typeof obj2);
BOM(Browser object model 浏览器对象模型)
BOM 介绍
- BOM( Browser object model 浏览器对象模型) 提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window对象。
- BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。
- BOM的构成; BOM 比 DOM 更大,因为它包含 DOM。
- BOM的核心对象是window, window包含document,location,navigator,screen,history
BOM中的location对象
什么是location对象
window对象给我们提供了一个location属性用于”获取”或”设置”浏览器的URL(网址),并且可以用于解析URL.因为这个属性返回的是一个对象,所以我们将这个属性也称为location对象
URL介绍 了解
统一资源定位符(Uniform Resource Locaotr,URL) 是互联网上标准资源的地址. 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它.(url可以简单理解为是某个网址)
URL的一般语法格式如下:
protocol://host[:port]/path/[?query]#fragment
例:https://www.mi.com/shop/buy/detail?product_id=10000203&selected=10000203#bottom
一个URL由以下几部分组成:
组成部分 说明 protocol
通信协议,常见的有 http://
、https://
、ftp://
等host
主机(域名),例如: www.mi.com
port
端口号,可选,省略时会使用默认端口,比如http协议默认端口为80; https协议默认端口为443 path
路径,由零个或多个 /
符号隔开的字符串,一般用来表示主机上的一个目录或者文件地址 比如”/shop/buy/detail”query
参数,以键值对的形式通过 & 符号分隔开 fragment
片段,以 # 后面的内容为标识,常见于链接的锚点
location对象的属性
属性 | 返回值 |
---|---|
location.href |
获取或设置URL 🧡 |
location.protocol |
获取通信协议,常见的有http: 、https: 等 |
location.host |
返回主机(域名) |
location.port |
返回端口号,如果没有写则返回空字符串 |
location.pathname |
返回路径 |
location.search |
返回参数 🧡 |
location.hash |
返回片段(# )后面的内容,常见于链接的锚点 |
location对象的常见方法
方法 | 返回值 |
---|---|
location.assign(网址) |
跳转页面并记录浏览历史,可实现后退功能 |
location.replace(网址) |
替换当前页面,不记录浏览历史,无法后退 |
location.reload() |
重新加载页面,相当于刷新,返回值为undefined |
location.reload(true) |
强制重新加载页面,无视缓存,返回值为undefined |
BOM中的history对象
window对象给我们提供了一个 history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL。
注意: 如果想要使用history对象,那么浏览器必须有历史记录
history对象方法
方法 | 功能 |
---|---|
history.back() |
后退到上一个页面 |
history.forward() |
前进到下一个页面 |
history.go(n) |
前进或后退n个页面,其中n为正值表示前进,n为负值表示后退 |
例:history.go(1)
代表前进一个页面; history.go(-1)
代表后退一个页面; 🧡
注意:
history.go(1)
等价于 history.forward()
history.go(-1)
等价于 history.back()
参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/History
BOM中的navigator对象
navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是 navigator.userAgent,该属性可以返回由客户机发送服务器的 user-agent 头部的值。(也就是返回当前浏览器的用户代理。)
参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator
BOM中的screen对象
参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Screen