Jak wie każdy doświadczony programista JavaScript, istnieje wiele (zbyt wiele) sposobów na zrobienie tego samego. Na przykład załóżmy, że masz następujące pole tekstowe:
<form name="myForm">
<input type="text" name="foo" id="foo" />
Istnieje wiele sposobów uzyskania dostępu do tego w JavaScript:
[1] document.forms[0].elements[0];
[2] document.myForm.foo;
[3] document.getElementById('foo');
[4] document.getElementById('myForm').foo;
... and so on ...
Metody [1] i [3] są dobrze udokumentowane w dokumentacji Mozilla Gecko, ale żadna z nich nie jest idealna. [1] jest po prostu zbyt ogólne, aby było użyteczne, a [3] wymaga zarówno identyfikatora, jak i nazwy (zakładając, że będziesz wysyłać dane do języka po stronie serwera). Najlepiej byłoby mieć tylko atrybut id lub atrybut nazwy (posiadanie obu jest nieco zbędne, zwłaszcza jeśli identyfikator nie jest potrzebny do żadnego css i zwiększa prawdopodobieństwo literówek itp.).
[2] wydaje się być najbardziej intuicyjny i wydaje się być szeroko stosowany, ale nie widziałem odniesienia do niego w dokumentacji Gecko i martwię się zarówno o kompatybilność w przód, jak i kompatybilność z różnymi przeglądarkami (i oczywiście chcę być jak najbardziej zgodne z normami).
Więc jaka jest tutaj najlepsza praktyka? Czy ktoś może wskazać coś w dokumentacji DOM lub specyfikacji W3C, co mogłoby rozwiązać ten problem?
Uwaga Szczególnie interesuje mnie rozwiązanie niebędące biblioteką (jQuery / Prototype).
źródło
Odpowiedzi:
Podaj swojemu formularzowi tylko identyfikator i wprowadź tylko nazwę :
Wtedy najbardziej zgodnym ze standardami i najmniej problematycznym sposobem dostępu do elementu wejściowego jest:
używanie
.elements["foo"]
zamiast just.foo
jest preferowane, ponieważ ta ostatnia może zwrócić właściwość formularza o nazwie „foo” zamiast elementu HTML!źródło
myform.onsubmit = validateForm;
(gdzie myForm jest zmienna przedstawieniu elementu formularza i validateForm jest nazwa funkcji walidacji ... ale można go nazwać myFunc jeśli naprawdę , naprawdę chcesz ). Ważną kwestią jest to, żevalidateForm()
powinno zwracać wartość false, gdy formularz jest nieprawidłowy, a także wskazywać użytkownikowi pole (pola) powodujące problem. Powinien zwrócić wartość true, gdy dane formularza zostaną poprawnie zweryfikowane, co pozwoli na kontynuację akcji przesyłania.name
atrybutu, więc np. Możesz mieć<select name="a+b">
lub<input type="text" name="...2">
, do którego nie można się odwołać za pomocą notacji javascript .propertyName). Jawna notacja [] dopuszcza również nazwy zbudowane z wyrażeń, npmyCheckBox = document.getElementById("myform").elements["CHK"+i]
. Poza tym, myślę, że stylistycznie [] jest lepsze - wyjaśnia to nie tylko właściwości obiektu javascript. YMMV.elements
nie jest to normalny obiekt JS ielements.foo
lubelements["foo"]
faktycznie jest konwertowany na elementy elements.namedItem ("foo"). tj jesteś wywołanie DOM zdefiniowanej funkcji , nie przedstawieniu właściwość JS!Kiedy widzę tę metodę dostępu do elementów, przychodzi mi na myśl „ No-omg-never! ”. Problem polega na tym, że zakłada się, że DOM jest normalną strukturą danych (np. Tablicą), w której kolejność elementów jest statyczna, spójna lub niezawodna w każdym razie. Wiemy, że w 99,9999% przypadków tak nie jest. Zmiana kolejności lub
input
elementy w formularzu, dodanie innegoform
do strony przed danym formularzem lub przeniesienie danego formularza to przypadki, w których ten kod się zepsuje. Krótka historia: to jest bardzo delikatne. Jak tylko coś dodasz lub przeniesiesz, to się zepsuje.Jestem z Siergiejem Ilinskim w tej sprawie:
id
atrybutu:document.getElementById("myform");
document.getElementById("myform").foo;
Moim głównym problemem związanym z tą metodą jest to, że
name
atrybut jest bezużyteczny, gdy jest stosowany do formularza. Nazwa nie jest przekazywana do serwera jako część POST / GET i nie działa w przypadku zakładek w stylu skrótu.Moim zdaniem jest to najkorzystniejsza metoda. Dostęp bezpośredni to najbardziej zwięzła i przejrzysta metoda.
Moim zdaniem jest to dopuszczalne, ale bardziej szczegółowe niż to konieczne. Metoda nr 3 jest preferowana.
Tak się złożyło, że obejrzałem wideo Douglasa Crockforda i on przemyślał ten temat. Punkt zainteresowania to -12: 00. Podsumowując:
name
Atrybut jest używany do nazwy rzeczy, aby ich nie otworzyć. Służy do nazywania rzeczy, takich jak okna, pola wejściowe i znaczniki kotwicy.Więc masz to. Z semantycznego punktu widzenia jest to najbardziej sensowne.
źródło
document.aForm.foo
, dlaczego działa, ale specyfikacja HTML5 wydaje się jasno definiować interfejs,HTMLFormElement
który macaller getter any namedItem(in DOMString name);
. Więcej na whatwg.org/specs/web-apps/current-work/multipage/ ...input
lubselect
, mówię o atrybucie nazwy dla aform
. Atrybut nazwy aform
nie jest przekazywany do serwera.Aby uzyskać dostęp do nazwanych elementów umieszczonych w formularzu, dobrą praktyką jest użycie samego
form
obiektu.Aby uzyskać dostęp do dowolnego elementu w drzewie DOM, który czasami można znaleźć w formularzu, użyj
getElementById
i elementuid
.źródło
O wiele bardziej wolę piątą metodę. To jest
[5] Użyj specjalnego identyfikatora JavaScript this, aby przekazać formularz lub obiekt pola do funkcji z modułu obsługi zdarzeń.
W szczególności w przypadku formularzy:
i
Korzystając z tej techniki, funkcja nigdy nie musi znać
- kolejności, w jakiej formularze są definiowane na stronie,
- ID formularza, ani
- nazwy formularza
Podobnie dla pól:
i
W tym przypadku funkcja nigdy nie musi znać nazwy ani identyfikatora konkretnego pola wagi, chociaż musi znać nazwę pola limitu wagi.
źródło
To nie jest odpowiedź na twoje pytanie, ale tylko w tej części:
Najprawdopodobniej i tak będziesz musiał mieć
id
atrybut w każdym polu formularza, aby móc powiązać<label>
z nim jego element, na przykład:Jest to wymagane ze względu na dostępność (tj. Jeśli nie kojarzysz etykiet formularzy i kontrolek, dlaczego tak bardzo nienawidzisz niewidomych?).
Jest to trochę zbędne, chociaż mniej, gdy masz pola wyboru / przyciski opcji, gdzie kilka z nich może współdzielić plik
name
. Ostatecznieid
iname
służą do różnych celów, nawet jeśli oba mają często tę samą wartość.źródło
To jest trochę stare, ale chcę dodać coś, co moim zdaniem jest istotne.
(Chciałem skomentować jeden lub 2 wątki powyżej, ale wydaje mi się, że potrzebuję 50 reputacji, a w chwili, gdy to piszę, mam tylko 21 :))
Chcę tylko powiedzieć, że są chwile, w których znacznie lepiej jest uzyskać dostęp do elementy formularza według nazwy zamiast identyfikatora. Nie mówię o samej formie. Formularz, OK, możesz nadać mu identyfikator, a następnie uzyskać do niego dostęp. Ale jeśli masz przycisk opcji w formularzu, znacznie łatwiej jest użyć go jako pojedynczego obiektu (uzyskać i ustawić jego wartość) i możesz to zrobić tylko z nazwy, o ile wiem.
Przykład:
Możesz pobrać / ustawić zaznaczoną wartość przycisku radiowego R1 jako całości, używając
document.mainForm.R1.value
lub
document.getElementById ("mainForm"). R1.value
Więc jeśli chcesz mieć jednolity styl, możesz chcesz zawsze używać tej metody, niezależnie od typu elementu formularza. Mnie, jestem całkowicie wygodny w dostępie do przycisków radiowych według nazwy i pól tekstowych według identyfikatora.
źródło
document.forms.mainForm.R1.value
, co jest rzeczywiście dobrym sposobem na uniknięcie używania brzydkiego i żmudnego pisaniadocument.getElementById()
Będąc staromodnym, zawsze używałem składni „document.myform.myvar”, ale ostatnio okazało się, że w przeglądarce Chrome nie działa (OK w przeglądarce Firefox i IE). Była to strona Ajax (tj. Załadowana do właściwości innerHTML elementu div). Być może Chrome nie rozpoznał formularza jako elementu głównego dokumentu. Zamiast tego użyłem getElementById (bez odwoływania się do formularza) i zadziałało OK.
źródło
.forms
, więcdocument.forms.myform.myvar
Aby dodać do wszystkiego, co już zostało powiedziane, możesz uzyskać dostęp do
input
s za pomocąname
lub,id
najlepiej, używającelements
właściwości formularza Object, ponieważ bez tego możesz uzyskać właściwość formularza o nazwie „foo” zamiast elementu HTML. I według @Paul D. Waite, dobrze jest mieć zarówno imię, jak i identyfikator.Według MDN na HTMLFormElement.elements stronie
źródło
name
pole działa dobrze. Zawiera odniesienie doelements
.parent.children
- Wyświetla wszystkie elementy z polem nazwy rodzica.parent.elements
- Wymieni tylkoform elements
takie jakinput-text, text-area, etc
Uwaga:
.elements
aby działał,parent
musi być<form> tag
. Natomiast.children
będzie działać na każdymHTML-element
- takim jak<div>, <span>, etc
.Powodzenia...
źródło
Formularz 2 jest w porządku, a formularz 3 jest również zalecany.
Nadmiarowość między nazwą a identyfikatorem jest spowodowana koniecznością zachowania kompatybilności, w html 5 niektóre elementy (jak img, form, iframe i tym podobne) stracą atrybut "name" i od teraz zaleca się używanie tylko ich id do odwoływania się do nich na :)
źródło
Aby uzupełnić inne odpowiedzi, document.myForm.foo to tak zwany poziom DOM 0, który jest sposobem implementowanym przez Netscape i dlatego nie jest tak naprawdę otwartym standardem, mimo że jest obsługiwany przez większość przeglądarek.
źródło
Sprawdź tę stronę: https://developer.mozilla.org/En/DOM/Document.getElementsByName
Musi to być „elementy” i musi zwracać tablicę, ponieważ więcej niż jeden element może mieć taką samą nazwę.
źródło
Moja odpowiedź będzie się różnić w odniesieniu do konkretnego pytania. Jeśli chcę uzyskać konkretny dostęp do określonego elementu, użyję document.getElementById (). Przykładem jest obliczanie pełnego imienia i nazwiska osoby, ponieważ opiera się na wielu polach, ale jest to powtarzalna formuła.
Jeśli chcę uzyskać dostęp do elementu jako części struktury funkcjonalnej (formularza), użyję:
Tak to działa również z punktu widzenia biznesu. Zmiany w pętli idą w parze ze zmianami funkcjonalnymi w aplikacji i dlatego mają znaczenie. Stosuję go głównie do przyjaznej dla użytkownika walidacji i zapobiegania połączeniom sieciowym w celu sprawdzenia błędnych danych. Powtarzam stronę serwera walidacji (i dodaję do niej więcej), ale jeśli mogę pomóc po stronie klienta użytkownika, jest to korzystne dla wszystkich.
Do agregacji danych (np. Budowania wykresu kołowego na podstawie danych w formularzu) używam dokumentów konfiguracyjnych i niestandardowych obiektów Javascript. Następnie dokładne znaczenie pola jest ważne w odniesieniu do jego kontekstu i czy używam document.getElementById ().
źródło
Ponieważ przypadek [2]
document.myForm.foo
to dialekt z Internet Exploere. Więc zamiast tego wolędocument.forms.myForm.elements.foo
lubdocument.forms["myForm"].elements["foo"]
.źródło
Wolę tą
źródło