js学习总结:DOM节点一(选择器,节点类型)
DOM:document object model 文档对象模型
DOM就是整个HTML文档的关系图谱(代表整个HTML文档),可以理解为下图:

一、查看元素节点
1.document.getElementById('元素id') 获取的类型:元素对象;
兼容性:a.IE6、7,会把表单元素input的name属性当做ID来使用;
b.IE8以下的浏览器,不区分id大小写
注意事项:
a.没有获取到元素返回null
b.后端抽取会改变id名称,实际开发不使用id选择器来操作元素节点
2.document.getElementsByTagName('元素标签名') 获取的类型:元素对象类数组
使用:可以通过限定查找范围来获取元素列表。context.getElementByTagName('元素标签名')
3.context.getElementsByName(‘name属性’) 获取的类型:元素对象类数组
兼容性:IE浏览器下只由表单元素和部分元素有效(表单、表单元素、img、iframe),且老版本浏览器不支持。
4.context.getElementsByCalssName('类名的值') 获取的类型:元素对象类数组
兼容性:IE6~8不支持
5.document.querySelector('css选择器') 获取的类型:元素对象类数组
兼容性:IE6、7没有这个方法
6.document.querySelectorAll('css选择器') 获取的类型:元素对象类数组
兼容性:同上。
注意:不是时时的元素节点,删除添加标签都不被检测
在众多原生DOM选择中,似乎每个都存在缺陷,综合考虑最合适被应用到实际开发中的选择器就是getElementByClassName();但由于IE6~8不兼容,所以需要做一些兼容处理,下面是兼容处理的代码:
function getElementsByClass(className,context){
context = context || document;
//把传递进来的样式类名的首尾空格先去掉,然后在按照中间的空格把里面的每一项拆分成数组
var classNameAry = className.replace(/(^ +| +$)/g,"").split(/ +/g);
//获取指定上下文中的所有的元素标签,循环这些标签,获取每一个标签的className样式类名的字符串
var ary = [];
var nodeList = context.getElementsByTagName("*");
for(var i = 0,len=nodeList.length;i<len;i++){
var curNode = nodeList[i];
//判断curNode.className是否包含classNameAry里面的样式值
//
var isOk = true;//我们假设curNode
for(var k = 0;k<classNameAry.length;k++){
var curName = classNameAry[k];
var reg = new RegExp("(^| +)"+curName+"( +|$)");
if(!reg.test(curNode.className)){
isOk = false;
break;
}
}
if(isOk){//拿每一个标签分别和所有样式类名比较后,如果结果还是true的话,说明当前元素标签包含了所有的样式,也是我们想要的。
ary.push(curNode)
}
}
return ary;
}
二、节点树
| node.parentNode | 返回元素的父节点对象;例如HTML元素的父节点是document | 节点对象 |
| element.childNodes | 返回所有子节点对象列表 | 节点对象类数组 |
| node.fistChild | 返回第一个子节点对象 | 节点对象 |
| node.lastChild | 返回最后一个节点对象 | 节点对象 |
| node.nextStibling | 返回后一个兄弟节点对象 | 节点对象 |
| node.previousSibling | 返回前一个兄弟节点对象 | 节点对象 |
注意:以上方法都是基于节点查询,会将所有节点类的节点型访问出来,不会区分元素节点。(查询元素节点可以参考下一个知识点“遍历元素节点树”)
三、遍历元素节点树
| element.parentElement | 返回当前节点的父节点元素对象(IE9以下不兼容) | 元素节点对象 |
| element.children | 返回当前节点的元素子节点对象列表(IE9以下不兼容) | 元素节点对象类数组 |
| element.childElementCount | 返回当前节点的元素子节点的个数同等于node.children.length | number |
| element.firstElementChild | 返回当前节点的第一个元素子节点对象(IE9以下不兼容) | 元素节点对象 |
| element.lastElementChild | 返回当前节点的最后一个元素子节点对象(IE9以下不兼容) | 元素节点对象 |
| element.nextElmentSibling | 返回当前节点的前一个元素节点对象(IE9以下不兼容) | 元素节点对象 |
| element.previousElementSibling | 返回当前节点的后一个元素节点对象(IE9以下不兼容) | 元素节点对象 |
四、节点类型及节点属性
| 类型名称 | nodeName | nodeValue | nodeType | attributes |
| 元素节点 | 大写的标签名(字符串类型) | null | 1 | 元素节点的属性集合 |
| 属性节点 | .... | .... | 2 | ..... |
| 文本节点 | "#text" | 标签符号间的文本(带Tab) | 3 | undefined |
| 注释节点 | "#comment" | 注释文本 | 8 | undefined |
| document | "#document" | null | 9 | undefined |
| documentFragment | 11 |
注意:
a)documentFragment——文档片段对象
b) 属性节点从文档树形逻辑来说不能与其他节点一起放到这里,被放到这里的原因主要是因为展示nodeType属性。
到这里可能你还不明白属性节点是什么?
从document文本结构来说,属性节点是元素节点的子节点,该节点的内容就是所在元素的所有属性的节点集合。请看示例代码:
<div class="div1" id="div1" style="color:blue;text-align:center"> </div>
<script type="text/javascript">
var div = document.getElementsByTagName("div")[0];
var atts = div.attributes;
console.log(atts);
</srcipt>
在来看看打印的结果

从打印结果来看,元素节点的attributes属性获取了元素所有的属性列表,并以类数组的方式保存。
属性节点上同样存在nodeName、nodeType、nodeValue等属性。
五、封装自己的元素子节点集合
由于element.children子元素节点列表属性的兼容性非常不好(IE9以下都不兼容),所以建议封装一个自己的获取元素子节点集合的方法,下面是封装代码。
function retElementChild(node){
var temp = {
length : 0,
push : Array.prototype.push,
splice : Array.prototype.splice
},
child = node.childNodes,
len = child.length;
for (var i = 0; i < len; i++) {
if (child[i].nodeType === 1) {
temp.push(child[i]);
}
}
return temp;
}
js学习总结:DOM节点一(选择器,节点类型)的更多相关文章
- JS学习之DOM节点的关系属性封装、克隆节点、Dom中Style常用的一些属性等小结
JS DOM节点: 在JS DOM中节点的关系被定义为节点的属性: 通常有以下几种节点之间的关系: (这里的关系是所有浏览器都支持的) parentNode 父节点 childNodes ...
- js学习笔记--dom部分(一)
js 学习整理之Dom部分 前面我总结了我最近学习js基础部分,当时提到过js分了三大部分,第一部分ECMA基础也就是第一次写的基础部分, 第二部分也就是DOM部分,也就是这里要写的内容的,然后第三部 ...
- js学习笔记14----DOM概念及子节点类型
1.概念 DOM:Document Object Model---文档对象模型 文档:html页面 文档对象:页面中的元素 文档对象模型:是一种定义,为了能够让程序(js)去操作页面中的元素. DOM ...
- 原生js学习 选择dom
连bootstrap5 都抛弃jquery了,重新使用原生js来写,所以最近在学习原生js. 一.选择dom元素: id let sure=document.getElementById('sure' ...
- 用vue.js学习es6(四):Symbol类型
一.Symbol类型: 1.ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null. 布尔值(Boolea ...
- js学习总结:DOM节点二(dom基本操作)
一.DOM继承树 DOM——Document Object Model DOM定义了表示修改文档所需要的方法.DOM对象即为宿主对象,由浏览器厂商定义,用来操作html和xml的一类厂商定义,也有人称 ...
- JS中的DOM— —节点以及操作
DOM操作在JS中可以说是非常常见了吧,很多网页的小功能的实现,比如一些元素的增删操作等都可以用JS来实现.那么在DOM中我们需要知道些什么才能完成一些功能的实现呢?今天这篇文章就先简单的带大家入一下 ...
- 原生js快速渲染dom节点
function renderDom(str){ var _div = document.createElement('div'); _div.innerHTML = str; var dom_tem ...
- Javascript高级编程学习笔记(35)—— DOM(1)节点
DOM JS由三部分组成 1.BOM 2.DOM 3.ECMAScript ES和BOM在前面的文章已经介绍过了 今天开始JS组成的最后一部分DOM(文档对象模型) 我们知道,JS中的这三个部分实际上 ...
随机推荐
- ☆ [HDU4825] Xor Sum「最大异或和(Trie树)」
传送门:>Here< 题意:给出一个集合,包含N个数,每次询问给出一个数x,问x与集合中的一个数y异或得到最大值时,y是多少? 解题思路 由于N,M非常大,暴力显然不行.抓住重点是异或,所 ...
- Codeforces715 B. Complete The Graph
传送门:>Here< 题意:给出一张带权无向图,其中有一些边权为0.要求将边权为0的边的边权重置为一个任意的正整数,使得从S到T的最短路为L.判断是否存在这种方案,如果存在输出任意一种 解 ...
- 用贝叶斯定理解决三门问题并用Python进行模拟(Bayes' Rule Monty Hall Problem Simulation Python)
三门问题(Monty Hall problem)也称为蒙提霍尔问题或蒙提霍尔悖论,出自美国的电视游戏节目<Let’s Make a Deal>.问题名字来自该节目的主持人蒙提·霍尔(Mon ...
- 华为Python 算法面试题
华为算法面试题 """ 算法题: 提供一个序列,完成对这个序列的分割.要求分割后的两个序列彼此差值最小 实现函数,返回两个序列 """ de ...
- MT【279】分母为根式的两个函数
函数$f(x)=\dfrac{3+5\sin x}{\sqrt{5+4\cos x+3\sin x}}$的值域是____ 分析:注意到$f(x)=\sqrt{10}\dfrac{5\sin x+3}{ ...
- Apache 跟踪用户会话
打开usertrack_module LoadModule usertrack_module modules/mod_usertrack.so 配置跟踪选项 <IfModule usertrac ...
- 【比赛】NOIP2018 赛道修建
最小值最大,二分长度 然后判断赛道大于等于这个长度最多可以有多少条 可以贪心,对于一个点和它的一些儿子,儿子与儿子之间尽量多配(排序后一大一小),剩下的选个最长的留给自己的父亲就好了 具体实现可以用一 ...
- CF932E Team Work(第二类斯特林数)
传送门:CF原网 洛谷 题意:给定 $n,k$,求 $\sum\limits^n_{i=1}\dbinom{n}{i}i^k\bmod(10^9+7)$. $1\le n\le 10^9,1\le k ...
- 状压DP总结
状态压缩就是将一行的状态压成一个二进制数,这个数的二进制形式反映了这一行的情况 比如0100111的意义为:这一排的第一个数没被使用,第二个被占用了,第三四个没被占用,第五六七个被占用 我们知道位运算 ...
- Python3 与 C# 基础语法对比(Function专栏)
Code:https://github.com/lotapp/BaseCode 多图旧版:https://www.cnblogs.com/dunitian/p/9186561.html 在线编程: ...