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. 【XSY2750】Mythological V 2-sat

    题目描述 有一棵\(n\)个点的树,还有\(m\)个物品. 你要把每个物品放在树上的一个点上(两个物品可以放在同一个点). 有\(q\)个限制:\(a,b\)两个物品在路上的最短路经过\(c\). 要 ...

  2. Haproxy 配置 ACL 处理不同的 URL 请求

    需求说明服务器介绍:HAProxy Server: 192.168.1.90WEB1 : 192.168.1.103WEB2 : 192.168.1.105Domain: tecadmin.net当用 ...

  3. Python变量与赋值

    Python是一门独特的语言,与C语言有很大区别,初学Python很多萌新表示对变量与赋值不理解,学过C的都知道,给变量赋值时,需要先指定数据类型,同时会开辟一块内存区域,用于存储值,例如: int ...

  4. Docker使用阿里云docker镜像加速

    首先进入阿里云docker库首页 https://dev.aliyun.com/ 点击 管理中心 点击 加速器 复制下面的加速地址 进入docker的 Settings 把basic 切换成 adva ...

  5. MVC接收列表参数

    ASP.NET  MVC 表单参数如果有列表时要怎么写呢. 虽然很久不用MVC了,但几乎每次遇到一次就要研究一下.然后又忘了. 其实也明白这是未完全弄清楚表单参数的传递形式,如果明白了,就知道MVC为 ...

  6. Bomb HDU - 5934 (Tarjan)

    #include<map> #include<set> #include<ctime> #include<cmath> #include<stac ...

  7. Java io概述

    内容来源:http://ifeve.com/java-io/ Java IO 概述 输入流可以理解为向内存输入,输出流可以理解为从内存输出 Java的IO包主要关注的是从原始数据源的读取以及输出原始数 ...

  8. A1057. Stack

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  9. spring整合redis连接

    两种连接方式:(写了一半,未测试) spring xml: <?xml version="1.0" encoding="UTF-8"?> <b ...

  10. firfox中"content-disposition", "attachment;filename=“+filename不能显示文件名字

    一般要在浏览器中显示文件名,可以使用以下文件名 // 设置文件名的编码方式,使得文件的名字能够正常安全的显示. filename = URLEncoder.encode(filename, " ...