目录
前面学习的JS分为三大部分:
WebAPI就包括了DOM和BOM,API是一个广义的概念,而WebAPI是一个更具体的概念,指DOM+BOM,所谓API的本质就是一些现成的函数/对象,程序员可直接拿来用,方便开发
DOM全称为Document Object Model
W3C标准为我们提供了一些列函数,使得我们可以操作:网页内容,网页结构,网页样式
DOM树:一个页面的结构是一个树形结构,称为DOM树
页面结构

DOM树结构

重要概念:
这部分工作类似CSS选择器功能
使用querySelector能够完全复用前面所学的CSS选择器知识,达到更快捷更精准的方式获取到元素对象
var element = document.querySelector(selector);
说明:获取页面的一个selector标签元素,如果有多个相同的标签,则匹配第一个
- <body>
- <div>
- <span>span>
- div>
- <p>111p>
- <p>222p>
- body>
- <script>
- var div = document.querySelector("div");
- var p = document.querySelector("p");
- console.log(div);
- console.log(p);
- script>

注意:querySelector可以被任何元素调用,不仅仅是document,调用这个方法的元素将作为本次查找的根元素
- <script>
- var div = document.querySelector("div");
- var span = div.querySelector("span");
- console.log(span);
- script>

与querySelector不同的是querySelectorAll获得与之匹配的页面所有的元素,以数组的形式保存
- <body>
- <div id="i1">111div>
- <div id="i2">222div>
- body>
- <script>
- var divArr = document.querySelectorAll("div");
- console.log(divArr);
- script>

JS要构建动态页面,就需要感知用户的行为,用户对页面的一些操作(点击,选择,修改等)都会在浏览器中产生一个个事件,被JS获取到,从而进行更复杂的交互操作
事件的三要素:
示例:点击按钮,弹出“你好”的警示窗口
- <body>
- <input type="button" value="按钮">
- body>
- <script>
- var btu = document.querySelector("input");
- btu.onclick = function(){
- alert("你好");
- }
- script>


注意:这个匿名函数是一个回调函数,当事件发生后,由浏览器自动调用
Element.innerText表示获取一个节点及其后代渲染的文本内容
示例:获取元素的内容
- <body>
- <div>
- <p>111p>
- <p>222p>
- div>
- body>
- <script>
- var div = document.querySelector("div");
- console.log(div.innerText);
- script>

示例:修改元素的内容
- <body>
- <p>111p>
- <span>span>
- <div>div>
- body>
- <script>
- var p = document.querySelector("p");
- p.innerText = "333"; //将p中的111改为333
- var span = document.querySelector("span");
- span.innerText = "444"; //给span中填444
- var div = document.querySelector("div");
- div.innerText = "555"
- script>

从中可以发现innerText无法获得div内部的html结构,只能得到文本内容,修改元素内容时,也会把span标签当作文本内容进行设置
Element.innerHTML会设置或获取html语法表示的元素的后代
示例:获取页面元素
- <body>
- <div>
- <span>111span>
- <span>222span>
- <span>333span>
- div>
- body>
- <script>
- var div = document.querySelector("div");
- console.log(div.innerHTML);
- script>

示例:修改元素内容
- <body>
- <p>111p>
- <div>div>
- body>
- <script>
- var p = document.querySelector("p");
- p.innerHTML = "222"; //将p中的111修改为222
- var div = document.querySelector("div");
- div.innerHTML = "1
2"; - script>

从中可以看到,innerHTML不光能获取到页面的html结构,也能修改结构,并且获取的内容保留空格和换行
使用console.dir()可以打印对象属性
示例:获取一张图片的属性
- <body>
- <img src="1.jpg" alt="小女孩儿">
- body>
- <script>
- var img = document.querySelector("img");
- console.dir(img);
- script>

我们可以直接通过这些属性获取属性值
示例:直接获取图片路径和alt
- <body>
- <img src="1.jpg" alt="小女孩儿">
- body>
- <script>
- var img = document.querySelector("img");
- console.log(img.src);
- console.log(img.alt);
- script>

还可以直接修改属性
示例:点击切换图片
- <body>
- <img src="1.jpg" width="400px" height="300px">
- body>
- <script>
- var img = document.querySelector("img");
- img.onclick = function(){
- if(img.src.lastIndexOf("1.jpg")!=-1){
- img.src = "2.jpg";
- }else {
- img.src = "1.jpg";
- }
- }
- script>

表单主要是指input标签的以下属性都可以通过DOM来修改
input具有一个重要的属性value,value决定了表单元素的内容,如果是输入框,value表示输入框的内容,修改这个值会影响到界面显示,如果是按钮,value为按钮的内容,可以通过value来实现按钮中文本的切换
示例:点击替换按钮的文本,在“播放”,“暂停”之间切换
- <body>
- <input type="button" value="播放">
- body>
- <script>
- var inp = document.querySelector("input");
- inp.onclick = function(){
- if(inp.value=="播放"){
- inp.value = "暂停";
- }else {
- inp.value = "播放";
- }
- }
- script>

示例:点击计数
使用一个输入框输入初始值,每次点击,值+1
- <body>
- <input type="text" id="text" value="0">
- <input type="button" id="button" value="点击">
- body>
- <script>
- var text = document.querySelector("#text");
- var button = document.querySelector("#button");
- button.onclick = function(){
- var num = text.value;
- num++;
- text.value = num;
- }
- script>

示例:全选/取消全选按钮
- <body>
- <input type="checkbox" id="all">全选
- <input type="checkbox" class="ball">篮球
- <input type="checkbox" class="ball">足球
- <input type="checkbox" class="ball">排球
- <input type="checkbox" class="ball">棒球
- body>
- <script>
- var all = document.querySelector("#all");
- var balls = document.querySelectorAll(".ball");
- //实现全选,或者取消全选
- all.onclick = function(){
- for(var i = 0;i < balls.length;i++){
- balls[i].checked = all.checked;
- }
- }
- //查看是否全部选中
- function ischeckAll(){
- for(var i = 0;i < balls.length;i++){
- if(!balls[i].checked){
- return false;
- }
- }
- return true;
- }
- //每选一个判断是否全选,若已经全选,则勾选全选,若无则不勾选全选
- for(var i = 0;i < balls.length;i++){
- balls[i].onclick = function(){
- if(ischeckAll()){
- all.checked = true;
- }else {
- all.checked = false;
- }
- }
- }
- script>

CSS中的元素属性都可以通过JS来修改
element.style.[属性名] = [属性值];
style中的属性都是使用驼峰命名方式和CSS属性对应的,例:font-size---fontSize,background-color---backgroundColor
示例:点击修改文字颜色和修改文字大小
- <body>
- <div style="color: red; font-size: 1em;">我爱学习div>
- body>
- <script>
- var div = document.querySelector("div");
- div.onclick = function(){
- if(div.style.color!="blue"){
- div.style.color = "blue";
- div.style.fontSize = "2em";
- }else {
- div.style.color = "red";
- div.style.fontSize = "1em";
- }
- }
- script>
通过修改元素CSS样式的类名,来切换不同的场景
element.className = [CSS 类名];
示例:点解切换“日间”,“夜间”模式
- <body>
- <div class="d1">
- 窗前明月光<br>
- 疑是地上霜<br>
- 举头望明月<br>
- 低头思故乡<br>
- div>
- body>
- <script>
- var div = document.querySelector("div");
- div.onclick = function(){
- if(div.className=="d1"){
- div.className = "d2";
- }else {
- div.className = "d1";
- }
- }
- script>
- <style>
- .d1 {
- color: black;
- background-color: whitesmoke;
- }
- .d2 {
- color: white;
- background-color: black;
- }
- style>

新增分为两步:
使用createElement方法创建一个元素
示例
- <body>
-
- body>
- <script>
- var div = document.createElement("div");
- div.id = "mydiv";
- div.innerHTML = "哈哈";
- console.log(div);
- script>
![]()
发现虽然div标签创建成功了,但是没有在页面上显示出来,原因就是我们还没有将其插入到DOM树中
上面是创建元素节点,还可以创建:
使用appendChild将节点插入到指定节点的最后一个孩之后
语法:element.appendChild(aChild)
示例:
- <body>
- <div id="d1">
- <div>111div>
- <div>222div>
- div>
- body>
- <script>
- var div = document.createElement("div");
- div.id = "mydiv";
- div.innerHTML = "哈哈";
- var div1 = document.querySelector("#d1");
- div1.appendChild(div);
- script>

使用insertBefore将节点插入到指定节点之前
语法:parentNode.insertBefore(newNode,referenceNode)
说明:
如果referenceNode为null,则newNode将被插入子节点的末尾
示例:
- <body>
- <div id="d1">
- <div>111div>
- <div>222div>
- <div>333div>
- <div>444div>
- div>
- body>
- <script>
- var div = document.createElement("div");
- div.id = "mydiv";
- div.innerHTML = "哈哈";
- var div1 = document.querySelector("#d1");
- div1.insertBefore(div,div1.children[0]);
- script>

注意:如果一个节点插入两次,则只有最后一次生效
- <body>
- <div id="d1">
- <div>111div>
- <div>222div>
- <div>333div>
- <div>444div>
- div>
- body>
- <script>
- var div = document.createElement("div");
- div.id = "mydiv";
- div.innerHTML = "哈哈";
- var div1 = document.querySelector("#d1");
- div1.insertBefore(div,div1.children[0]);
- div1.insertBefore(div,div1.children[2]);
- script>
使用removeChild删除子节点
语法:oldChild = element.removeChild(chid);
示例:
- <body>
- <div id="i1">
- <div>111div>
- <div>222div>
- <div>222div>
- <div>333div>
- div>
- body>
- <script>
- var i1 = document.querySelector("#i1");
- i1.removeChild(i1.children[2]);
- script>
