JavaScript事件侦听器在单选按钮上的标签上的行为不同
我试图在JavaScript中动态地向一组按钮添加事件侦听器。但是,只有在单选按钮中单击实际的圆形按钮,而不是按钮的标签时,该功能才会正确启动JavaScript事件侦听器在单选按钮上的标签上的行为不同,javascript,dom-events,Javascript,Dom Events,我试图在JavaScript中动态地向一组按钮添加事件侦听器。但是,只有在单选按钮中单击实际的圆形按钮,而不是按钮的标签时,该功能才会正确启动 功能设置RadioBackground(someCard){ someCard.querySelectorAll(“.form check input”).forEach((子项)=>{ 日志(“初始测试”,someCard); addEventListener(“单击”,函数(){ 控制台日志(someCard); shadeBackground(so
功能设置RadioBackground(someCard){
someCard.querySelectorAll(“.form check input”).forEach((子项)=>{
日志(“初始测试”,someCard);
addEventListener(“单击”,函数(){
控制台日志(someCard);
shadeBackground(someCard,child);
})
})
}
当函数最初运行时,它会正确显示事件侦听器添加到的卡,并带有initial test
。但是,当我在匿名事件侦听器函数中记录someCard
时,会得到不同的结果。如果单击标签,它将记录添加了事件侦听器的第一张someCard。但是,如果我单击圆形按钮,它将记录正确的卡,并且shadeBackground
功能正常工作
有没有办法让标签同样影响正确的卡片
最小可再现示例
要重现问题,请使用按钮添加两张(或更多)卡。单击第二张卡的无线电输入和标签。单击无线电输入将正确选择它,而单击标签将选择第一张卡的相应无线电输入。(使用“完整页面”按钮,以更好地显示输出。)
const-button=document.querySelector(“单击我”);
设计数器=0;
addEventListener(“单击”,函数(){
const card=document.createElement(“div”);
card.className=“card”;
card.id=`demoCard-${counter}`;
card.innerHTML=`
卡片标题
默认无线电
第二默认收音机
`
文档查询选择器(“.output”).appendChild(卡片);
document.querySelector(`demoCard-${counter}`).queryselectoral(“.form check”).forEach((子项)=>{
addEventListener(“change”,function()){
log(“您已单击”,孩子);
})
})
计数器+=1;
})
点击我
您的代码中存在多个问题:
card.innerHTML=`
默认无线电
第二默认收音机
`
document.querySelector(`demoCard-${counter}`).queryselectoral(“.form check”).forEach((child)=>{
addEventListener(“更改”,函数(){
log(“您已单击”,孩子);
})
})
致:
document.querySelector(`demoCard-${counter}`).queryselectoral(“.form check”).forEach((child)=>{
addEventListener(“change”,function()){
log(“您已单击”,孩子);
})
})
const-button=document.querySelector(“单击我”);
设计数器=0;
addEventListener(“单击”,函数(){
const card=document.createElement(“div”);
card.className=“card”;
card.id=`demoCard-${counter}`;
card.innerHTML=`
卡片标题
默认无线电
第二默认收音机
`
文档查询选择器(“.output”).appendChild(卡片);
document.querySelector(`demoCard-${counter}`).queryselectoral(“.form check”).forEach((子项)=>{
addEventListener(“change”,function()){
log(“您已单击”,孩子);
});
});
计数器+=1;
})
点击我
主要问题是您在运行时使用了相同的id:
card.innerHTML=`
卡片标题
默认无线电
第二默认收音机
`
每一张新卡将使用id=“examplereadios1”
和id=“examplereadios2”
作为其收音机。id应该是标识单个元素的标识符。浏览器也会执行此假设,因此当您使用for=“examplereadios1”
引用id时,它将始终使用id=“examplereadios1”
引用第一个元素
你可以用多种方法解决这个问题。最简单的方法不是为分配id和,而是用
包装
card.innerHTML=`
卡片标题
默认无线电
第二默认收音机
`
这不应该是一个更改
侦听器吗<代码>单击通常是实际的鼠标单击事件。尽管
元素也会触发一个事件,例如,如果您通过Enter或空格键按下它,则单击它。@VLAZ感谢您的建议。我已将其更改为change
侦听器,但仍然存在相同的行为。您如何从DOM中选择someCard
?您是否可以添加一个带有?由于缺少相应的HTML,很难看到您的示例中实际发生了什么。@3limin4t0r这是不可行的,它是可验证的。