[js高手之路] dom常用节点属性兼容性详解与应用
一、每个DOM节点都有一个nodeType属性,表示节点类型, NodeType一共有12种类型,我们可以通过遍历内置的Node构造函数获取
window.onload = function(){
var str = "<table>";
for( var key in Node ){
str += "<tr>";
str += "<td>" + key + "</td><td>" + Node[key] + "</td>";
str += "</tr>";
}
str += "</table>";
document.body.innerHTML = str;
}
| ELEMENT_NODE | 1 |
| ATTRIBUTE_NODE | 2 |
| TEXT_NODE | 3 |
| CDATA_SECTION_NODE | 4 |
| ENTITY_REFERENCE_NODE | 5 |
| ENTITY_NODE | 6 |
| PROCESSING_INSTRUCTION_NODE | 7 |
| COMMENT_NODE | 8 |
| DOCUMENT_NODE | 9 |
| DOCUMENT_TYPE_NODE | 10 |
| DOCUMENT_FRAGMENT_NODE | 11 |
| NOTATION_NODE | 12 |
其中,最常用的是1(元素节点) 和 3( 文本节点 ).可以结合childNodes做一个简单的应用
window.onload = function(){
var oUl = document.getElementById("box");
var cNodeList = oUl.childNodes;
for( var i = 0, len = cNodeList.length; i < len; i++ ){
cNodeList[i].nodeType == 1 ? cNodeList[i].style.backgroundColor = 'red' : '';
}
}
<ul id="box">
<li>11111</li>
<li>22222</li>
<li>33333</li>
</ul>
上例,给li加背景颜色, childeNodes在chrome和FF下会区分元素节点和文本节点. 所以为了在chrome和FF下加上背景颜色,
需要nodeType = 1判断为元素节点,才能加上背景颜色
二、nodeName和nodeValue属性
如果是元素, nodeName就是标签名称, nodeValue为null, 如果是文本节点,自然就是空
window.onload = function(){
var oUl = document.getElementById("box");
var cNodeList = oUl.childNodes;
for( var i = 0, len = cNodeList.length; i < len; i++ ){
console.log( cNodeList[i].nodeName, cNodeList[i].nodeValue );
}
}
三、每个节点都有一个childNodes属性,保存的是当前节点下面的所有子节点,其中保存着一个nodeList对象,nodeList是一种类数组结构,
有两种方法可以获取需要的子元素
- 数组索引
- item方法
var oUl = document.getElementById("box");
var cNodeList = oUl.childNodes;
console.log( cNodeList[0] );
console.log( cNodeList.item(0) );
如果这个nodeList需要使用数组方法,他不能直接调用,需要转成数组方式
// var aNode = [].slice.call( cNodeList, 0 );
var aNode = Array.prototype.slice.call( cNodeList, 0 );
console.log( aNode );
在IE8及其更老的版本,不支持这两种方式,只能使用for循环遍历
try {
var aNode = [];
aNode = Array.prototype.slice.call( cNodeList, 0 );
} catch( e ){
for( var i = 0, len = cNodeList.length; i < len; i++ ){
aNode.push( cNodeList[i] );
}
}
console.log( aNode );
四、兄弟节点、第一个子节点、最后一个子节点、父节点(parentNode),子节点(children)
这里一个有4组属性,IE和Chrome,FF支持的属性分别如下
在IE下是支持firstChild,lastChild,nextSibling,previousSibling
在Chrome和FF下支持: firstElementChild,lastElementChild,nextElementSibling,previousElementSibling
如果需要兼容,我们可以采用短路表达式:
window.onload = function(){
var aDiv = document.getElementsByTagName( "div" );
(aDiv[2].previousElementSibling || aDiv[2].previousSibling).style.color = 'red';
(aDiv[1].nextElementSibling || aDiv[1].nextSibling).style.color = 'green';
(document.body.firstElementChild || document.body.firstChild).style.color = 'blue';
(document.body.lastElementChild || document.body.lastChild).style.color = 'orange';
}
<div>ghostwu1</div>
<div>ghostwu2</div>
<div>ghostwu3</div>
<div>ghostwu4</div>
parentNode的小应用,隐藏当前a元素对应的li元素
window.onload = function(){
var aHref = document.getElementsByTagName("a");
for( var i = 0, len = aHref.length; i < len; i++ ){
aHref[i].onclick = function(){
this.parentNode.style.display = 'none';
}
}
}
<ul>
<li><a href="javascript:;">1111</a><a href="javascript:">隐藏</a></li>
<li><a href="javascript:;">2222</a><a href="javascript:;">隐藏</a></li>
<li><a href="javascript:;">3333</a><a href="javascript:;">隐藏</a></li>
</ul>
children的小应用,隔行变色
window.onload = function(){
var oDiv = document.querySelector("#box");
var aP = oDiv.children;
aP = [].slice.call(aP);
aP.forEach(function( el, key ) {
el.style.backgroundColor = ( key % 2 == 0 ? 'red' : 'green' );
}, this);
}
<div id="box">
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
</div>
[js高手之路] dom常用节点属性兼容性详解与应用的更多相关文章
- [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...
- [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用
本文主要讲解DOM常用的CURD操作,appendChild(往后追加节点),insertBefore(往前追加节点),removeChild(移除节点),replaceChild(替换节点),clo ...
- [js高手之路] es6系列教程 - 箭头函数详解
箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...
- [js高手之路] html5 canvas动画教程 - 实时获取鼠标的当前坐标
有了前面的canvas基础之后,现在开始就精彩了,后面写的canvas教程都是属于综合应用,前面已经写了常用的canvas基础知识,参考链接如下: [js高手之路] html5 canvas系列教程 ...
- [js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)
接着上文[js高手之路] html5 canvas系列教程 - 状态详解(save与restore),相信大家都应该玩过美颜功能,而我们今天要讲的就是canvas强大的像素处理能力,通过像素处理,实现 ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API
我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...
- [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表
所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...
- [js高手之路]深入浅出webpack教程系列6-插件使用之html-webpack-plugin配置(下)
上文我们对html-webpack-plugin的实例htmlWebpackPlugin进行了遍历分析,讲解了几个常用属性( inject, minify )以及自定义属性的添加,本文,我们继续深入他 ...
随机推荐
- Java自学手记——接口
抽象类 1.当类和对象被abstract修饰符修饰的时候,就变成抽象类或者抽象方法.抽象方法一定要在抽象类中,抽象类不能被创建对象,如果需要使用抽象类中的抽象方法,需要由子类重写抽象类中的方法,然后创 ...
- CentOS 6.9 升级MySQL 5.6.36到5.7.18
CentOS 6.9 升级MySQL 5.6.36到5.7.18 MySQL 5.6.36 安装过程:http://www.cnblogs.com/imweihao/p/7156754.html 升级 ...
- Servlet端 接收不到4096,8192长度的JSON参数
Servlet端的日志显示,客户端传过来的JSON参数是空值. 但是在客户端的日志显示,已将JSON参数传送过去. 经调查发现,加减1位后的JSON参数均可以正常传送. 只有8192,4096长度的J ...
- 如何删除 SQL Server 表中的重复行
第一种:有主键的重复行,就是说主键不重复,但是记录的内容重复比如人员表tab ,主键列id,身份证编号idcard当身份证重复的时候,保留最小id值的记录,其他删除delete a from tab ...
- C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 ...
- USB的前世今生
在人类的历史长河中,很少有一种技术或者传输标准能像USB那样跟我们的生活息息相关,甚至到了没有不行的地步.USB对于今天的人们来说,就好像是空气,是水,是我们每天必需但是又熟视无睹的东西,没有多少人知 ...
- 关于shell脚本函数、数组、字符串截取、svn更新发布实例
#/bin/bash #功能:QA服根据模板创建区配置文件并提交到svn上. SOURCE_PATH=/data/source_code SVN_PATH=/code/psm #svn发布目录,要 ...
- Linux系统——运行级别
学习之前先了解下Linux系统的运行级别和其原理,博主使用的是Linux系统中的Redhat9.0版本,之后的学习也是基于这个系统版本. Linux系统的7个运行级别(runlevel) 运行级别0: ...
- Python基础之常用模块(二)
一.sys模块 1.sys.exit() 退出程序,这是正常退出程序,与之前用的break不同的是,break只是退出循环,循环之后的代码还会正常运行 2.sys.argv 会返回一个列表,列表中的 ...
- Ubuntu上安装PHP环境-mysql+apache+php-Linux操作系统
安装MYSQL 1. sudo apt-get install mysql-server 或者 apt-get isntall mysql-client 2. 安装过程中会提示设置密码,注意设 ...