本文介绍在 JavaScript 中如何递归遍历 DOM 容器,查找 ID 包含特定关键字的控件。提供了三个版本的实现:初始版本按标签名过滤并返回逗号分隔的 ID 字符串;改进版移除标签限制,仅通过 ID 关键字匹配;最终版直接返回匹配的控件数组对象。代码包含完整的递归逻辑,适用于 GridView 等复杂嵌套结构的元素定位。
基于标签名的 ID 关键字查找实现
实现一个功能,用于获取指定容器控件中所有 ID 包含特定字符串的子控件 ID 列表。
该函数接收三个参数:容器控件对象、需要匹配 ID 的关键字字符串,以及可选的控件标签名称。
函数执行后返回一个字符串,内容为所有查找到的控件 ID,各 ID 之间以逗号分隔。
具体实现代码如下:
function GetIdListBySubKey(container,subKey,TagName)
{
var idList = "";
for(var i = 0; i < container.childNodes.length;i++)
{
if(container.childNodes[i].nodeName == TagName && container.childNodes[i].id.indexOf(subKey) > -1)
{
idList += container.childNodes[i].id + ",";
}
if(container.childNodes[i].childNodes.length > 0)
{
idList += GetIdListBySubKey(container.childNodes[i],subKey,TagName)
}
}
return idList;
} 此方法可用于获取 GridView 等复杂容器中的控件。
移除标签限制的简化版实现
对代码进行改进:可以去掉 TagName 参数,使查找范围更广。
改进后的功能描述:获取某容器控件中 ID 包含某字符串的控件 ID 列表。
改进后的参数为:容器控件、要查找的控件的 ID 关键字。
返回值仍为查找到的控件 ID 列表字符串,以逗号分割。
改进后的代码如下:
function GetIdListBySubKey(container,subIdKey)
{
var idList = "";
for(var i = 0; i < container.childNodes.length;i++)
{
if(container.childNodes[i].attributes != null && container.childNodes[i].attributes["id"] != undefined && container.childNodes[i].id.indexOf(subIdKey) > -1)
{
idList += container.childNodes[i].id + ",";
}
if(container.childNodes[i].childNodes.length > 0)
{
idList += GetIdListBySubKey(container.childNodes[i],subIdKey)
}
}
return idList;
} 调用示例:GetIdListBySubKey(document,"txt_Money")
直接返回控件数组的最终版本
进一步改进:直接返回控件数组,而非 ID 字符串,便于后续操作。
改进后的功能描述:获取某容器控件中 ID 包含某字符串的控件数组。
改进后的参数为:容器控件、要查找的控件的 ID 关键字。
返回值改为查找到的控件数组对象。
最终版本的代码如下:
function GetConListBySubKey(container,subIdKey)
{
var reConArry = [];
for(var i = 0; i < container.childNodes.length;i++)
{
if(container.childNodes[i].attributes != null && container.childNodes[i].attributes["id"] != undefined && container.childNodes[i].id.indexOf(subIdKey) > -1)
{
reConArry.push(container.childNodes[i]);
}
if(container.childNodes[i].childNodes.length > 0)
{
var re = GetConListBySubKey(container.childNodes[i],subIdKey)
for(var k = 0;k<re.length;k++)
{
reConArry.push(re[k]);
}
}
}
return reConArry;
}