Как знает любой опытный разработчик JavaScript, есть много (слишком много) способов сделать то же самое. Например, скажем, у вас есть текстовое поле следующим образом:
<form name="myForm">
<input type="text" name="foo" id="foo" />
Есть много способов получить доступ к этому в JavaScript:
[1] document.forms[0].elements[0];
[2] document.myForm.foo;
[3] document.getElementById('foo');
[4] document.getElementById('myForm').foo;
... and so on ...
Методы [1] и [3] хорошо документированы в документации Mozilla Gecko, но ни один из них не идеален. [1] является слишком общим, чтобы быть полезным, а [3] требует и идентификатор, и имя (при условии, что вы будете публиковать данные на языке сервера). В идеале было бы лучше иметь только атрибут id или атрибут name (наличие обоих является несколько избыточным, особенно если идентификатор не нужен для какого-либо CSS, и увеличивает вероятность опечаток и т. Д.).
[2] кажется наиболее интуитивно понятным и широко используемым, но я не видел, чтобы на него ссылались в документации Gecko, и меня беспокоит как прямая совместимость, так и кросс-браузерная совместимость (и, конечно, я хочу быть насколько это возможно в соответствии со стандартами).
Так что же лучше здесь делать? Может кто-нибудь указать на что-то в документации DOM или спецификации W3C, что может решить эту проблему?
Примечание. Меня особенно интересует небиблиотечное решение (jQuery / Prototype).
источник
Ответы:
Дайте вашей форме только идентификатор , а ваши входные данные только имя :
Тогда самый совместимый со стандартами и наименее проблемный способ получить доступ к вашему элементу ввода - это:
предпочтительнее использовать
.elements["foo"]
вместо just,.foo
поскольку последний может возвращать свойство формы с именем «foo», а не элемент HTML!источник
myform.onsubmit = validateForm;
(где myform - это переменная, ссылающаяся на элемент формы, а validateForm - это имя вашей функции проверки ... но вы можете назвать ее myFunc, если вы действительно , действительно хотите ). Важным моментом является то, чтоvalidateForm()
следует возвращать false, если форма недействительна, а также указывать проблемные поля для пользователя. Он должен возвращать true, когда данные формы проверяются правильно, что позволит выполнить действие отправки.name
атрибута, например, вы можете иметь<select name="a+b">
или<input type="text" name="...2">
, на которые нельзя ссылаться, используя нотацию javascript .propertyName). Явная нотация [] также допускает имена, построенные из выражений, напримерmyCheckBox = document.getElementById("myform").elements["CHK"+i]
. Кроме того, стилистически я думаю, что [] лучше - это дает понять, что это не просто свойства объекта javascript. YMMV.elements
не является нормальным объектом JS, иelements.foo
илиelements["foo"]
фактически получать преобразуется в elements.namedItem ( «Foo»). то есть вы вызываете определенную DOM функцию , а не ссылаетесь на свойство JS!« Нет, боже, никогда! » Приходит на ум, когда я вижу этот метод доступа к элементам. Проблема заключается в том, что предполагается, что DOM - это нормальная структура данных (например, массив), в которой порядок элементов в любом случае является статическим, непротиворечивым или надежным. Мы знаем, что 99,9999% времени, что это не так. Переупорядочивание или
input
элементы в форме, добавление другогоform
на страницу перед соответствующей формой или перемещение рассматриваемой формы - все это случаи, когда этот код нарушается. Короткая история: это очень хрупкий. Как только вы добавите или переместите что-то, оно сломается.Я с Сергеем Ильинским по этому поводу
id
атрибут:document.getElementById("myform");
document.getElementById("myform").foo;
Моя главная проблема с этим методом заключается в том, что
name
атрибут бесполезен при применении к форме. Имя не передается на сервер как часть POST / GET и не работает для закладок в стиле хэш.На мой взгляд, это наиболее предпочтительный метод. Прямой доступ - самый краткий и понятный метод.
На мой взгляд, это приемлемо, но более многословно, чем необходимо. Метод № 3 предпочтительнее.
Просто так случилось, что я смотрел видео от Дугласа Крокфорда, и он взвесил эту тему. Точка интереса в -12: 00. Подвести итоги:
name
Атрибут используется , чтобы назвать вещи, а не к ним доступ. Он предназначен для именования таких вещей, как окна, поля ввода и теги привязки.Так что у вас есть это. Семантически это имеет смысл.
источник
document.aForm.foo
работает, но спецификация HTML5, похоже, четко определяет интерфейс,HTMLFormElement
который имеетcaller getter any namedItem(in DOMString name);
. Больше на whatwg.org/specs/web-apps/current-work/multipage/…input
илиselect
, я говорю об атрибуте name aform
. Атрибут имениform
не передается на сервер.Для доступа к именованным элементам, размещенным в форме, рекомендуется использовать сам
form
объект.Чтобы получить доступ к произвольному элементу в дереве DOM, который иногда может быть найден в форме, используйте
getElementById
и элементid
.источник
Я предпочитаю 5-й метод. То есть
[5] Используйте специальный идентификатор JavaScript , это , чтобы передать форму или поле объекта в функции от обработчика событий.
В частности, для форм:
и
Используя эту технику, функция никогда не должна знать
- порядок, в котором формы определены на странице,
- идентификатор формы, или
- имя формы
Аналогично для полей:
и
В этом случае функция никогда не должна знать имя или идентификатор определенного поля веса, хотя она должна знать имя поля ограничения веса.
источник
Это не совсем ответ на ваш вопрос, но только в этой части:
Скорее всего
id
, вам все равно понадобится атрибут для каждого поля формы, чтобы вы могли связать<label>
с ним его элемент, например так:Это необходимо для доступности (т. Е. Если вы не связываете ярлыки форм и элементы управления, почему вы так ненавидите слепых?).
Это несколько избыточно, хотя в меньшей степени, когда у вас есть флажки / переключатели, где некоторые из них могут совместно использовать
name
. В конечном счете,id
иname
для разных целей, даже если для обоих часто установлено одинаковое значение.источник
Это немного устарело, но я хочу добавить кое-что, что я считаю актуальным.
(Я хотел прокомментировать один или два потока выше, но мне кажется, что мне нужна репутация 50, и у меня есть только 21 на момент, когда я пишу это. :))
Просто хочу сказать, что бывают ситуации, когда гораздо лучше получить доступ к элементы формы по имени, а не по идентификатору. Я не говорю о самой форме. Форма, хорошо, вы можете дать ему идентификатор, а затем получить к нему доступ по нему. Но если у вас есть переключатель в форме, гораздо проще использовать его как отдельный объект (получить и установить его значение), и, насколько я знаю, вы можете делать это только по имени.
Пример:
Вы можете получить / установить проверенное значение переключателя R1 в целом, используя
document.mainForm.R1.value
или
document.getElementById ("mainForm"). R1.value
Итак, если вы хотите использовать унитарный стиль, вы можете хочу всегда использовать этот метод, независимо от типа элемента формы. Я, мне очень удобно получать доступ к переключателям по имени и по текстовым полям по идентификатору.
источник
document.forms.mainForm.R1.value
это действительно хороший способ избежать использования уродливого и утомительного типаdocument.getElementById()
Будучи старомодным, я всегда использовал синтаксис document.myform.myvar, но недавно обнаружил, что он не работает в Chrome (нормально в Firefox и IE). Это была страница Ajax (то есть загруженная в свойство innerHTML элемента div). Возможно, Chrome не распознал форму как элемент основного документа. Вместо этого я использовал getElementById (без ссылки на форму), и он работал нормально.
источник
.forms
, так чтоdocument.forms.myform.myvar
Просто чтобы добавить ко всему уже сказанному, вы можете получить доступ к
input
s либо с помощью,name
либоid
используя предпочтительноelements
свойство формы Object, потому что без него вы можете получить свойство формы с именем "foo", а не элемент HTML. И, по словам Пола Д. Уэйта, совершенно нормально иметь как имя, так и идентификатор.Согласно MDN на странице HTMLFormElement.elements
источник
name
поле работает хорошо. Это дает ссылку наelements
.parent.children
- Перечислит все элементы с полем имени родителя.parent.elements
- перечислю толькоform elements
такие какinput-text, text-area, etc
Примечание:
.elements
чтобы работать,parent
нужно быть<form> tag
. Принимая во внимание, что.children
будет работать на любомHTML-element
- например,<div>, <span>, etc
.Удачи...
источник
Форма 2 в порядке, и форма 3 также рекомендуется.
Избыточность между name и id вызвана необходимостью сохранять совместимость, в html 5 некоторые элементы (такие как img, form, iframe и т. Д.) Потеряют свой атрибут «name», и рекомендуется использовать только их id, чтобы ссылаться на них с этого момента на :)
источник
В дополнение к другим ответам document.myForm.foo - это так называемый уровень DOM 0, который реализуется Netscape и, таким образом, на самом деле не является открытым стандартом, хотя он поддерживается большинством браузеров.
источник
Проверьте эту страницу: https://developer.mozilla.org/En/DOM/Document.getElementsByName
Это должны быть «элементы» и они должны возвращать массив, потому что более одного элемента могут иметь одно и то же имя.
источник
Мой ответ будет отличаться от точного вопроса. Если я хочу получить доступ к определенному элементу, я буду использовать document.getElementById (). Примером является вычисление полного имени человека, поскольку оно основано на нескольких полях, но это повторяемая формула.
Если я хочу получить доступ к элементу как части функциональной структуры (формы), я буду использовать:
Вот как это работает с точки зрения бизнеса. Изменения в цикле сопровождаются функциональными изменениями в приложении и имеют для них смысл. Я применяю его в основном для удобной проверки и предотвращения сетевых вызовов для проверки неверных данных. Я повторяю проверку на стороне сервера (и добавляю еще кое-что к ней), но если я могу помочь клиентской части пользователя, то это выгодно всем.
Для агрегирования данных (например, построение круговой диаграммы на основе данных в форме) я использую документы конфигурации и пользовательские объекты Javascript. Тогда точное значение поля важно по отношению к его контексту, и я использую document.getElementById ().
источник
Потому что дело [2]
document.myForm.foo
является диалектом из Internet Exploere. Так что вместо этого я предпочитаюdocument.forms.myForm.elements.foo
илиdocument.forms["myForm"].elements["foo"]
.источник
Я предпочитаю этот
источник