2010-04-21 4 views
0

У меня есть RadioButtonListdocument.getElementsByName возвращает больше элементов, чем ожидалось

<asp:radiobuttonlist runat="server" id="rblList"> 
    <asp:listitem>s1</asp:listitem> 
    <asp:listitem>s2</asp:listitem> 
    <asp:listitem>s3</asp:listitem> 
    <asp:listitem>s4</asp:listitem> 
</asp:radiobuttonlist> 

В моем клиентском коде я захватывая массив радио-кнопки, как этого

var elements = document.getElementsByName("rblList"); 

Почему я получаю 5 пунктов вместо 4? Он составляет elements, как массив на основе 1.

+1

Вы посмотрели на значения в своем массиве? – TheGeekYouNeed

+0

вид, я добавил несколько javascript, чтобы заглянуть туда. Мой ответ ниже содержит информацию ... – Homer

ответ

1

Ok поэтому RadioButtonList производит следующий HTML

<table id="rblList" border="0"> 
    <tr> 
     <td><input id="rblList_0" type="radio" name="rblList" value="s1" /><label for="rblList_0">s1</label></td> 
    </tr> 
    <tr> 
     <td><input id="rblList_1" type="radio" name="rblList" value="s2" /><label for="rblList_1">s2</label></td> 
    </tr> 
    <tr> 
     <td><input id="rblList_2" type="radio" name="rblList" value="s3" /><label for="rblList_2">s3</label></td> 
    </tr> 
    <tr> 
     <td><input id="rblList_3" type="radio" name="rblList" value="s4" /><label for="rblList_3">s4</label></td> 
    </tr> 
</table> 

Согласно MSDN я получаю 5 элементов, потому что я получаю кнопки радио и таблицу, ASP.Net это ставит их в:

http://msdn.microsoft.com/en-us/library/ms536438%28VS.85%29.aspx

При использовании метода getElementsByName, все элементы документа , которые имеют Удельный ed NAME или значение атрибута ID.

Таким образом, поставив этот бит JavaScript на странице:

function showEle() { 
    var elements = document.getElementsByName("rblList"); 

    alert("elements length=" + elements.length); 

    for (var i = 0; i < elements.length; i++) { 
     try { 
      alert("elements[" + i + "]" + ", id=" + elements[i].id + ", name=" + elements[i].name + ", value = " + elements[i].value); 
     } 
     catch (ex) { 
      alert("error reading elements[" + i + "].value"); 
     } 
    } 
} 

я был в состоянии видеть это ...

элементов [0], ID = rblList, имя = не определено, значение = неопределенные
элементы [1], ID = rblList_0, имя = rblList, значение = s1
элементов [2], ID = rblList_1, имя = rblList, значение = s2
элементы [3], ID = rblList_2, имя = rblList, значение = s3
элементов [4], ID = rblList_3, имя = rblList, значение = s4

element[0] является таблица , остальные переключатели

+0

Это относится к IE. У FF нет этой «функции». – Homer

0

Попробуйте найти HTML-код, созданный кодом (т. Е. «Источник просмотра»). Может быть, что элемент не имеет имяrblList, а скорее ID. В этом случае я рекомендую использовать getElementsByID.

+1

, так как идентификатор должен быть уникальным, это getElementByID (только один) :-) – rdmueller

+0

Это ДОЛЖНО быть уникальным, но я (к сожалению) выяснил, что это не обязательно :). Очевидно, если это зависит от меня, то это - но некоторые люди пишут формы, полностью полагающиеся на имя =, и дают всем их выпадающим спискам одинаковый идентификатор. –

0

у вас есть runat = «сервер» в вашем коде и многие asp-теги ... Это означает, что ваш пример кода - это код на стороне сервера, который будет заменен html перед отправкой клиенту.

Отъезд yout html, и вы найдете причину!

... и проверьте атрибут «name» ... getElementsByName возвращает все элементы с определенным атрибутом «name». Их может быть несколько.

Если вы хотите выбрать по ID (уникальный), это getElementByID (без множественного числа элементов).

2

Я предполагаю, что у вас есть другой элемент на странице с именем rblList. Следующее испытание:

<asp:RadioButtonList ID="RadioButtonList1" runat="server"> 
     <asp:ListItem>S1</asp:ListItem> 
     <asp:ListItem>S2</asp:ListItem> 
     <asp:ListItem>S3</asp:ListItem> 
     <asp:ListItem>S4</asp:ListItem> 
    </asp:RadioButtonList> 

    <script type="text/javascript"> 
     function test() { 
      var foo = document.getElementsByName('<%=this.RadioButtonList1.UniqueID %>'); 
      alert(foo.length); 
      return true; 
     } 
    </script> 

Я получаю четыре элемента.

+0

Какой браузер? Я узнал, что IE делает getElementsByName() иначе, чем другие браузеры. Итак, это в сочетании с тем, как ASP.Net отображает RadioButtonList 5. – Homer

+0

@Homer - браузеры должны отображать одинаково. Я проверил IE7, IE8, FF 3.5 и Chrome 5, и все они показывают четыре элемента. – Thomas

+0

hmm, js alert показывает мне 5 элементов в IE8, 4 элемента в FF 3.6. Думаю, мы можем говорить о разных вещах здесь. Он делает то же самое во всех браузерах, но IE возвращает другой результат для getElementsByName(). – Homer

Смежные вопросы