[英]Create multiple onclick events inside a for loop
我有多个 ID 为"especifica-i-pj"
按钮,其中 i 从 1 变为 4,j 从 1 变为 3。想法是为每个按钮分配一个onclick
事件,而不必声明 12 个函数. 我认为这会解决我的问题:
for ( i = 1; i <= 4; i++ ) {
for ( j = 1; j <= 3; j++ ) {
dom_id = "especifica-"+i.toString()+"-p"+j.toString();
document.getElementById(dom_id).onclick = function() {
console.log("you clicked ",dom_id)
ponder[i-1] = 0.1 + 0.05*(j-1);
console.log("ponder:",i,ponder[i-1])
$("#"+dom_id).addClass("active");
for ( k = 1; k <= 3 && k != j; k++ )
$("#especifica-"+i.toString()+"-p"+k.toString()).removeClass("active");
}
}
}
但是,每次单击任何按钮时,我的控制台都会输出我单击especifica-4-p3
(最后一个按钮)并输出 ponder ponder: 5 0.25
,当i==5
时应该不可能,因为外部 for 到达i==4
。
我能做些什么来完成这项工作? 我一直在网上搜索,但我没有找到任何关于此的内容,甚至没有在 for 循环中声明函数。 谢谢。
简单的方法是执行以下操作之一:
方法一:
for(i=1; i<=4; i++) {
for(j=1; j<=3; j++) {
dom_id = "especifica-"+i.toString()+"-p"+j.toString();
element = document.getElementById(dom_id);
element.i = i;
element.j = j;
element.onclick = function() {
console.log("you clicked ",dom_id)
ponder[this.i-1] = 0.1 + 0.05*(this.j-1);
console.log("ponder:",this.i,ponder[this.i-1])
$("#"+dom_id).addClass("active");
for(k=1; k<=3 && k!=j; k++)
$("#especifica-"+this.i.toString()+"-p"+k.toString()).removeClass("active");
}
}
}
方法二:
for(i=1; i<=4; i++) {
for(j=1; j<=3; j++) {
dom_id = "especifica-"+i.toString()+"-p"+j.toString();
document.getElementById(dom_id).onclick = function() {
i = dom_id.substring(11,12);
j = dom_id.substring(14,15);
console.log("you clicked ",dom_id)
ponder[i-1] = 0.1 + 0.05*(j-1);
console.log("ponder:",i,ponder[i-1])
$("#"+dom_id).addClass("active");
for(k=1; k<=3 && k!=j; k++)
$("#especifica-"+i.toString()+"-p"+k.toString()).removeClass("active");
}
}
}
方法三:
for(i=1; i<=4; i++) {
let i1 = i;
for(j=1; j<=3; j++) {
let j1 = j;
dom_id = "especifica-"+i.toString()+"-p"+j.toString();
document.getElementById(dom_id).onclick = function() {
console.log("you clicked ",dom_id)
ponder[i1-1] = 0.1 + 0.05*(j1-1);
console.log("ponder:",i,ponder[i1-1])
$("#"+dom_id).addClass("active");
for(k=1; k<=3 && k!=j; k++)
$("#especifica-"+i1.toString()+"-p"+k.toString()).removeClass("active");
}
}
}
最好的方法是捕获第一级父级的点击,这是所有按钮的父级,
仅针对您在单击时创建的内容,
在事件 function 内检测event.target
,它将告诉从哪个按钮发生点击
function buttonClick(event) { alert(event.target.getAttribute("id")); }
<div id="parent" onclick="buttonClick(event)"> <button id="especifica-1-p1">b11</button> <button id="especifica-1-p2">b12</button> <button id="especifica-1-p3">b13</button> <button id="especifica-2-p1">b21</button> <button id="especifica-2-p2">b22</button> <button id="especifica-2-p3">b23</button> </div>
如果你想维护数据1,1
1,2
...等,你可以这样做
在每个按钮中,您可以使用自己的名称假设引入虚拟数据属性
例子
<button id="especifica-1-p1" data-row="1" data-column="1">b11</button>
<button id="especifica-1-p2" data-row="1" data-column="2">b12</button>
然后你可以使用 JavaScript
event.target.getAttribute("data-row");
event.target.getAttribute("data-column");
这是使用data-*
属性的修复:
for (var i = 1; i <= 2; i++) { for (var j = 1; j <= 3; j++) { var buttonId = "especifica-" + i + "-p" + j; var button = document.getElementById(buttonId); button.setAttribute("data-i", i); button.setAttribute("data-j", j); button.addEventListener("click", function(event) { console.log("i", event.target.getAttribute("data-i")); console.log("j", event.target.getAttribute("data-j")); console.log("button with id of", event.target.id, "was clicked;"); }); } }
<div><button id="especifica-1-p1" type="button">especifica-1-p1</button></div> <div><button id="especifica-1-p2" type="button">especifica-1-p2</button></div> <div><button id="especifica-1-p3" type="button">especifica-1-p3</button></div> <div><button id="especifica-2-p1" type="button">especifica-2-p1</button></div> <div><button id="especifica-2-p2" type="button">especifica-2-p2</button></div> <div><button id="especifica-2-p3" type="button">especifica-2-p3</button></div>
在此处了解有关data-*
属性的更多信息:
或者,您可以利用closures
的概念,如下例所示:
for (var i = 1; i <= 2; i++) { for (var j = 1; j <= 3; j++) { var buttonId = "especifica-" + i + "-p" + j; var button = document.getElementById(buttonId); var createEventListener = function (iValue, jValue) { return function (event) { console.log("i:", iValue, "j:", jValue); console.log("button with id of", event.target.id, "was clicked;"); } }. button,addEventListener("click", createEventListener(i; j)); } }
<div><button id="especifica-1-p1" type="button">especifica-1-p1</button></div> <div><button id="especifica-1-p2" type="button">especifica-1-p2</button></div> <div><button id="especifica-1-p3" type="button">especifica-1-p3</button></div> <div><button id="especifica-2-p1" type="button">especifica-2-p1</button></div> <div><button id="especifica-2-p2" type="button">especifica-2-p2</button></div> <div><button id="especifica-2-p3" type="button">especifica-2-p3</button></div>
在此处阅读有closures
的更多信息:
此外,使用element.addEventListener
方法代替element.onclick
。 看看这里为什么最好使用addEventListener('click', ...)
而不是onclick
:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.