什么是DOM javascript
DOM:文档对象模型。DOM 为文档提供告终构化表示,并定义了如何经过脚原本访问文档结构。目的其实就是为了能让js操做html元素而制定的一个规范。css
DOM就是由节点组成的html
解析过程 java
HTML加载完毕,渲染引擎会在内存中把HTML文档,生成一个DOM树,getElementById是获取内中DOM上的元素节点。而后操做的时候修改的是该元素的属性.node
DOM 数(一切都是节点) ios
上图可知,在HTML当中,一切都是节点:(很是重要)数组
元素节点:HMTL标签。浏览器
文本节点:标签中的文字(好比标签之间的空格、换行)app
属性节点::标签的属性。ide
整个html文档就是一个文档节点。全部的节点都是Object。
DOM能够作什么
● 找对象(元素节点)
● 设置元素的属性值
● 设置元素的样式
● 动态建立和删除元素
● 事件的触发响应: 事件源 , 事件 , 事件的驱动程序
DOM节点的获取
DOM节点的获取方式其实就是 获取事件源的方式.
操做元素节点,必须首先找到该节点,有三种方式获取DOM节点 :
<div id="box1" class="box"></div> <script> //方法一 : 经过 id 获取单个标签 var div1 = document.getElementById("box1"); // 方法二 : 经过 标签名 获取标签数组 ,有 s var arr1 = document.getElementsByTagName("div"); // 方法三 : 经过 类名 获取标签数组,因此有 s var arr2 = document.getElementsByClassName("box"); </script>
由于 方法二 / 方法三 获取的是标签数组,那么要先遍历以后再使用.
特殊状况 : 数组中的值只有1个 , 即便如此,这个值也是包在数组里的,因此这个值获取方法 :
<div id="box1" class="box"></div> // 获取数组中的第一个元素 var arr1 = document.getElementsByTagName("div")[0]; //获取数组中的第一个元素 var arr2 = document.getElementsByClassName("box")[0];
<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); ////不支持 // var ele3=div1.getElementById("div3"); // alert(ele3.length); ////不支持 // var ele4=div1.getElementsByName("yuan"); // alert(ele4.length) </script>
DOM访问关系的获取
DOM的节点并非孤独的,所以能够经过DOM节点之间的相对关系对他们进行访问.以下 :
节点的访问关系,是以属性的方式存在的.
JS中的 父子兄 访问关系 :
节点树种的节点彼此拥有层级的关系 :
父(parent),子(child),兄(sibling) 等来描述这些关系.父节点拥有子节点.同级的子节点被称为同胞(兄弟或者姐妹).
获取父节点
调用者就是节点.一个节点只有一个父节点.调用方法 :
<div id="father"> <div id="laoda"></div> <div id="laoer"></div> </div> <script> var oLaoda = document.getElementById('father'); var.a = oLoda.parentNode // 获取父节点 </script>
节点.parentNode // 调用父节点 nextsibling // 下一个节点(包括标签/空文档/换行节点) nextElementsibling // 下一个元素节点(标签) 综合属性 : 下一个兄弟节点 = 节点.nextElementSibling || 节点.nextSibling previousSibling // 前一个节点(包括标签/空文档/换行节点) previousElementSibling // 前一个元素节点(标签) 综合节点 : 前一个兄弟节点 = 节点.previousElementSibling || 节点.previousSibling 节点本身.parentNode.children[index]; //随意获得兄弟节点 firstChild // 第一个子元素节点(标签) firstElementChild //第一个子元素节点(标签) lastChild / lastElementChild //最后一个子元素节点 children / childNodes // 获取因此的子节点 ***** 子节点数组 = 父节点.children; //获取全部节点。用的最多。
注意 : nodeType ==1 表示的是元素节点(标签) . 元素就是标签
★★★★★★ DOM 节点的操做
节点的访问关系都是属性
节点的操做都是属性(方法)
建立节点
格式以下 :
新的标签(元素节点) = document.createElement("标签名"); //例如 : var tag = document.creatElement("input"); tag.setAttribute("type","text");
示例 : 好比咱们要建立一个一个 li 标签,或者是建立一个不存在的 abcd 标签:
<script type="text/javascript"> var a1 = document.createElement("li"); var a2 = document.createElement("abcd"); console.log(a1); console.log(a2); console.log(typeof a1); console.log(typeof a2); </script>
结果 :
插入节点
插入节点的方式有两种,分别有不一样的含义 :
方式一 :
父节点.appendChild(新的子节点); // 父节点的最后插入一个新的子节点
方式二 :
父节点.insertBrfore(新的子节点,做为参考的子节点); // 在参考点钱插入一个新的节点 // 若是参考节点为 null(空),那么他将在父节点最后插入一个子节点
删除节点
父节点.removeChild(子节点); // 用父节点删除子节点,必需要指定删除那个子节点
若是想删除本身这个节点 :
node1.parentNode.ramoveChild(node1);
复制节点(克隆节点)
要复制的节点.cloneNode(); 要复制的节点.cloneNode(true);
括号内带不带参数,效果是不同的 :
不带参数 / 带参数 false : 值复制节点自己,不复制子节点.
带参数 true : 即复制节点自己,也复制其全部的子节点.
替换节点
父节点.replaceChild(newnode,某个节点)
节点属性操做
1. 获取本节点的值 : innerText innerHTML
2. attribute 操做
elementNode(元素节点).setAttribute(name(属性名),value(新的属性值)) //设置节点属性值 elementNode.getAttribute(属性名) <-------------->elementNode.属性名(DHTML) elementNode.removeAttribute(“属性名”); //删除节点属性
3 . value 获取当前选择的value值
1 . input
2 . select (selectedindex)
3 . textarea
4 . innerHTML 给节点添加 html 代码 :
该方法不是 w3c 的标准, 可是主流浏览器支持
tag.innerHTML = "<p>要显示的内容</p>";
5 . 关于 class 操做
elementNode.className
elementNode.classList.add
elementNode.classList.remove
6 . 改变 css 样式 :
<p id="p2">Hello world!</p>
document.getElementById("p2").style.color="blue";
.style.fontSize=48px
JavaScript的组成
JavaScript 基础分红三部分 :
(1) . ECMAScript:JavaScript的语法标准。包括变量、表达式、运算符、函数、if语句、for语句等。
(2) . DOM:文档对象模型,操做网页上的元素的API。好比让盒子移动、变色、轮播图等。
(3) . BOM:浏览器对象模型,操做浏览器部分功能的API。好比让浏览器自动滚动。
事件
JS是以事件驱动为核心的一门语言。
事件三要素
事件的三要素:事件源、事件、事件驱动程序。
好比,我用手去按开关,灯亮了。这件事情里,事件源是:手。事件是:按开关。事件驱动程序是:灯的开和关。
再好比,网页上弹出一个广告,我点击右上角的X
,广告就关闭了。这件事情里,事件源是:X
。事件是:onclick。事件驱动程序是:广告关闭了。
因而咱们能够总结出:谁引起的后续事件,谁就是事件源。
总结以下:
事件源:引起后续事件的html标签。
事件:js已经定义好了(见下图)。
事件驱动程序:对样式和html的操做。也就是DOM。
代码书写步骤以下:(重要)
(1)获取事件源:document.getElementById(“box”); //相似与ios语言的 UIButton *adBtn = [UIButton buttonWithType:UIButtonTypeCustom];
(2)绑定事件: 事件源box.事件onclick = function(){ 事件驱动程序 };
(3)书写事件驱动程序:关于DOM的操做
代码举例:
<body> <div id="box1"></div> <script type="text/javascript"> // 一、获取事件源 var div = document.getElementById("box1"); // 二、绑定事件 div.onclick = function () { // 三、书写事件驱动程序 alert("我是弹出的内容"); } </script> </body>
事件类型
onclick 当用户点击某个对象时调用的事件句柄。
ondblclick 当用户双击某个对象时调用的事件句柄。
onfocus 元素得到焦点。 练习:输入框
onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,表明已经输入完了,咱们能够对它进行验证.
onchange 域的内容被改变。 应用场景:一般用于表单元素,当元素内容被改变时触发.(三级联动)
onkeydown 某个键盘按键被按下。 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress 某个键盘按键被按下并松开。
onkeyup 某个键盘按键被松开。
onload 一张页面或一幅图像完成加载。
onmousedown 鼠标按钮被按下。
onmousemove 鼠标被移动。
onmouseout 鼠标从某元素移开。
onmouseover 鼠标移到某元素之上。
onmouseleave 鼠标从元素离开
onselect 文本被选中。
onsubmit 确认按钮被点击。
针对事件的三要素
1. 获取事件源 的方式(DOM节点的获取)
var div1 = document.getElementById("box1"); //方式一:经过id获取单个标签 var arr1 = document.getElementsByTagName("div1"); //方式二:经过 标签名 得到 标签数组,因此有s var arr2 = document.getElementsByClassName("hehe"); //方式三:经过 类名 得到 标签数组,因此有s
2 . 绑定事件的方式 :
方式一 : 直接绑定匿名函数
<div id="box1" ></div> <script type="text/javascript"> var div1 = document.getElementById("box1"); //绑定事件的第一种方式 div1.onclick = function () { alert("我是弹出的内容"); } </script>
方式二 : 先单独定义函数,在绑定
<div id="box1" ></div> <script type="text/javascript"> var div1 = document.getElementById("box1"); //绑定事件的第二种方式 div1.onclick = fn; //注意,这里是fn,不是fn()。fn()指的是返回值。 //单独定义函数 function fn() { alert("我是弹出的内容"); } </script>
注意上方的注释.绑定的时候,写 fn 而不是写 fn() , fn 表明的是整个函数, fn()表明的是返回值
方式 三 : 行内绑定
<!--行内绑定--> <div id="box1" onclick="fn()"></div> <script type="text/javascript"> function fn() { alert("我是弹出的内容"); } </script>
注意第一行代码,绑定时,是写的"fn()"
,不是写的"fn"
。由于绑定的这段代码不是写在js代码里的,而是被识别成了字符串。
3 . 事件驱动程序 :
<style> #box { width: 100px; height: 100px; background-color: pink; cursor: pointer; //把鼠标变成小手的模样 } </style> </head> <body> <div id="box" ></div> <script type="text/javascript"> var oDiv = document.getElementById("box"); //点击鼠标时,本来粉色的div变大了,背景变红了 oDiv.onclick = function () { oDiv.style.width = "200px"; //属性值要写引号 oDiv.style.height = "200px"; oDiv.style.backgroundColor = "red"; //属性名是backgroundColor,不是background-Color } </script>
上方代码的注意事项:
backgroundColor
,不是CSS里面的background-Color
。记得全部的像css属性的text-*,line-*、backgroun-*等在js中都写成驼峰onload 事件
当页面加载(文本和图片)完毕的时候,触发onload事件。
举例:
<script type="text/javascript"> window.onload = function () { console.log("小马哥"); //等页面加载完毕时,打印字符串 } </script>
有一点咱们要知道:js的加载是和html同步加载的。所以,若是使用元素在定义元素以前,容易报错。这个时候,onload事件就能派上用场了,咱们能够把使用元素的代码放在onload里,就能保证这段代码是最后执行。
建议是:整个页面上全部元素加载完毕在执行js内容。因此,window.onload能够预防使用标签在定义标签以前。
示例 : 当鼠标悬停在img上时,更换为另一张图片;鼠标离开时,还原为原本的图片。
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script> //window.onload页面加载完毕之后再执行此代码 window.onload = function () { //需求:鼠标放到img上,更换为另外一张图片,也就是修改路径(src的值)。 //步骤: //1.获取事件源 //2.绑定事件 //3.书写事件驱动程序 //1.获取事件源 var img = document.getElementById("box"); //2.绑定事件(悬停事件:鼠标进入到事件源中当即出发事件) img.onmouseover = function () { //3.书写事件驱动程序(修改src) img.src = "image/jd2.png"; // this.src = "image/jd2.png"; } //1.获取事件源 var img = document.getElementById("box"); //2.绑定事件(悬停事件:鼠标进入到事件源中当即出发事件) img.onmouseout = function () { //3.书写事件驱动程序(修改src) img.src = "image/jd1.png"; } } </script> </head> <body> <img id="box" src="image/jd1.png" style="cursor: pointer;border: 1px solid #ccc;"/> </body> </html>