JavaScript获取HTML DOM节点元素详解(转)
在Web运用程序特别是Web 2.0程序开发中,经常要获取页面中某个元素,然后更新该元素的样式、内容等。如何获取要更新的元素,是首先要处理的疑问。
51CTO推荐阅读:JavaScript DOM文档遍历实战
令人欣慰的是,运用JavaScript获取节点的要领有很多种,这里基本做一下总结:
1. 通过顶层document节点获取
◆document.getElementById(elementId) :该要领 通过节点的ID,可以准确获得须要 的元素,是比较基本快捷的要领 。如果页面上含有多个相同id的节点,那么只返回第一个节点。
如今,已经出现了如prototype、Mootools等多个JavaScript库,它们提供了更简便的要领 :$(id),参数仍然是节点的id。这个要领 可以看作是document.getElementById()的另外一种写法,不过$()的功能更为强大,具体用法可以参考它们各自的API文档。
◆document.getElementsByName(elementName) :该要领 是通过节点的name获取节点,从名字可以看出,这个要领返回的不是一个节点元素,而是具有同样名称的节点数组。然后,我们可以通过要获取节点的某个属性来循环判断能不能为须要的节点。
例如:在HTML中checkbox和radio都是通过相同的name属性值,来标识一个组内的元素。如果我们现在要获取被选中的元素,首先获取改组元素,然后循环判断是节点的checked属性值能不能 为true即可。
◆document.getElementsByTagName(tagName) :该要领 是通过节点的Tag获取节点,同样该要领 也是返回一个数组,例如:document.getElementsByTagName('A')将会返回页面上所有超链接节点。在获取节点之前,一般都是知道节点的类型的,所以运用该要领比较基本。
但是缺点也是显而易见,那就是返回的数组可能十分庞大,这样就会浪费很多时间。那么,这个要领是不是就没有用处了呢?当然不是,这个要领和上面的两个不同,它不是document节点的专有要领 ,还可以运用 其他的节点,下面将会提到。
2、通过父节点获取
◆parentObj.firstChild :如果节点为已知节点(parentObj)的第一个子节点就可以运用 这个要领 。这个属性是可以递归运用的,也就是支持parentObj.firstChild.firstChild.firstChild...的形式,如此就可以获得更深层次的节点。
◆parentObj.lastChild :很显然,这个属性是获取已知节点(parentObj)的最后一个子节点。与firstChild一样,它也可以递归运用。在运用中,如果我们把二者结合起来,那么将会达到更加令人兴奋的效果,即:parentObj.firstChild.lastChild.lastChild。
◆parentObj.childNodes :获取已知节点的子节点数组,然后可以通过循环或者索引找到须要的节点。留心:经测试发觉,在IE7上获取的是直接子节点的数组,而在Firefox2.0.0.11上获取的是所有子节点即包括子节点的子节点。
◆parentObj.children :获取已知节点的直接子节点数组。留心:经测试,在IE7上,和childNodes效果一样,而Firefox2.0.0.11不支持。这也是为什么我要运用和其他要领不同样式的原由,因此不建议运用。
◆parentObj.getElementsByTagName(tagName) :运用要领不再赘述,它返回已知节点的所有子节点中类型为指定值的子节点数组。例如:parentObj.getElementsByTagName('A')返回已知的子节点中的所有超链接。
3、通过临近节点获取
◆neighbourNode.previousSibling :获取已知节点(neighbourNode)的前一个节点,这个属性和前面的firstChild、lastChild一样都似乎可以递归运用的。
◆neighbourNode.nextSibling :获取已知节点(neighbourNode)的下一个节点,同样支持递归。
4、通过子节点获取
◆childNode.parentNode :获取已知节点的父节点。
上面提到的要领 ,只是一些基本的要领 ,如果运用 了Prototype等JavaScript库,可能还获得其他不同的要领,例如通过节点的class获取等等。不过,如果能够灵活运用上面的各种要领 ,相信应该可以应付大部分的程序。
例子:
<html>
<head>
<title>innerHtml and outerHtml</title>
<script type="text/javascript">
function load(){
/*var dom = document.documentElement;
node(dom);
nodeChild(dom);
//通过ID属性查找元素
dom = document.getElementById("divID");
node(dom);
nodeChild(dom)
dom = document.getElementById("spanID");
node(dom);
nodeChild(dom) nodeChild(document.body); nodeOther(document.getElementById("divID"));*/
queryElementsTagName(); }
function node(dom){
alert("name: " + dom.nodeName + " type:" + dom.nodeType + " firstChild: " + dom.firstChild.innerHTML + " lastChild: " + dom.lastChild.innerHTML );
}
function nodeChild(dom){
var bodyChilds = dom.childNodes;
var res = [];
for(var i = 0,len = bodyChilds.length; i < len;i ++)
{
var bodyNode = bodyChilds[i];
res.push(i + " -- " +bodyNode.nodeName);
}
alert(res);
} function nodeOther(dom){
//父节点,(上一个、下一个)兄弟节点,
alert("parent: " + dom.parentNode.nodeName + " previousSiblingNode: " + dom.previousSibling.nodeName + " nextSiblingNode: " + dom.nextSibling.nodeName );
} function queryElementsTagName(){
var dom = document.getElementById("nav");
var ul_list =dom.getElementsByTagName("li");
var element_array = [];
for(var i = 0,len = ul_list.length;i < len;i ++){
element_array.push(ul_list[i].childNodes[0].innerHTML);
}
alert(element_array);
}
//创建元素
function addLi(){
//为Li添加一个子元素
var ul = document.getElementById("nav");
//创建一个li新元素
var newChild = document.createElement("li");
//创建一个a新元素
var newLink = document.createElement("a");
//创建一个Text节点
var newText = document.createTextNode("new Li");
//将Text添加到a元素节点中
newLink.appendChild(newText);
//给a元素节点设置属性href和内容
newLink.setAttribute("href","#");
//将新的a元素节点添加到li元素节点中
newChild.appendChild(newLink);
//将新的li元素节点添加到ul元素节点里
ul.appendChild(newChild);
} function removeLi(){
var ul = document.getElementById("nav");
//删除ul中的最后一个
ul.removeChild(ul.lastChild);
//删除li中的最后一个
//var ul_list = ul.getElementsByTagName("li");
//ul.removeChild(ul_list[ul_list.length - 1]);
}
</script>
</head>
<body onload="load()">
<div>
<label>welcome </label>
<div id="divID">
World!
<span id="spanID">
Hello!
</span>
</div>
<span>haha</span>
</div>
<div id="menu">
<h1>我的导航条</h1>
<ul id="nav">
<li><a href="#">HOME</a></li>
<li><a href="#">(X)Html / Css</a></li>
<li><a href="#">Ajax / RIA</a></li>
<li><a href="#">GoF</a></li>
<li><a href="#">JavaScript</a></li>
<li><a href="#">JavaWeb</a></li>
<li><a href="#">jQuery</a></li>
<li><a href="#">MooTools</a></li>
<li><a href="#">Python</a></li>
<li><a href="#">Resources</a></li>
</ul>
<button onclick="addLi()">Add</button>
<button onclick="removeLi()">Del</button> </div>
</body>
</html>
JavaScript获取HTML DOM节点元素详解(转)的更多相关文章
- js获取HTML DOM节点元素方法总结
1. 通过顶层document节点获取: (1)document.getElementById(elementId) :通过ID获得节点,如果页面上含有多个相同id的节点,那么只返回第一个节点. ...
- javascript 节点属性详解
javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...
- JS DOM对象控制HTML元素详解
JS DOM对象控制HTML元素详解 方法: getElementsByName() 获取name getElementsByTagName() 获取元素 getAttribute() 获取元素 ...
- jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
本节说一下DOM操作模块里的复制元素子模块,该模块可以复制一个DOM节点,并且可选择的设置是否复制其数据缓存对象(包含事件信息)和是否深度复制(子孙节点等),API如下: $.clone(elem, ...
- layer 父弹窗获取子弹窗内的dom节点元素和变量
1 var body = layer.getChildFrame('body', index); //获取子弹窗的dom节点 2 3 var iframeWin = window[layero.fin ...
- javascript event(事件对象)详解
javascript event(事件对象)详解 1. 事件对象 1. 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什 ...
- JavaScript进阶知识点——函数和对象详解
JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...
- JavaScript中的鼠标滚轮事件详解
JavaScript中的鼠标滚轮事件详解/*Firefox注册事件*/ ~~~Firefox: addEventListener('DOMMouseScroll', handler, false)if ...
- html5中output元素详解
html5中output元素详解 一.总结 一句话总结: output元素是HTML5新增的元素,用来设置不同数据的输出,没什么大用,了解即可 <form action="L3_01. ...
随机推荐
- spark处理jsonFile
按照spark的说法,这里的jsonFile是特殊的文件: Note that the file that is offered as jsonFile is not a typical JSON f ...
- eclipse导入包的快捷键
在Eclipse里,写一个没有导入相应包的类名(这个类名已经完全写全,比如LayoutManager), 可以用ctrl+shift+M/Ctrl+Shift+o/Ctrl+1导入相应的包. 其中Ct ...
- From MSI to WiX, Part 1 - Required properties, by Alex Shevchuk
Following content is directly reprinted from From MSI to WiX, Part 1 - Required properties Author: A ...
- OpenJudge/Poj 1979 Red and Black / OpenJudge 2816 红与黑
1.链接地址: http://bailian.openjudge.cn/practice/1979 http://poj.org/problem?id=1979 2.题目: 总时间限制: 1000ms ...
- ASP.net后台弹出消息对话框的方法!【转】
在winform后台,我们通过MessageBox.show(“消息")的方式来返回后台信息,在webform后台,我们通过Response.write(”消息")来返 ...
- linux系统使用密钥登录设置
使用密钥登录linux的操作步骤(使用putty): 1.用putty远程登录linux服务器,然后使用puttygen生成密钥,将生成的密钥保存,保存私钥将公钥复制保存到linux服务器的autho ...
- libpcap 主要函数及过程详解
http://blog.chinaunix.net/uid-21556133-id-120228.html libpcap(Packet Capture Library),即数据包捕获函数库,是Uni ...
- Qt-获取主机网络信息之QNetworkInterface
QNetworkInterface类提供了一个主机IP地址和网络接口的列表. QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口.每个网络接口可能包含0个或者多个IP地 ...
- js模拟苹果菜单
模拟苹果菜单的js代码是从网上看到的,用来做导航菜单还是蛮好看的.这里借鉴一下. 效果描述:当鼠标移动离哪个图片最近的时候,这个图片最大,鼠标离的图片越远,则图片越小: 原理:主要用到了三角形的勾股定 ...
- 关于NRW算法(Quorum算法)
在分布式系统中,冗余数据是保证可靠性的手段,因此冗余数据的一致性维护就非常重要.一般而言,一个写操作必须要对所有的冗余数据都更新完成了,才能称为成功结束.比如一份数据在5台设备上有冗余,因为不知道读数 ...