通过 javascript 将事件侦听器附加到单选按钮

新手上路,请多包涵

我有几个同名的单选按钮。像这样:

 <form name="formA">
<input type="radio" name="myradio" value="A"/>
<input type="radio" name="myradio" value="B"/>
<input type="radio" name="myradio" value="C"/>
<input type="radio" name="myradio" value="D"/>
</form>

现在我必须通过 javascript 将事件侦听器添加到所有单选按钮。如果下面的伪代码是错误的,那么请告诉我该怎么做-

 var radios = document.forms["formA"].elements["myradio"];
  for(radio in radios) {
    radio.onclick = function() {
        alert(radio.value);
    }
}

原文由 Acn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 552
2 个回答

JavaScript 中的 for in 循环返回键,而不是值。要使 for in 循环正常工作,假设您没有向数组添加自定义属性,您可以这样做:

 for(radio in radios) {
    radios[radio].onclick = function() {
        alert(this.value);
    }
}

但是您应该 始终 使用常规 for 循环来循环数组,以避免意外包含自定义添加的可枚举属性:

 var radios = document.forms["formA"].elements["myradio"];
for(var i = 0, max = radios.length; i < max; i++) {
    radios[i].onclick = function() {
        alert(this.value);
    }
}

原文由 Adam Rackis 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种选择是使用 委托处理程序 将多个元素附加到单个事件侦听

您可以将父侦听器附加到 document 或任何适当的父节点。然后,您可以使用 Element.matches() API 或 event.target 上的任何内容检查事件是否由适当的目标引发

document.getElementById("languages").addEventListener('click', function (event) {
    if (event.target && event.target.matches("input[type='radio']")) {
        // do something here ...
    }
});

这大致相当于以下使用 .on() 提供委托的 jQuery 语法

$("#languages").on("click", "input[type='radio']", function(event) {
    // do something here ...
});

如果你想扩展 EventTarget.addEventListener() 原型,你可以用你自己的方法包装:

 window.EventTarget.prototype.addDelegatedListener = function(type, delegateSelector, listener) {
    this.addEventListener(type, function (event) {
        if (event.target && event.target.matches(delegateSelector)) {
            listener.call(event.target, event)
        }
    });
}

然后像这样使用:

 document.addDelegatedListener("click", "input[type='radio']", function(event) {
    // do something here ...
});

堆栈片段中的演示

 // example 1 - regular add event listener
document.getElementById("languages").addEventListener('click', function (event) {
    if ( event.target && event.target.matches("input[type='radio']") ) {
        console.log(event.target.value)
    }
});

// example 2 - reusable delegated listener
window.EventTarget.prototype.addDelegatedListener = function(type, delegateSelector, listener) {
    this.addEventListener(type, function (event) {
        if (event.target && event.target.matches(delegateSelector)) {
            listener.call(event.target, event)
        }
    });
}

let parent = document.getElementById("weekdays")
parent.addDelegatedListener("click", "input[type='radio']", function(event) {
    console.log(this.value)
});
 h3 {
    margin-top: 20px;
    margin-bottom: 10px;
    font-size: 1.1em;
}
code {
    background: #e9e9e9;
    padding: 1px 4px;
    border-radius: 3px;
}
label input {
    vertical-align: text-top;
}
 <h3>Languages <code>addEventListener</code> + <code>Element.matches</code></h3>
<div id="languages">
  <label><input type="radio" name="languages" value="HTML"> HTML </label>
  <label><input type="radio" name="languages" value="JS"> JS </label>
  <label><input type="radio" name="languages" value="CSS"> CSS </label>
</div>

<h3>Weekdays <code>EventTarget.prototype.addDelegatedListener</code></h3>
<div id="weekdays">
  <label><input type="radio" name="days" value="Mon"> Mon </label>
  <label><input type="radio" name="days" value="Tue"> Tue </label>
  <label><input type="radio" name="days" value="Wed"> Wed </label>
</div>

原文由 KyleMit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题