在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节点元素详解(转)的更多相关文章

  1. js获取HTML DOM节点元素方法总结

    1. 通过顶层document节点获取:    (1)document.getElementById(elementId) :通过ID获得节点,如果页面上含有多个相同id的节点,那么只返回第一个节点. ...

  2. javascript 节点属性详解

    javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...

  3. JS DOM对象控制HTML元素详解

    JS DOM对象控制HTML元素详解 方法: getElementsByName()  获取name getElementsByTagName()  获取元素 getAttribute()  获取元素 ...

  4. jQuery 源码解析(二十二) DOM操作模块 复制元素 详解

    本节说一下DOM操作模块里的复制元素子模块,该模块可以复制一个DOM节点,并且可选择的设置是否复制其数据缓存对象(包含事件信息)和是否深度复制(子孙节点等),API如下: $.clone(elem, ...

  5. layer 父弹窗获取子弹窗内的dom节点元素和变量

    1 var body = layer.getChildFrame('body', index); //获取子弹窗的dom节点 2 3 var iframeWin = window[layero.fin ...

  6. javascript event(事件对象)详解

    javascript event(事件对象)详解   1. 事件对象     1. 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什 ...

  7. JavaScript进阶知识点——函数和对象详解

    JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...

  8. JavaScript中的鼠标滚轮事件详解

    JavaScript中的鼠标滚轮事件详解/*Firefox注册事件*/ ~~~Firefox: addEventListener('DOMMouseScroll', handler, false)if ...

  9. html5中output元素详解

    html5中output元素详解 一.总结 一句话总结: output元素是HTML5新增的元素,用来设置不同数据的输出,没什么大用,了解即可 <form action="L3_01. ...

随机推荐

  1. 2015年校园招聘12家IT公司面试体验

    背景 2015年注定是一个不平凡的年头,作为一个应届毕业生,我也算是经历了工作上的大起大落.下面我先简单讲述一下自己的遭遇,然后根据自己亲身的面试经历,从一个学生的角度去谈谈自己对面试过的公司的一些看 ...

  2. Javascript原型钩沉

    写在前面的总结: JS当中创建一个对象有好几种方式,大体上就是以下几种: ①通过var obj ={...} 这种方式一般称为字面量方式,{}直接写需要定义的字段 ②var obj = new Obj ...

  3. asp.net Hierarchical Data

    Introduction A Hierarchical Data is a data that is organized in a tree-like structure and structure ...

  4. zookeeper实现商品秒杀抢购

    package com.test; import java.io.IOException; import java.util.List; import java.util.concurrent.Cyc ...

  5. Objective-C 学习笔记(Day 3,上)

    ------------------------------------------- 类方法   ①类方法:        + 开头的方法(定义的过程形式和对象方法一样,只不过 + 开头,这是唯一的 ...

  6. 文件上传~Uploadify上传控件

    对于文件上传来说,有很多种实现方式,如传统的表单方式,现在流行的flash方式,甚至还有纯JS方式,之所以有这些方式来实现文件上传,我想主要原因是因为,传统的上传对于大文件支持不够,因为它是单线程同步 ...

  7. GDI+中发生一般性错误之文件被占用

    有多种原因可能导致这个异常出现,比如创建文件的权限不足.文件被占用等. 这里提供一个使用Stream读取图片避免文件被占用的方法. public Image GetImageFromStream(st ...

  8. Java线程练习

    /*线程练习创建两个线程,与主线程交替运行 */ class Text extends Thread{    private String name;    Text(String name)     ...

  9. leetcode Maximal Rectangle 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052721.html 题目链接:leetcode Maximal Rectangle 单调栈 ...

  10. RX学习笔记:在FreeCodeCamp的学习

    FreeCodeCamp https://www.freecodecamp.com 2016-07-03 前几日在Github浏览时,偶然看到一个叫FreeCodeCamp的开源项目,进去该网站之后感 ...