深入理解DOM节点类型第六篇——特性节点Attribute
前面的话
元素的特性在DOM中以Attr类型表示,从技术角度讲,特性是存在于元素的attributes属性中的节点。尽管特性是节点,但却不是DOM节点树的一部分。本文将详细介绍该部分内容
特征
特性节点的三个node属性————nodeType、nodeName、nodeValue分别是2、特性名称和特性值,其父节点parentNode是null
[注意]关于特性节点是否存在子节点,各个浏览器表现不一致
- <div id="box"></div>
- <script>
- var oBox = document.getElementById('box');
- var oAttr = oBox.attributes;
- //(chrome\safari\IE9+\firefox) 2 id box null
- //(IE7-) 2 onmsanimationiteration null null
- console.log(oAttr[0].nodeType,oAttr[0].nodeName,oAttr[0].value,oAttr[0].parentNode)
- //(chrome\firefox) undefined
- //(safari) Text
- //(IE9+) box
- //(IE8-) 报错
- console.log(oAttr[0].childNodes[0])
- </script>
属性
Attr特性节点有3个属性:name、value和specified
name
name是特性名称,与nodeName的值相同
value
value是特性的值,与nodeValue的值相同
specified
specified是一个布尔值,用以区别特性是在代码中指定的,还是默认的。这个属性的值如果为true,则意味着要么是在HTML中指定了相应特性,要么是通过setAttribute()方法设置了该属性。在IE中,所有未设置过的特性的该属性值都为false,而在其他浏览器中,所有设置过的特性的该属性值都是true,未设置过的特性,如果强行为其设置specified属性,则报错。因为undefied没有属性
- <div class="box" id="box"></div>
- <script>
- var oBox = document.getElementById('box');
- var oAttr = oBox.attributes;
- //(chrome\safari\IE8+)class class true
- //(firefox)id id true
- //(IE7-)onmsanimationiteration onmsanimationiteration true
- console.log(oAttr[0].name,oAttr[0].nodeName,oAttr[0].name == oAttr[0].nodeName)
- //IE7- "null" null false
- //其他浏览器 box box true
- console.log(oAttr[0].value,oAttr[0].nodeValue,oAttr[0].value == oAttr[0].nodeValue)
- //IE7- false
- //其他浏览器 true
- console.log(oAttr[0].specified)//true
- </script>
- <div class="box" id="box" name="abc" index="123" title="test"></div>
- <script>
- var oBox = document.getElementById('box');
- console.log(oBox.attributes.id.specified)//true
- console.log(oBox.attributes.onclick.specified)//在IE7-浏览器下会返回false,在其他浏览器下会报错
- </script>
specified常常用于解决IE7-浏览器显示所有特性的bug
- <div class="box" id="box" name="abc" index="123" title="test"></div>
- <script>
- function outputAttributes(element){
- var pairs = new Array(),attrName,attrValue,i,len;
- for(i = 0,len=element.attributes.length;i<len;i++){
- attrName = element.attributes[i].nodeName;
- attrValue = element.attributes[i].nodeValue;
- if(element.attributes[i].specified){
- pairs.push(attrName +"=\"" + attrValue + "\"");
- }
- }
- return pairs.join(" ");
- }
- //所有浏览器下都返回title="test" class="box" id="box" index="123" name="abc"(顺序不一样)
- console.log(outputAttributes(document.getElementById("box")))
- </script>
方法
createAttribute()
createAttribute()方法传入特性名称并创建新的特性节点
setAttributeNode()
setAttributeNode()方法传入特性节点并将特性添加到元素上,无返回值
getAttributeNode()
getAttributeNode()方法传入特性名并返回特性节点
removeAttributeNode()
removeAttributeNode()方法传入特性名删除并返回删除的特性节点,但IE7-浏览器下无法删除
- <div id="box"></div>
- <script>
- var oBox = document.getElementById('box');
- var attr = document.createAttribute('title');
- attr.value = "test";
- console.log(oBox.setAttributeNode(attr));//null
- console.log(oBox.getAttributeNode("title").name,attr.name);//title title
- console.log(oBox.getAttributeNode("title").value,attr.value);//test test
- //返回删除的节点
- console.log(oBox.removeAttributeNode(attr));
- //IE7-浏览器下无法删除,其他浏览器返回null
- console.log(oBox.getAttributeNode("title"));
- </script>
最后
特性节点在12种节点类型中排行老二,但是其属性和方法并不常用,因为元素节点都有对应的可替代的方法,而且使用起来更为方便
本文的重点再重复一次:特性是节点,但不存在DOM树中
以上
深入理解DOM节点类型第六篇——特性节点Attribute的更多相关文章
- 深入理解DOM节点类型第五篇——元素节点Element
× 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...
- 深入理解DOM节点类型第三篇——注释节点和文档类型节点
× 目录 [1]注释节点 [2]文档类型 前面的话 把注释节点和文档类型节点放在一起是因为IE8-浏览器的一个bug.IE8-浏览器将标签名为"!"的元素视作注释节点,所以文档声明 ...
- 深入理解DOM事件类型系列第一篇——鼠标事件
× 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...
- 深入理解DOM事件类型系列第二篇——键盘事件
× 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...
- 深入理解DOM节点类型第七篇——文档节点DOCUMENT
× 目录 [1]特征 [2]快捷访问 [3]文档写入 前面的话 文档节点document,隶属于表示浏览器的window对象,它表示网页页面,又被称为根节点.本文将详细介绍文档节点document的内 ...
- 深入理解DOM节点类型第四篇——文档片段节点DocumentFragment
× 目录 [1]特征 [2]作用 前面的话 在所有节点类型中,只有文档片段节点DocumentFragment在文档中没有对应的标记.DOM规定文档片段(document fragment)是一种“轻 ...
- 深入理解DOM事件类型系列第三篇——变动事件
× 目录 [1]删除节点 [2]插入节点 [3]特性节点[4]文本节点 前面的话 变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理 ...
- 深入理解DOM事件类型系列第六篇——加载事件
前面的话 提到加载事件,可能想到了window.onload,但实际上,加载事件是一大类事件,本文将详细介绍加载事件 load load事件是最常用的一个事件,当页面完全加载后(包括所有图像.java ...
- 深入理解DOM事件类型系列第五篇——文本事件
× 目录 [1]change [2]textInput [3]input[4]propertychange[5]兼容 前面的话 如果DOM结构发生变化,触发的是变动事件:如果文本框中的文本发生变化,触 ...
随机推荐
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- Jquery初学
Jquery相当于JS的升级版它俩语法是一样的,把JS的很多功能封装了起来,用的也是JS语言写的,也支持JS的语法,可以混着使用,用起来方便简单 用Jquery的时候要引用一个Jquery包 带min ...
- iOScollectionView广告无限滚动(Swift实现)
今天公司里的实习生跑过来问我一般App上广告的无限滚动是怎么实现的,刚好很久没写博客了,就决定写下了,尽量帮助那些处于刚学iOS的程序猿. 做一个小demo,大概实现效果如下图所示: 基本实现思路: ...
- SVN:Previous operation has not finished; run 'cleanup' if it was interrupted
异常处理汇总-开发工具 http://www.cnblogs.com/dunitian/p/4522988.html cleanup failed to process the following ...
- Bootstrap3插件系列:bootstrap-select2
1.下载插件 https://github.com/select2/select2 http://select2.github.io/ 2.引用插件 <script src="~/Sc ...
- 前端MVVM框架设计及实现
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的Avalon开始了,我2013年写过一个关于MVC MV ...
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...
- ASP.NET Core中的project.json何去何从?
Shawn Wildermuth (https://wildermuth.com/2016/05/12/The-Future-of-project-json-in-ASP-NET-Core) If y ...
- SQL Server-聚焦NOT EXISTS AND NOT IN性能分析(十五)
前言 上一节我们分析了INNER JOIN和IN,对于不同场景其性能是不一样的,本节我们接着分析NOT EXISTS和NOT IN,简短的内容,深入的理解,Always to review the b ...
- BIRCH聚类算法原理
在K-Means聚类算法原理中,我们讲到了K-Means和Mini Batch K-Means的聚类原理.这里我们再来看看另外一种常见的聚类算法BIRCH.BIRCH算法比较适合于数据量大,类别数K也 ...