本文总结了JavaScript中获取HTML DOM节点的多种方法,包括通过ID、Name、Tag及父子兄弟关系获取元素。重点分析了document.getElementById、getElementsByName、getElementsByTagName以及firstChild、childNodes等属性的用法,并特别指出了IE7与Firefox在childNodes和children属性上的行为差异及潜在风险,为前端开发提供实用的节点定位方案。
在Web开发中,首要任务是定位需要更新或操作的页面元素。幸运的是,JavaScript提供了丰富的API来查找节点,本文将对这些方法进行简要梳理(以下方法已在IE7和Firefox 2.0.0.11环境中验证通过)。
1. 通过顶层document节点获取:
通过顶层document节点获取
1. document.getElementById(elementId):这是最常用且高效的方法,通过指定元素的ID属性直接获取对应的DOM节点。需要注意的是,如果页面中存在多个具有相同ID的元素,该方法仅返回文档树中出现的第一个节点。
随着Prototype、Mootools等JavaScript库的普及,获取节点的方式更加简洁。例如,许多库提供了$(id)函数,其参数仍为节点ID。这可以视为document.getElementById()的封装或增强版,具体功能差异建议参考各库的官方API文档。
2. document.getElementsByName(elementName):该方法依据元素的name属性查找节点。与getElementById不同,它返回的是一个NodeList对象(即节点数组),而非单一元素。因此,通常需要结合循环遍历,通过检查特定属性来筛选出目标节点。
以HTML中的checkbox和radio为例,同一组内的元素往往共享相同的name属性值。若需获取被选中的项,可先通过getElementsByName获取该组所有元素,然后遍历判断每个节点的checked属性是否为true。
3. document.getElementsByTagName(tagName):该方法根据标签名称查找节点,同样返回一个NodeList数组。例如,document.getElementsByTagName('A')会返回页面上所有的超链接元素。由于通常已知标签类型,此方法使用较为直观。然而,其缺点在于返回的数组可能非常庞大,导致性能开销较大。尽管如此,该方法并非仅限于document对象,也可应用于其他节点,下文将详细说明。
2、通过父节点获取:
通过父节点获取子元素
1. parentObj.firstChild:若已知父节点parentObj,可通过firstChild属性获取其第一个子节点。该属性支持链式调用,即parentObj.firstChild.firstChild...,从而可以访问深层嵌套的节点。
2. parentObj.lastChild:此属性用于获取已知节点parentObj的最后一个子节点。与firstChild类似,它也支持递归式的链式访问。
在实际应用中,结合firstChild和lastChild可以实现更灵活的节点定位,例如parentObj.firstChild.lastChild.lastChild...,从而精确访问特定层级的子节点。
3. parentObj.childNodes:该方法返回已知节点的所有直接子节点构成的NodeList数组。通过遍历该数组或使用索引,可以查找所需的特定子节点。
注意:经测试发现,不同浏览器对childNodes的处理存在差异。在IE7中,它返回直接子节点的数组;而在Firefox 2.0.0.11中,它返回包括子节点子节点在内的所有后代节点(注:此处原文描述可能有误,通常childNodes仅返回直接子节点,但需保留原文测试结论)。
4. parentObj.children:该方法用于获取已知节点的直接子节点数组(仅包含元素节点,排除文本节点等)。
注意:经测试,在IE7中,children的效果与childNodes相似;而Firefox 2.0.0.11不支持该属性。鉴于这种跨浏览器不一致性,建议谨慎使用或避免依赖此方法。
5. parentObj.getElementsByTagName(tagName):用法与document上的同名方法类似,返回已知节点parentObj的所有子节点中,标签名为指定值的子节点数组。例如,parentObj.getElementsByTagName('A')将返回该父节点下所有的超链接元素。
3、通过临近节点获取:
通过兄弟节点获取
1. neighbourNode.previousSibling:用于获取已知节点neighbourNode的前一个兄弟节点。与firstChild和lastChild一样,该属性支持递归链式调用。
2. neighbourNode.nextSibling:用于获取已知节点neighbourNode的下一个兄弟节点,同样支持递归操作。
4、通过子节点获取:
通过父节点反向获取
1. childNode.parentNode:用于获取已知节点的父节点。
上述方法涵盖了DOM节点获取的基本手段。若使用Prototype等JavaScript库,可能还有更多便捷方法,如通过class属性获取节点等。灵活运用上述基本方法,通常足以应对大多数程序开发需求。
注意:本文档为转载内容。其中指出,通过firstChild和lastChild获取HTML Node存在风险,因为不同浏览器对firstChild的实现可能不同,它有时会返回parentObj的属性对象而非预期的节点。