为什么函数外的数组变量会导致我的 JavaScript 列表应用出现问题?
Why does array variable outside of function cause issues for my JavaScript list app?
以下 JavaScript 列表应用程序允许用户通过单击按钮将项目输入到具有 JS 推送方法的数组中。然后使用 DOM 方法将项目附加到无序列表。示例 #1 在函数中包含数组变量,并正确地将单个项目附加到单个列表元素。但是,当在示例 #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 中,您在 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
变量。
您的示例 2 与您的示例 1 完全相同。
但您可能不打算在第二个示例中的函数内声明数组变量。在那种情况下,数组外部函数实际上保存着用户输入的所有任务的列表。
此外,createTextNode 以字符串而非数组作为参数。当您传递数组时,它会将任务数组转换为逗号分隔的字符串并附加到列表中。
因此,在您的 add() 函数中,仅将最后添加的项目传递给 createTextNode 方法,例如
document.createTextNode(array[array.length - 1])
来到你的第一个例子,它不会在你的记忆中保存输入,因为数组变量是在函数内部声明的,并且被初始化为一个空数组 - 每次函数被调用时,即每当一个任务已添加。
以下 JavaScript 列表应用程序允许用户通过单击按钮将项目输入到具有 JS 推送方法的数组中。然后使用 DOM 方法将项目附加到无序列表。示例 #1 在函数中包含数组变量,并正确地将单个项目附加到单个列表元素。但是,当在示例 #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 中,您在 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
变量。
您的示例 2 与您的示例 1 完全相同。
但您可能不打算在第二个示例中的函数内声明数组变量。在那种情况下,数组外部函数实际上保存着用户输入的所有任务的列表。
此外,createTextNode 以字符串而非数组作为参数。当您传递数组时,它会将任务数组转换为逗号分隔的字符串并附加到列表中。
因此,在您的 add() 函数中,仅将最后添加的项目传递给 createTextNode 方法,例如
document.createTextNode(array[array.length - 1])
来到你的第一个例子,它不会在你的记忆中保存输入,因为数组变量是在函数内部声明的,并且被初始化为一个空数组 - 每次函数被调用时,即每当一个任务已添加。