我有几个同名的单选按钮。像这样:
<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);
}
}
答案 0 :(得分:14)
对于JavaScript中的in循环,返回键,而不是值。要使for循环工作,假设您尚未向阵列添加自定义属性,则执行以下操作:
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);
}
}
答案 1 :(得分:6)
您只能添加一个侦听所有单选按钮的侦听器,而不是单个侦听器。
使用jquery,你可以这样做
$(document).ready(function(){
$('input[type=radio]').click(function(){
alert(this.value);
});
});
<强> Demo 强>
仅适用于标识为formA
$(document).ready(function(){
$('#formA input[type=radio]').click(function(){
alert(this.value);
});
});
仅适用于ID为myradio
$(document).ready(function(){
$('input[type=radio]').click(function(){
if (this.id == "myradio")
alert(this.value);
});
});
<强> Demo 强>
答案 2 :(得分:6)
一个良好的开端,但不要以这种方式使用,因为它将迭代所有可枚举的属性,而你还没有检查它们是否都代表元素。
使用索引要好得多:
for (var i=0, iLen=radios.length; i<iLen; i++) {
radios[i].onclick = function() {...};
}
答案 3 :(得分:2)
for(var property in object) { ... }
用于循环对象以查找属性。 对于数组,您可以使用normal for loop
for(var i=0; i< radios.length; i++) {
var radio = radios[i];
....
}
答案 4 :(得分:0)
另一种选择是使用attach multiple elements to a single event listener来delegated handlers
您可以将父侦听器附加到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>