Почему переменная-массив вне функции вызывает проблемы для моего приложения со списком JavaScript? - PullRequest
0 голосов
/ 03 ноября 2018

Следующее приложение со списком JavaScript позволяет пользователю вводить элементы одним нажатием кнопки в массив с помощью метода push JS. Методы DOM затем используются для добавления элементов в неупорядоченный список. Пример # 1 включает переменную-массив WITHIN в функцию и правильно добавляет один элемент в один элемент списка. Однако при размещении переменной массива ДО функции в примере # 2 возникает сценарий, когда первый элемент добавляется правильно, но повторное нажатие для добавления второго элемента приводит к добавлению как нового элемента, так и предыдущего элемента (повторяется) к новый элемент списка. Почему предыдущий элемент повторно добавляется в новый элемент списка, когда переменная массива включена ДО функции? Смотрите примеры ниже. Обратная связь приветствуется!

Пример # 1 JS:

<script>
  function add(){
    var array = [];
    var task = document.getElementById("task").value;
    array.push(task);

    var text = document.createTextNode(array);
    var elem = document.createElement("li");
    elem.appendChild(text);
    document.getElementById("myUl").appendChild(elem);
  };
</script>

Пример # 1 HTML:

<input id="task">
<button onclick="add()">add</button>
<ul id="myUl"></ul>

Пример # 2 JS:

<script>
var array = [];

  function add(){
    var array = [];
    var task = document.getElementById("task").value;
    array.push(task);

    var text = document.createTextNode(array);
    var elem = document.createElement("li");
    elem.appendChild(text);
    document.getElementById("myUl").appendChild(elem);
  };
</script>

Пример # 2 HTML:

<input id="task">
<button onclick="add()">add</button>
<ul id="myUl"></ul>

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Ваш пример 2 делает то же самое, что и ваш пример 1.

Но, вероятно, вы не намерены объявлять переменную массива внутри функции во втором примере. В этом случае функция массива вне содержит список всех задач, которые вводит пользователь.

Кроме того, createTextNode принимает строку, а не массив в качестве аргумента. когда вы передаете массив, он преобразует массив задач в разделенную запятыми строку и добавляет в список.

так, в вашей функции add () передайте только последний добавленный элемент методу createTextNode, например

document.createTextNode(array[array.length - 1])

Что касается вашего первого примера, он не хранит входные данные в вашей памяти, поскольку переменная массива объявляется внутри функции и инициализируется как пустой массив - каждый раз, когда вызывается функция, т. Е. Когда добавляется задача. .

0 голосов
/ 03 ноября 2018

В примере 2 у вас есть дубликат в переменной array. Что вам, вероятно, нужно, это:

var array = [];

function add() {
  var task = document.getElementById("task").value;
  array.push(task);

  var text = document.createTextNode(task);
  var elem = document.createElement("li");
  elem.appendChild(text);
  document.getElementById("myUl").appendChild(elem);
  
  console.log(array);
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script>
  </script>
</head>

<body>
  <input id="task">
  <button onclick="add()">add</button>
  <ul id="myUl"></ul>
</body>

</html>

Кроме того, я сомневаюсь, что вы можете создать текстовый узел из массива (и что вы хотите, чтобы ). Я думаю, что вы имеете в виду task переменную.

...