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中的这三个部分实际上 ...
随机推荐
- [洛谷P2627] 修剪草坪
传送门:>Here< 题意:不能有连续超过$k$个奶牛的一段,求最大的和 思路分析 Dp还是容易看出来的. 我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率.其实这也是可以解的,具 ...
- C/C++ 程序库
C/C++ 程序库 // --------------------------------------------- 来几个不常见但是很变态的库吧: bundle: 把几乎所有常见的压缩库封装成了一个 ...
- 洛谷P3602 Koishi Loves Segments(贪心,multiset)
洛谷题目传送门 贪心小水题. 把线段按左端点从小到大排序,限制点也是从小到大排序,然后一起扫一遍. 对于每一个限制点实时维护覆盖它的所有线段,如果超过限制,则贪心地把右端点最大的线段永远删去,不计入答 ...
- Hdoj 2044.一只小蜜蜂... 题解
Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一 ...
- 【转】从此以后谁也别说我不懂LDO了!
LDO是个很简单的器件,但是我跟客户沟通的过程中,发现客户工程师的技术水平参差不齐,有的工程师只是follow 别人以前的设计,任何原理和设计方法都不懂,希望大家看完这篇文章都能成为LDO 专家. 第 ...
- bandwagon host
104.20.6.63 bandwagonhost.com 104.20.6.63 bwh1.net
- django restframework 环境配置
Requirements: coreapi (1.32.0+) - Schema generation support.Markdown (2.1.0+) - Markdown support for ...
- 使用zabbix监控mariadb性能状态
0x01 前言 zabbix内置Mysql的监控模版,因为mariadb和Mysql两者的相关性,所以这个模版也能用在mariadb services上. 0x02 Mysql 首先要在mariadb ...
- ArcGIS for qml -设置地图和视域中心
源码:https://github.com/sueRimn/ArcGIS-for-qml-demos 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载请获取授权和联系作者 ArcGIS R ...
- agc031
T1 题意:给你一个串,求所有子序列个数,满足没有相同字符.1e5,2s. 解:考虑一个合法的子序列.其中每个字母的出现位置都有(出现次数)种选择.还可以不选,要 + 1. 然后乘起来就做完了.如果变 ...