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. ...
随机推荐
- 《Pro Git》学习笔记
1.Git远程模型示意图 Remote:远程仓库 Repository:本地仓库 Index:暂存区 workspace:当前工作区 2.取得Git仓库 2.1 初始化新仓库 git init ...
- ###Linux基础 - 3
点击查看Evernote原文. #@author: gr #@date: 2014-10-15 #@email: forgerui@gmail.com 一.GCC编译程序 在Windows下使用Vis ...
- iOS Core Animation学习总结(3)--动画的基本类型
一. CABasicAnimation (基础动画) 移位: CABasicAnimation *animation = [CABasicAnimation animation]; //keyPath ...
- Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和 ...
- NOIP201501&&02
NOIP201501金币 试题描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天) ,每天收到两枚金币:之后三天(第四.五.六天) ,每天收到三枚金币:之后 ...
- Visualsvn Server的搭建
最近做项目在用svn,对svn有个初步了解,今天利用一点时间在本地配置了一个svn的服务端.整个过程分为以下几步: ①下载Visualsvn Server并且进行安装. ②安装好以后,在Visuals ...
- OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem
1.链接地址: http://bailian.openjudge.cn/practice/2813 http://poj.org/problem?id=1681 2.题目: 总时间限制: 1000ms ...
- php configure help
`configure' configures this package to adapt to many kinds of systems. Usage: ./configure [OPTION].. ...
- LPC17XX 数据手册摘要之系统时钟与功率控制
系统时钟与功率控制 一.系统时钟 LPC17XX有三个独立的时钟振荡器,分别是主振荡器(MIAN_OSC).内部RC振荡器(IRC_OSC).实时时钟振荡器(RTC_OSC).LPC17XX时钟框图如 ...
- 客户端获取服务器SessionID (Asp.net SessionID)
SessionID是客户端首次访问某个方法或页面, 并且这个方法中设置了Session["xxx"]=xx; 此时服务器返回的响应头(HttpResponse.Headers)中会 ...