如果你在javascript上只有部分名字,你能获得ElementsByName吗?

时间:2010-02-16 11:50:02

标签: javascript html

我有一个重复的表,其中元素的名称将是(例如'tdName_1''tdName_2'),我想知道是否可以getElementsByName('tdName _')。

PS:我不能使用Jquery。

提前致谢。

塞萨尔。

8 个答案:

答案 0 :(得分:6)

这是不可能的。我在为这个答案的其余部分假设你感兴趣的元素是<td>。如果是,那么您应该知道name属性对<td>元素无效。

您必须手动创建匹配元素列表。如果您决定使用name属性(而不是在class属性中添加类),则以下内容将起作用:

var table = document.getElementById("your_table_id");
var tds = table.getElementsByTagName("td");
var matchingTds = [];

for (var i = 0, len = tds.length, td, tdName; i < len; ++i) {
    td = tds[i];
    tdName = td.getAttribute("name");
    if (tdName && tdName.indexOf("tdName_") == 0) {
        matchingTds.push(td);
    }
}

答案 1 :(得分:3)

使用getElementsByClassName并不容易或可能,但您可以将JQuery置于救援:

$('td[name=tdName_1]') // matches exactly 'tdName_1'

$('td[name^=tdName]') // matches those that begin with 'tdName'

答案 2 :(得分:3)

使用vanilla javascript,您可以使用querySelectorAll方法:

document.querySelectorAll('[name^=tdName]')

这应该适用于所有现代浏览器,包括IE9或更高版本(虽然我还没有测试过)。

答案 3 :(得分:2)

显然,不是。但是你可以使用getElementsByTagName()然后按名称过滤:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript"><!--
function find(){
    var inputs = document.getElementById("foo").getElementsByTagName("input");
    var found = [];
    for(var i=0, len=inputs.length; i<len; i++){
        if(inputs[i].name.match(/^tdName_\d+$/)){
            found.push(inputs[i]);
        }
    }
    alert(found.length + " elements found");

}
//--></script>
</head>
<body>

<form action="" method="post" id="foo">
    <input type="text" name="tdName_1">
    <input type="text" name="tdName_2">
    <input type="text" name="tdName_3">
    <input type="text" name="not_me">
    <input type="text" name="tdName_4">
    <input type="text" name="neither_me">
    <input type="text" name="tdName_5">
    <input type="button" onclick="find()" value="Find">
</form>

</body>
</html>

答案 4 :(得分:0)

AFAIK,getElementsByName需要一个静态字符串作为参数。

我不知道您是否对这些元素有任何控制权,但您应该给它们相同的名称并使用getElementsByName

另一种解决方案是循环浏览名称并使用getElementByName('tdName_' + i)

答案 5 :(得分:0)

不,您必须获取所有相关元素 - 例如使用getElementsByTagName - 并循环浏览它们,直到找到符合您条件的一个或多个元素。

也许您可以使用getElementsByClassName来处理并为每个要匹配某个类的元素提供帮助? (更新,本机版本在SO上不可用,感谢Andy E. This是一种非常流行的解决方法实现。)

你说你不能使用JQuery,我确信你有充分的理由,但像这样的东西是Frameworks的用途。 Prototype或MooTools可以选择吗?

答案 6 :(得分:0)

正如Tim Down所说,name属性对<td>元素无效。如果您决定使用它,它仍然可以工作。一种选择是使用while循环,如下所示:

function getAllNamedTDs ()
{
    var cTD, i=1, elArr = []; 

    // If an element with "tdName_"+i is not found, exit the loop
    while (cTD = document.getElementByName("tdName_"+(i++)))
        elArr.push(cTD);

    // return the array of elements or null if no elements were found.
    return elArr.length ? elArr : null;
}

您应该使用name属性,然后将id替换为getElementByName

,而不是使用getElementById属性。

答案 7 :(得分:0)

在您要查找的每个元素上放置两(2)个名称...在每个元素上使第一个类名称相同,并使第二个类名称为“tdName_1”或“tdName_2”(或其他)。在所有元素共有的类名上运行document.getElementsByClassName ...然后遍历数组,执行className.split('')得到一个数组,其中array [0]是通用名称,数组[1]是差异化的名称,......做你需要的......