zoukankan      html  css  js  c++  java
  • 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>
    

     

     

  • 相关阅读:
    android 扇形菜单
    Gradle 教程:第一部分,安装【翻译】
    Android Studio 创建虚拟机失败 Failed to load 解决办法
    【翻译】Best Practices for User interface android 适配不同屏幕、不同分辨率
    [转]QT 4.8 静态库编译方法
    使用windows资源管理器打开jar
    一步步理解typedef
    模拟Chrome皮肤
    FAT12格式的引导区实现
    Android-获取Html元素
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/3195382.html
Copyright © 2011-2022 走看看