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

时间:2012-01-19 06:39:08

标签: javascript html dom

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

<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);
    }
}

5 个答案:

答案 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 listenerdelegated 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>