2011-06-28 18 views
6

Jeśli masz wiele formularzy z tym samym name w formularzu, pozycja w kolekcji elements na formularzu kończy się zbiorem tych pól (co jest przydatne). Specyfikacja HTML covers the elements collection DOM2 ale nie od razu wydają się określić ten problem, gdy istnieje wiele pól o tej samej nazwie. Czy zachowanie jest objęte standardem (gdzieś w specyfikacji HTML DOM2 lub w innej specyfikacji)?Elementy formularza o tej samej nazwie odzwierciedlone w DOM

Dla jasności, nie pytam, co jest najlepszym sposobem, aby uzyskać dostęp do tych pól jest. Pytam, czy fakt, że kończy się w zbiorze (z różnych rodzajów) z kolekcji elements objęty jest normą, a jeśli tak, to który.

Przykład (live copy):

HTML:

<form id="theForm"> 
<input type="text" name="foo" value="one"> 
<input type="text" name="foo" value="two"> 
</form> 

JavaScript:

var form = document.getElementById("theForm"), 
    foo = form.elements.foo, 
    index; 
console.log("typeof foo = " + typeof foo); 
if (typeof foo !== "undefined") { 
    console.log("Object#toString says: " + Object.prototype.toString.call(foo)); 
} 
if ('length' in foo && 'item' in foo) { 
    console.log("Looks like a collection of some kind:"); 
    for (index = 0; index < foo.length; ++index) { 
    console.log(index + ": " + foo[index].value); 
    } 
} 

Przykładowe wyjście (dla Chrome):

typeof foo = object 
Object#toString says: [object NodeList] 
Looks like a collection of some kind: 
0: one 
1: two

Sprawdziłem IE6 7, 8, an d 9, Firefox 4.0, Firefox 3.6, Chrome 12, Opera 11 oraz Safari 5. Wszyscy dokonać wpisu w elements zbiór pewnego rodzaju (Chrome, Firefox, Safari i zrobić mu NodeList [choć dziwnie na Safari typeof jest „funkcja” nie „obiekt”], a IE i Opera sprawiają, że jest to HTMLCollection, ale wszystkie one mają length, item i [] dostępu). Po prostu próbuję znaleźć standard, jeśli taki jest, który określa zachowanie.

+0

Dlaczego nie używać document.getElementsByName ("fieldNAME"), która zwraca tablicę we wszystkich przeglądarkach – mplungjan

+1

@mplungjan: @ T.J. chce tylko wiedzieć, czy to zachowanie jest gdzieś zdefiniowane. –

+0

@mplungjan: Cytując: * "Nie pytam, jaki jest najlepszy sposób dostępu do tych pól. Pytam, czy fakt, że trafiają do kolekcji (różnego rodzaju) w kolekcji" elements "jest objęty standard, a jeśli tak, to który. "* Wiem, że mogę użyć' getElementsByName' (choć dostarczy mi ** wszystkich ** elementów o tej nazwie, nie tylko tych w formularzu). Punktem pytania są standardy. –

Odpowiedz

2

Jest objęty projektem specyfikacji HTML5 (i WH AT-WG wersja), która w tym przypadku wydaje się bardziej o dokumentowanie jak to zawsze działało, w sekcji na HTMLFormControlsCollection (W3C ref, WHAT-WG ref):

Jeśli istnieje wiele pasujących pozycji, a następnie [HTMLFormControlsCollection (W3C ref, WHAT-WG ref) zwracany jest obiekt zawierający wszystkie te elementy.

+0

Dzięki! Zaktualizowałem odpowiedź na link do specyfikacji HTML5 na W3C, ponieważ jest to z pewnością specyfikacja (nie zaczynaj mnie od polityki wokół relacji WHAT-WG/W3C). Nieparzysta nazwa (nie mogą to być przyciski opcji), ale hej. Dotyczy to w szczególności funkcji "namedItem', ale dzięki sekcji mapowania ECMAScript specyfikacji DOM2 HTML (http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/DOM2 -HTML.html # ecma-script-binding) wiemy, że [] używa go. –

+0

Dostęp do "[]" w specyfikacji HTML faktycznie pochodzi ze specyfikacji [WebIDL] (http://dev.w3.org/2006/webapi/WebIDL/). Funkcja 'namedItem' jest operacją specjalną (http://dev.w3.org/2006/webapi/WebIDL/#dfn-special- operation) zwaną _nazwa_tererem_. – Carey

+0

Ja * wiedziałem * coś musiało się wydobywać ze specyfikacji DOM2 HTML, na mojej liście refliku było "hmmm, gdzie jest nowsza wersja tego?" jeden. Doskonale, dzięki - WebIDL jest teraz na mojej liście referencyjnej. –

0

Wydaje się, że istnieje różnica pomiędzy postaciami dostępu i dostęp DOM w Firefoksie 4.0.1 i 5

http://jsfiddle.net/mplungjan/jMnWP/

form.foo:

typeof formFoo = object 
Object#toString says: [object NodeList] 
Looks like a collection of some kind: 
0: one 
1: two 

document.getElementsByName ("") foo :

typeof docFoo = object 
Object#toString says: [object HTMLCollection] 
Looks like a collection of some kind: 
0: one 
1: two 
+0

Nie w Chrome .. –

+0

Interesujące! (Firefox 3.6 też.) Opera robi to samo, ale na odwrót ('formFoo' to' HTMLCollection', ale 'docFoo' to' NodeList'). (BTW, to był raczej * komentarz * niż * odpowiedź *.) –

+0

Umieściłem jako odpowiedź, ponieważ mogę formatować odpowiedzi. Mogę go usunąć, jeśli uważasz, że nie ma żadnej wartości. – mplungjan

Powiązane problemy