javascript - Javascript 数组 - 全局范围的问题
问题描述
我无法弄清楚为什么这不起作用。在第一个函数中将项目添加到数组中,但在第二个函数中无法访问(尽管声明数组时添加的项目在那里)。我认为与数组的全局范围有关,但我可以看到如何让它工作。
var theArray = ["apple"];
function addValue() {
var myValue = document.forms["myAdd"]["myInput"].value;
theArray.push(myValue);
alert(theArray[theArray.length - 1]);
/*works ok*/
}
function getValue() {
alert(theArray[theArray.length - 1]);
/*returns 'apple', not last item pushed on array*/
}
<h1>Array example</h1>
<form name="myAdd" onsubmit="return addValue()" method="post">
Add to array: <input type="text" name="myInput">
<input type="submit" value="Go">
</form>
<p>Get from array</p>
<form name="myGet" onsubmit="return getValue()" method="post">
<input type="submit" value="Go">
</form>
解决方案
提交表单的默认操作是重新加载页面(如果表单具有action=
属性,则将位置更改为该属性)。
重新加载页面将导致内存中保存的所有值(即变量)被擦除。有一些方法可以解决这个问题,比如 using localStorage
,但我怀疑您并不打算让表单的默认行为占据主导地位。
为此,我们preventDefault()
在事件对象上有一个方法:
var theArray = ["apple"];
var addForm = document.getElementById('add-form');
var getForm = document.getElementById('get-form');
addForm.addEventListener('submit', addValue);
getForm.addEventListener('submit', getValue);
function addValue(event) {
event.preventDefault(); // Stops the form submission
var myValue = document.forms["myAdd"]["myInput"].value;
theArray.push(myValue);
alert(theArray[theArray.length - 1]);
}
function getValue(event) {
event.preventDefault();
alert(theArray[theArray.length - 1]); // Now works as expected.
}
<h1>Array example</h1>
<form id="add-form" name="myAdd" method="post">
Add to array: <input type="text" name="myInput">
<input type="submit" value="Go">
</form>
<p>Get from array</p>
<form id="get-form" name="myGet" method="post">
<input type="submit" value="Go">
</form>
请注意我是如何onsubmit=
从您的表单元素中删除该属性的,使用这些属性被认为是不好的做法on*=
,因为它们会迫使您的代码变得比它需要的更全局化。
相反,我为它们提供了 ID 以便于在 DOM 中找到它们(您可以使用任何其他方法,您所需要的只是对表单 DOM 元素的引用),并调用addEventListener
它们。
推荐阅读
- python - 尝试访问嵌套列表中的字符串元素
- python - 使用numpy根据一列的条件选择行
- android - 位图解码字节 = BitmapFactory.decodeByteArray 始终为空
- docker - 无法从 docker 实例连接到本地 MQTT 服务器(在 Windows 10 上运行)
- laravel - Laravel 通过关系查询
- firebase - 我可以在没有方法 add 的情况下从颤振生成 Doc id 到 firebase 吗?
- python - 更新 json 文件中的列表并使用 Python 保持相同的缩进
- asp.net-mvc - 扩展 AspNetCore 视图发现
- c# - 从泛型 T 获取属性类型而不使用反射
- r - UseMethod(“rescale”)中的错误:没有适用于“rescale”的适用方法应用于“c('haven_labelled','vctrs_vctr','double')”类的对象