Можете Вы getElementsByName, если у Вас только есть частичное имя на JavaScript?

У меня есть повторяющаяся таблица, где название элементов было бы (например, 'tdName_1' 'tdName_2'), и я задавался вопросом, будет ли это возможно к getElementsByName ('tdName _').

PS: Я не могу использовать JQuery.

Заранее спасибо.

Cesar.

9
задан Amra 16 February 2010 в 11:50
поделиться

6 ответов

Это невозможно. В продолжение этого ответа я предполагаю, что интересующие вас элементы - это s. Если это так, то вы должны знать, что атрибут name не действителен для элементов .

Вам придется создать список подходящих элементов вручную. Если вы все же решите использовать атрибут 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);
    }
}
6
ответ дан 4 December 2019 в 14:28
поделиться

Непросто или вероятно возможно с getElementsByClassName , но вы можете использовать JQuery для спасения:

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

$('td[name^=tdName]') // matches those that begin with 'tdName'
3
ответ дан 4 December 2019 в 14:28
поделиться

Очевидно, нет. Но вы можете использовать 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>
2
ответ дан 4 December 2019 в 14:28
поделиться

Как сказал Тим Даун, атрибут name недействителен для элементов . Он все равно должен работать, если вы решите его использовать. Один из вариантов - использовать цикл 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

0
ответ дан 4 December 2019 в 14:28
поделиться

AFAIK, getElementsByName требует статическую строку в качестве аргумента.

Я не знаю, есть ли у вас контроль над элементами, но, вероятно, вам следует дать им одинаковые имена и использовать getElementsByName.

Другим решением будет перебор имен и использование getElementByName('tdName_' + i).

0
ответ дан 4 December 2019 в 14:28
поделиться

Это невозможно. Я предполагаю, что остальные элементы, которые вас интересуют, это < td > s. Если да, следует иметь в виду, что атрибут 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);
    }
}
-121--3329680-

AFAIK, getElemiveStartName требует статического ряда в качестве аргумента.

Я не знаю, есть ли у вас какой-либо контроль над элементами, но, вероятно, вы должны дать им одно и то же имя и использовать getElemiceStartName .

Другим решением может быть циклический переход по именам и использование getElireStartName ('tdName _' + i) .

-121--3329684-

Нет, необходимо выбрать все релевантные элементы, например, с помощью метода getElemiceStartTagName , и выполнить их циклическую выборку до тех пор, пока не будет найден один или несколько элементов, соответствующих заданным критериям.

Может быть, вы можете обойти с помощью getElemityByClassName и дать каждый элемент, который вы хотите сопоставить с определенным классом? (Обновление, родная версия не доступна на SO, спасибо Энди Э. Это очень популярное обходное решение реализации.)

Вы говорите, что вы не можете использовать JQuery, и я уверен, что у вас есть хорошая причина для этого, но вещи, как это то, для чего Рамки есть. Можно ли использовать Prototype или MooTools?

0
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: