Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Получить поле инпута (https://javascript.ru/forum/events/80014-poluchit-pole-inputa.html)

ureech 17.04.2020 13:35

Получить поле инпута
 
Привет. Есть инпут
<input class="form-control" type="text" name="mykal[]" value=""/>

Нужно вставить значение в этот инпут с таким именем "mykal[]". Как его получить?
document.forms['my-recept'].mykal[].value
Так не работает(.

voraa 17.04.2020 15:17

document.forms['my-recept']['mykal[]'].value


А зачем такое имя name="mykal[]"?

ureech 17.04.2020 15:31

Спасибо.Сейчас попробую. А такое имя нужно,когда нужны несколько одинаковых полей.

ureech 17.04.2020 15:45

Нет,так не работает

voraa 17.04.2020 15:53

Так их несколько? А в какое именно надо вставлять?

laimas 17.04.2020 16:16

document.forms['my-recept']['mykal\[\]'].value


Для множества элементов так не получится.

ureech 17.04.2020 17:23

Цитата:

Сообщение от laimas (Сообщение 522956)
document.forms['my-recept']['mykal\[\]'].value


Для множества элементов так не получится.

Да,я уже понял(. Придётся подругому решать.

ureech 17.04.2020 17:24

Цитата:

Сообщение от voraa
Так их несколько? А в какое именно надо вставлять?

В каждое по очереди.

Malleys 18.04.2020 01:36

Цитата:

Сообщение от laimas
document.forms['my-recept']['mykal\[\]'].value

Зачем тут экранирование? Разве квадратные скобки — специальные символы в строке?
alert("mykal\[\]" === "mykal[]"); // true


Цитата:

Сообщение от laimas
Для множества элементов так не получится.

Почему?
Цитата:

Сообщение от https://www.w3.org/TR/html53/sec-forms.html#the-form-element
interface HTMLFormElement : HTMLElement {
  /* в частности объявлено также... */
  [SameObject] readonly attribute HTMLFormControlsCollection elements;
  getter Element (unsigned long index);
  getter (RadioNodeList or Element) (DOMString name);
};


[...]

form[name]
Returns the form control (or, if there are several, a RadioNodeList of the form controls) in the form with the given ID or name (excluding image buttons for historical reasons); or, if there are none, returns the img element with the given ID. [...] If there are multiple matching items, then a RadioNodeList object containing all those elements is returned.



Цитата:

Сообщение от voraa
А зачем такое имя name="mykal[]"?

Цитата:

Сообщение от ureech
А такое имя нужно,когда нужны несколько одинаковых полей.

Вы можете называть как угодно, в случае, когда будет только одно поле, document.forms['my-recept']['mykal'] возвратит один элемент формы (класс Element). В случае, когда полей несколько — будет возвращён список элементов формы (класс RadioNodeList)

Цитата:

Сообщение от ureech
Нет,так не работает

Цитата:

Сообщение от laimas
Для множества элементов так не получится.

Если вы хотите обращаться к элементам так — document.forms["my-recept"]["mykal"], то вам следует обработать оба из возможных возвращаемых вариантов... Но вам рекомендую не использовать такое обращение!
<form action="#" name="my-recept">
	<input class="form-control" name="mykal">
	<input class="form-control" name="mykal">
</form>

<script>

	const ref = document.forms["my-recept"]["mykal"];
	
	switch(true) {
		case ref instanceof RadioNodeList:
			for(const element of ref) {
				element.value = "5";
			}
			break;
		case ref instanceof Element:
			ref.value = "5";
			break;
	}
	
</script>


Я вам рекомендую использовать document.querySelectorAll, тогда у вас будет одинаковая обработка отсутствия элемента, одного элемента и множества элементов...
<form action="#" name="my-recept">
	<input class="form-control" name="mykal">
	<input class="form-control" name="mykal">
</form>

<script>

	for(const element of document.querySelectorAll("form[name='my-recept'] [name='mykal']")) {
		element.value = "5";
	}
	
</script>

ureech 18.04.2020 09:43

Malleys,
Благодарю за содержательный ответ.Весьма позновательно. Правда я пошёл другим,не самым "лёгким" путём и теперь наверное придётся всё переделать, так как этот вариант решает ряд возникших вопросов.


Часовой пояс GMT +3, время: 17:40.