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节点一(选择器,节点类型)的更多相关文章

  1. JS学习之DOM节点的关系属性封装、克隆节点、Dom中Style常用的一些属性等小结

    JS DOM节点: 在JS DOM中节点的关系被定义为节点的属性: 通常有以下几种节点之间的关系: (这里的关系是所有浏览器都支持的) parentNode    父节点 childNodes     ...

  2. js学习笔记--dom部分(一)

    js 学习整理之Dom部分 前面我总结了我最近学习js基础部分,当时提到过js分了三大部分,第一部分ECMA基础也就是第一次写的基础部分, 第二部分也就是DOM部分,也就是这里要写的内容的,然后第三部 ...

  3. js学习笔记14----DOM概念及子节点类型

    1.概念 DOM:Document Object Model---文档对象模型 文档:html页面 文档对象:页面中的元素 文档对象模型:是一种定义,为了能够让程序(js)去操作页面中的元素. DOM ...

  4. 原生js学习 选择dom

    连bootstrap5 都抛弃jquery了,重新使用原生js来写,所以最近在学习原生js. 一.选择dom元素: id let sure=document.getElementById('sure' ...

  5. 用vue.js学习es6(四):Symbol类型

    一.Symbol类型: 1.ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null. 布尔值(Boolea ...

  6. js学习总结:DOM节点二(dom基本操作)

    一.DOM继承树 DOM——Document Object Model DOM定义了表示修改文档所需要的方法.DOM对象即为宿主对象,由浏览器厂商定义,用来操作html和xml的一类厂商定义,也有人称 ...

  7. JS中的DOM— —节点以及操作

    DOM操作在JS中可以说是非常常见了吧,很多网页的小功能的实现,比如一些元素的增删操作等都可以用JS来实现.那么在DOM中我们需要知道些什么才能完成一些功能的实现呢?今天这篇文章就先简单的带大家入一下 ...

  8. 原生js快速渲染dom节点

    function renderDom(str){ var _div = document.createElement('div'); _div.innerHTML = str; var dom_tem ...

  9. Javascript高级编程学习笔记(35)—— DOM(1)节点

    DOM JS由三部分组成 1.BOM 2.DOM 3.ECMAScript ES和BOM在前面的文章已经介绍过了 今天开始JS组成的最后一部分DOM(文档对象模型) 我们知道,JS中的这三个部分实际上 ...

随机推荐

  1. php 部署在iis HTTP 错误 500.0 - Internal Server Error 无法在<fastCGI>应用程序配置中找到<handler> scriptProcessor

    原因,从A服务器复制一个部署在IIS上的PHP项目,根节点指向 publc/web.config 把里面涉及的  php路径改成正确的即可

  2. scrapy 发送post请求

    登录人人网为例 1.想要发送post请求,那么使用'scrapy.FormRequest'方法,可以方便的指定表单数据 2.如果想在爬虫一开始的时候就发送post请求,那么应该重写'start_req ...

  3. 【题解】 bzoj3916: [Baltic2014]friends (字符串Hash)

    题面戳我 Solution 首先长度为偶数可以直接判掉 然后我们可以枚举删的位置,通过预处理的\(hash\),判断剩余部分是否划分成两个一样的 判重要注意,我们把字符串分为三个部分\(L_l+1+L ...

  4. AtCoder 瞎做

    目录 ARC 058 E - 和風いろはちゃん / Iroha and Haiku 题意 题解 技巧 代码 ARC 059 F - バイナリハック / Unhappy Hacking 题意 题解 技巧 ...

  5. Leetcode 215. 数组中的第K个最大元素 By Python

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  6. open-falcon详解

    先扔出一张官方的架构图, agent是用于采集机器的监控指标,然后每60秒就会push给transfer,agent与transfer是建立了长连接的,传输速度会比较快: transfer接受到数据后 ...

  7. Write less code

    If you find yourself writing a lot of code to do something simple, you're probably doing it wrong. A ...

  8. luogu1196 银河英雄传说 (并查集)

    并查集,不仅记fa,还记与fa的距离,还记根对应的尾节点 路径压缩的时候更新那个距离就行了 #include<bits/stdc++.h> #define pa pair<int,i ...

  9. hdu3038How Many Answers Are Wrong(带权并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题解转载自:https://www.cnblogs.com/liyinggang/p/53270 ...

  10. 【CH6803】导弹防御塔

    题目大意:给定 N 座塔,M 个怪物,每座塔一次可以发射一枚导弹,发射导弹有发射时间和冷却时间,每座塔和每只怪物有自己的二维坐标,所有导弹有一个共同的速度,求至少需要多长时间才能将所有怪物消灭. 题解 ...