Вопрос по циклу Javascript

  • Автор темы Flashobmen
  • Обновлено
  • 13, May 2024
  • #1
Нужна помощь с Javascript, я пытаюсь заполнить все текстовые поля именем файла из входного файла. Заполнен только один текстовый ввод. Заранее спасибо:

 
<html>
<head>
<title>Untitled Document</title>
<meta charset="utf-8">
</head>

<body>
 <form>
 <input type="file" id="fileinput"><br>
 <input type="text" id="textinput_1" class="countme"><br>
 <input type="text" id="textinput_2" class="countme"><br>
 <input type="text" id="textinput_3" class="countme"><br>
 <input type="text" id="textinput_3" class="countme">
 </form>
 <script>

const countAll = document.querySelectorAll('.countme').length; // Count elements
console.log(countAll); // 3
for (let i = 1; i < countAll; i++) {

 const textinput = document.getElementById('textinput_' + i); // textinput_1, textinput_2, etc
 document.getElementById('fileinput').oninput = function() {
 textinput.value = document.getElementById('fileinput').files[0].name;

 }
}
 </script>
</body>
</html>


Код (разметка):

Flashobmen


Рег
08 Jun, 2018

Тем
95

Постов
201

Баллов
696
  • 04, Jun 2024
  • #2
Ваша логика вывернута наизнанку, вы должны зацикливаться ВНУТРИ события, а не вокруг него.

Вы также слишком много об этом думаете, поскольку в начале вы выполняете очень хороший запросSelectorAll, а это означает, что вам не нужно тратить время на возню с getElementById внутри события.

Кроме того, сейчас 2022 год, а не 1998 год, не используйте onInput напрямую, если только вы буквально не создали элемент в DOM.

Используйте addEventListener.

Возможно, вам также лучше просто пройтись по DOM, а не возиться с querySelectorAll, позволяя вам уничтожить идентификаторы и классы.

 <form>
<input type="file" id="fileinput"><br>
<fieldset id="counts">
<input type="text"><br>
<input type="text"><br>
<input type="text"><br>
<input type="text">
</fieldset>
</form>

<script>

{ // isolate scoope

const
fileInput = document.getElementById("fileInput"),
countSet = document.getElementById("counts");

fileInput.addEventListener("input", (event) => {
let input = countSet.firstElementChild;
if (input) do {
input.value = fileInput.files[0].name;
} while (input = input.nextElementSibling);
} );

}

</script>


Код (разметка). Помните, что методы getElement(s)ByXXX и querySelector(all) работают медленно, поэтому старайтесь не вызывать их чаще, чем необходимо, и избегайте использования их внутри событий.

Точно так же массивы и итерации работают медленнее по сравнению с простым перемещением по DOM.

Добавьте контейнер, например набор полей, зацепите его первый дочерний элемент, а затем пройдите по братьям и сестрам.

ВНУТРИ события, а не вокруг него.
 

JamboIV


Рег
13 Nov, 2015

Тем
82

Постов
187

Баллов
597
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно