目录
API和Web API
DOM
DOM基本概念
DOM树
获取元素
根据ID获取
根据标签名获取
根据类名获取
querySelector()
querySelectorAll()
获取特殊元素(body、html)
三种动态创建元素区别
事件基础
事件三要素
执行事件的步骤
操作元素
改变元素内容
操作元素属性
修改表单属性
修改样式属性
H5自定义属性
节点操作
节点基本概念
利用节点层级关系获取元素
父级节点:
子节点:
兄弟节点
创建节点
删除节点
复制节点
DOM总结
API是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用就可以了,不必纠结内部部何实现
Web API是浏览器提供的一套操作浏览器功能和页面元素的API( BOM和DOM)。Web API一般都有输入和输出(函数的传参和返回值),WebAPI很多都是方法(函数)
现阶段我们主要针对于浏览器讲解常用的API,主要针对浏览器做交互效果。
MDN详细API : https://developer.mozilla.org/zh-CN/docs/Web/API
文档对象模型(Document Object Model,简称DOM ),是W3C组织推荐的处理可扩展标记语言(HTML或者XML )的标准编程接口。
W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。
DOM把以上内容都看做是对象
DOM在我们实际开发中主要用来操作元素。我们如何来获取页面中的元素呢?
获取页面中的元素可以使用以下几种方式:
Document 接口的
getElementById()
方法返回一个表示 id 属性与指定字符串相匹配的元素的 Element 对象。由于元素的 ID 在指定时必须是独一无二的,因此这是快速访问特定元素的有效方法。参数:id
所要查找的元素的 ID。ID 是大小写敏感的字符串,且在文档中是唯一的;应只有一个元素具有任何给定的 ID。
返回值:元素对象
返回一个表示与指定 ID 相匹配的 DOM 元素的 Element 对象。若在当前文档中没有找到匹配的元素,则返回
null
。
getElementsByTagName()返回一个包括所有给定标签名称的元素的 HTML 集合HTMLCollection。整个文件结构都会被搜索,包括根节点。返回的
HTML 集合
是动态的,意味着它可以自动更新自己来保持和 DOM 树的同步而不用再次调用document.getElementsByTagName()
。var elements = document.getElementsByTagName(name);
还可以获取某个元素(父元素)内部所有指定标签名的子元素.
elements = element.getElementsByTagName(tagName);
注意∶父元素必须是单个对象(必须指明是哪一个元素对象),获取的时候不包括父元素自己。
getElementsByClassName()返回一个包含了所有指定类名的子元素的类数组对象。当在 document 对象上调用时,会搜索整个 DOM 文档,包含根节点。你也可以在任意元素上调用getElementsByClassName() 方法,它将返回的是以当前元素为根节点,所有指定类名的子元素。
var elements = document.getElementsByClassName(names); // or:
var elements = rootElement.getElementsByClassName(names);
querySelector()
querySelector()
方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。如果找不到匹配项,则返回null
。
element = document.querySelector(selectors);
切记里面的选择器要加符号,类以.开头,id以#开头。
这个例子中,会返回当前文档中第一个类名为 "myclass
" 的元素:
var el = document.querySelector(".myclass");
这个例子中,会返回当前文档中第一个id名为 "myid
" 的元素:
var el = document.querySelector("#myid");
querySelectorAll()
返回与指定的选择器组匹配的文档中的元素列表 (使用深度优先的先序遍历文档的节点)。返回的对象是 NodeList 。
要获取文档中所有
元素的NodeList。
var matches = document.querySelectorAll("p");
使用Document.body
获取body元素
使用Document.documentElement
获取html元素
document.write ()
element.innerHTML
document.createElement ()
区别
总结:不同浏览器下,innerHTML,效率要比 creatElement高
JavaScript使我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为。
简单理解︰触发---响应机制。
网页中的每个元素都可以产生某些可以触发JavaScript的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。
事件源:事件被触发的对象
事件类型:如何触发 什么事件(比如鼠标点击、鼠标经过、键盘按下)
事件处理程序:通过一个函数赋值的方式来完成
1.获取事件源
2注册事件(绑定事件)
3.添加事件处理程序(采取函数赋值形式)
举一个简单的例子:
var btn=document.getElementById('btn');
btn.onclick = function(){
alert("我被点击了");
}
常见的鼠标事件
JavaScript的DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性等。注意以下都是属性
element.innerText和element.innerHTML(推荐)可以用来改变元素内容,还可以读取元素中的内容。
div.innerText = "今天是: 2019";
div.innerHTML = "今天是: 2019";
console.log(p.innerText);console.log(p.innerHTML);效果分别为:
两者区别:
element.innerText不识别 html标签,读取元素内容时会去掉html标签,同时空格和换行也会去掉
element.innerHTML能够识别 html标签,读取元素内容时保留html标签、空格和换行
1、获取属性值
二者区别:
2、设置属性值
二者区别:
3、移除属性
element.removeAttribute('属性');
操作元素属性代码:
Document
例子:以src为例,点击明星名字,展示其帅照。
Document
点击刘德华:显示
点击张学友,显示:
使用DOM可以操作如下表单元素的属性:
type、 value、checked、 selected、disabled
表单里面的值 文字内容需要通过 value 来修改
Document
密码表单默认看不见,实现点击按钮显示密码,再点击隐藏看不见
Document
我们可以通过JS修改元素的大小、颜色、位置等样式。
样式比较少的时候,可以使用 element.style 获得修改元素样式;
语法:元素.style.样式属性
注意∶
1.Js里面的样式采取驼峰命名法,比如:fontSize、backgroundColor
2.JS修改style样式操作,产生的是行内样式,css权重比较高
Document
样式比较多的时候,我们就需要写很多行,很麻烦
this.style.backgroundColor = 'purple';
this.style.color = '#fff';
this.style.fontSize = '25px';
this.style.marginTop = '100px';
在这种情况下,我们可以把这些样式写在一个类里,再通过 element.className来修改元素样式
Document
文本
如果想要保留原先的类名,我们可以这么做 多类名选择器
this.className = 'first change';
关闭二维码案例
Document
淘宝二维码
×
防新浪注册页面
思路:
首先判断的事件是表单失去焦点 onblur
如果输入正确:则提示正确的信息颜色为绿色、小图标变化
如果输入不是6到16位:则提示错误信息颜色为红色 、小图标变化
因为里面变化样式较多,我们采取className修改样式
Document
自定义属性目的∶是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
自定义属性获取是通过getAttribute ( '属性')获取。
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。H5给我们新增了自定义属性︰
1.设置H5自定义属性
H5规定自定义属性data-开头做为属性名并且赋值。
比如
或者使用JS设置
element.setAttribute( 'data-index’,2)
2.获取H5自定义属性
1. 兼容性获取 element.getAttribute( 'data-index’); 都能获取,且兼容性好
2. H5新增element.dataset.index或者element.dataset[ 'index' ] (不用加data咯)只能获取data开头的自定义属性,ie11才开始支持
如果自定义属性里面有多个-连接的单词,我们用H5新增方法获取的时候采取 驼峰命名法
比如
1.兼容性获取
console.log(div.getAttribute('data-list-name'))
2.H5新增方法 自定义属性里面有多个 - 连接的单词,采用驼峰命名法
console.log(div.dataset.listName);
console.log(div.dataset['listName']);
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示。
HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。
一般地,节点至少拥有nodeType(节点类型) 、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
我们在实际开发中,节点操作主要操作的是元素节点(也就是标签)
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
node.parentNode
parentNode.childNodes
parentNode. childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合。
注意:返回值里面包含了所有的子节点,包括元素节点,文本节点等。
如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes
★ parentNode.children
parentNode.children是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回(这个是我们重点掌握的)。
虽然children是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用。
parentNode.firstChild
parentNode.lastChild
firstChild 返回第一个子节点,lastChild返回最后一个节点,找不到返回null。是包含所有的节点(包括元素节点,文本节点等)。
parentNode.firstElementChild
parentNode.lastElementChild
firstElementChild返回第一个子元素节点,lastElementChild返回最后一个子元素节点。
这两个方法ie9以上才能使用。
实际开发中的写法:既没有兼容性问题又能返回第一个\最后一个子元素节点。
console.log(ol.children[0]);
console.log(ol.children[ol.children.length - 1]);
1.node.nextSibling
2.node.previousSibling
nextsibling返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。previoussibling返回当前元素上一个兄弟节点,找不到则返回null。同样,也是包含所有的节点
3.node.nextElementSibling
4.node.previousElementsibling
nextElementsibling返回当前元素下一个兄弟元素节点,找不到则返回null。previousElementsibling返回当前元素上一个兄弟元素节点,找不到则返回null。
这两个方法存在兼容性问题,IE9以上才能用。
document.createElement( 'tagName ' )
document.createElement()方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。
添加节点
1. node .appendchild (child)
node.appendchild()方法将一个节点添加到指定父节点的子节点列表末尾。类似于css里面的after伪元素。
2. node.insertBefore(child,指定元素)
node.insertBefore()方法将一个节点添加到父节点的指定子节点前面。类似于css里面的 before伪元素。
node.removeChild (child);
node.removeChild()方法从DOM中删除一个子节点,返回删除的节点。
node.cloneNode ()
node.cloneNode()方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点
注意∶
1.如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
⒉.如果括号参数为true ,则是深度拷贝,会复制节点本身以及里面所有的子节点。
关于dom操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。