将跨度值推送到数组
Push span value to array
我正在构建一个计算器,并希望让每个按钮将其值发送到名为"storage"的空数组。首先,我无法为每个按钮运行我的代码,也不确定为什么会这样。它仅在#1按钮上运行。其次,我不确定如何将值发送到数组"存储"。我知道JS有一个.push();方法,但事情对我不起作用。
拜托,没有JQuery,我想先在普通JS中获得一个良好的基础。
// Click on button and have number saved in array for later use
var spanVal = document.getElementsByClassName("num");
var storage = [];
function clickButton() {
var key = document.querySelector(".num");
key.onclick = logVal;
}
function logVal() {
for (var i = 0; i < spanVal.length; i++) {
console.log(spanVal[i].innerHTML);
}
}
clickButton();
/*storage.push();
console.log(storage);*/
#calculator {
max-width: 250px;
}
.keys span {
width: 50px;
height: 50px;
border-radius: 5px;
float: left;
margin: 8px;
font: bold 20px Arial, sans-serif;
text-align: center;
}
.grey {
background-color: grey;
}
.blue {
background-color: aqua;
}
.screen {
width: 180px;
height: 40px;
border-radius: 3px;
background-color: #ccc;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<div id="calculator">
<div class="keys">
<div class="screen"></div>
<span class="num grey">1</span>
<span class="num blue">2</span>
<span class="num grey">3</span>
<span class="num blue">4</span>
<span class="num grey">5</span>
<span class="num blue">6</span>
<span class="num grey">7</span>
<span class="num blue">8</span>
<span class="num grey">9</span>
<span class="num blue">0</span>
<span class="num grey operator">+</span>
<span class="num blue operator">-</span>
<span class="num grey operator">/</span>
<span class="num blue operator">*</span>
<span class="num grey operator">AC</span>
</div>
</div>
</head>
<body>
</body>
</html>
我的代码
document.getElementsByClassName
返回一个 HTML 集合。您需要循环访问集合中的每个元素,并将函数添加到每个键。
document.querySelector
仅返回第一个元素。您需要使用 document.querySelectorAll
并迭代数组。
返回文档中与指定的选择器组匹配的第一个元素(使用文档节点的深度优先预序遍历|按文档标记中的第一个元素,并按子节点的数量顺序循环访问
顺序节点)。
var numbers = document.getElementsByClassName("num");
var storage = [];
您已经在数字中定义了集合。您可以使用 forEach
方法简单地迭代数字。无需创建单独的键变量。集合已存在。
numbers.forEach(function(number) {
number.addEventListener("click", function() {
storage.push(number.innerHTML);
});
});
这将处理所有键,考虑数字与运算符,并且仅附加一个事件侦听器。
var nums = [];
var operators = [];
document
.querySelector('.keys')
.addEventListener('click', function(e) {
var key = e.target.innerHTML
if (! isNaN(Number(key))) {
nums.push(Number(key));
} else {
operators.push(key);
}
console.log('Nums:', nums);
console.log('Operators:', operators);
});
我将侦听器附加到父节点,我们获得了"单击"范围的内部 HTML,并转换为整数。这些 int 被推送到 nums 数组,它在每次单击时打印出数组的当前值,您可以在此处或侦听器之外对它们执行操作。
JSBin.我在发布垃圾箱方面非常失败。http://jsbin.com/wireboputu/1/edit?html,js,console,output
注意其他实现将侦听器附加到每个跨度也很方便,这有点混乱。在这里,我们只将一个附加到父对象,并从事件对象中获取详细信息。
编辑:更改为考虑操作员/数字。我的第一次尝试将在操作员键上返回未定义。而且我原来的标题并不像我的第一个实现那么简单,所以把它拿走了。
很好开始
首先,我无法为每个按钮运行我的代码,并且不确定为什么会这样
该函数document.querySelector
返回单个项目。 如果查询找到多个,它将返回第一个。您可能希望使用 document.querySelectorAll
,遍历结果,并使用addEventListener
第二个问题可以通过推送到 OnClick 处理程序中的存储阵列来解决。
编辑:由于查询返回节点列表,而不是数组,因此请使用for循环进行迭代,而不是forEach
函数
最终结果将如下所示:
var calcKeys = document.querySelectorAll('.num')
for (var i = 0; i < calcKeys.length; i++){
calcKeys[i].addEventListener('click', function(e){
storage.push(e.target.innerHTML)
})
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<style>
#calculator {
max-width: 250px;
}
.keys span {
width: 50px;
height: 50px;
border-radius: 5px;
float: left;
margin: 8px;
font: bold 20px Arial, sans-serif;
text-align: center;
}
.grey {
background-color: grey;
}
.blue {
background-color: aqua;
}
.screen {
width: 180px;
height: 40px;
border-radius: 3px;
background-color: #ccc;
}
</style>
</head>
<body>
<div id="calculator">
<div class="keys">
<div class="screen"></div>
<span class="num grey">1</span>
<span class="num blue">2</span>
<span class="num grey">3</span>
<span class="num blue">4</span>
<span class="num grey">5</span>
<span class="num blue">6</span>
<span class="num grey">7</span>
<span class="num blue">8</span>
<span class="num grey">9</span>
<span class="num blue">0</span>
<span class="num grey operator">+</span>
<span class="num blue operator">-</span>
<span class="num grey operator">/</span>
<span class="num blue operator">*</span>
<span class="num grey operator">AC</span>
</div>
<button id="btn" onclick ="clickButton()">push values</button>
</div>
<script>
var x = 0;
var spanVal = document.getElementsByTagName("span");
var storageArr = [];
function clickButton() {
storageArr.push(spanVal[x].innerHTML)
x++;
alert(storageArr)
}
</script>
</body>
</html>
您可以使用 span 来创建按钮,其中 innerHTML(span 内的文本)是数字:
<span id='btn1' class=number>1</span>
捕获该按钮上的单击事件。
onclick='go()';
当该事件触发时,您可以使用事件元素的 id (btn1) 将存储在 span 的 innerHTML 中的值推送到数组中:
storage.push(document.getElementById(el).innerHTML);
您可以为其余数字或按钮添加任意数量的跨度:
<span id=btn2 class=number>2</span>
下面是一个工作示例:
<html>
<head>
<style>
div {
text-align:center;
padding:5px;
}
.number {
cursor:pointer;
width:30px;
height:30px;
background-color:silver;
border: solid 1px black;
text-align:center;
padding:5px;
margin:3px;
}
</style>
<script>
var storage = []; //this is your empty array called storage
document.addEventListener('click' , function(e){go(e)}); // i'm trapping the click event for my button
function go(e){
var el = e.target.id; // get the event element's id
storage.push(document.getElementById(el).innerHTML); // use that id to obtain the element with that id's document object reference and push it's innerHTML (or you could use another property on that object for this) and push it to the storage array.
console.log(storage); //display the storage array in the console window
}
</script>
</head>
<body>
<div>
<span id='btn1' class='number'>1</span>
<span id='btn2' class='number'>2</span>
<span id='btn3' class='number'>3</span>
</div>
<div>
<span id='btn4' class='number'>4</span>
<span id='btn5' class='number'>5</span>
<span id='btn6' class='number'>6</span>
</div>
<div>
<span id='btn7' class='number'>7</span>
<span id='btn8' class='number'>8</span>
<span id='btn9' class='number'>9</span>
</div>
<div>
<span id='btn0' class='number'>0</span>
</body>
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 无法通过数组映射绑定
- javascript中的数组出错
- 如何使用 node.js 比较两个 json 数组
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- 如何通过数组更新角度子范围
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 在Javascript中转换对象数组
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串