本文总结了在JavaScript中获取HTML DOM节点的多种方法,涵盖通过顶层document、父节点、临近节点及子节点进行查找的场景。重点解析了getElementById、getElementsByName、getElementsByTagName等常用API,并详细对比了firstChild、lastChild、childNodes及children在不同浏览器(如IE7与Firefox)中的行为差异与兼容性陷阱,为前端开发提供实用的节点定位方案。
值得肯定的是,JavaScript提供了多种获取DOM节点的手段,以下总结的方法已在IE7和Firefox 2.0.0.11环境中验证通过。
基于顶层document节点获取
1. 基于顶层document节点获取:
(1)document.getElementById(elementId):该API通过指定ID精准定位元素,是简洁高效的常用方式。若页面中存在多个相同ID的节点,此方法仅返回第一个匹配项。
当前,Prototype、Mootools等JavaScript库提供了更便捷的封装:$(id),其参数仍为节点ID。这可视作document.getElementById()的语法糖,但$()功能更为丰富,具体实现需参考相应库的API文档。
(2)document.getElementsByName(elementName):该API依据节点的name属性进行查找。从命名即可看出,它返回的是一个包含所有同名节点的NodeList数组。开发者需遍历该数组,通过检查特定属性来筛选目标节点。
例如:在HTML中,checkbox和radio控件常利用相同的name属性值来标识一组元素。若需获取被选中的元素,首先获取该组所有元素,随后遍历检查每个节点的checked属性是否为true即可。
(3)document.getElementsByTagName(tagName):该API通过标签名获取节点,同样返回一个数组。例如:document.getElementsByTagName('A')将返回页面上所有的超链接节点。通常在使用前已知节点类型,因此该方法使用简单。然而其缺点在于返回的数组可能极其庞大,导致性能损耗。这是否意味着该方法无用?并非如此,与前述两种方法不同,它并非document节点的专属方法,还可应用于其他节点对象,下文将作介绍。
基于父节点获取
2. 基于父节点获取:
(1)parentObj.firstChild:若目标节点是已知节点(parentObj)的第一个子节点,可使用此属性。该属性支持递归调用,即parentObj.firstChild.firstChild.firstChild...的形式,从而获取深层嵌套节点。
(2)parentObj.lastChild:显然,此属性用于获取已知节点(parentObj)的最后一个子节点。与firstChild类似,它同样支持递归使用。
在实际应用中,若将二者结合使用,将产生更灵活的效果,例如:parentObj.firstChild.lastChild.lastChild...。
(3)parentObj.childNodes:获取已知节点的所有子节点数组,随后可通过循环或索引定位所需节点。
注意:经测试发现,在IE7中,该方法返回直接子节点的数组;而在Firefox 2.0.0.11中,返回的是所有子节点,包括子节点的子节点(即包含后代节点)。
(4)parentObj.children:获取已知节点的直接子节点数组。注意:经测试,在IE7中,其效果与childNodes一致;而Firefox 2.0.0.11不支持此属性。这也是为何建议使用其他方法的原因,因此不推荐广泛使用。
(5)parentObj.getElementsByTagName(tagName):用法不再赘述,它返回已知节点下所有子节点中类型为指定值的子节点数组。例如:parentObj.getElementsByTagName('A')返回已知子节点中的所有超链接。
基于临近节点获取
3. 基于临近节点获取:
(1)neighbourNode.previousSibling:获取已知节点(neighbourNode)的前一个节点。该属性与前述firstChild、lastChild类似,均支持递归使用。
(2)neighbourNode.nextSibling:获取已知节点(neighbourNode)的下一个节点,同样支持递归操作。
基于子节点获取
4. 基于子节点获取:
(1)childNode.parentNode:获取已知节点的父节点。
上述方法仅为基本手段。若使用Prototype等JavaScript库,可能还有其他获取方式,例如通过class属性查找等。若能灵活运用上述各种方法,相信足以应对大部分程序开发需求。