2012-01-19 15 views
7

Tengo varios botones de opción con el mismo nombre. De esta manera:Adjuntar el detector de eventos mediante JavaScript al botón de opción

<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> 

Ahora tengo que agregar el detector de eventos a través de javascript a todos los botones de opción. Si el pseudocódigo a continuación es incorrecto, por favor, dime cómo hacerlo-

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

Respuesta

9

Porque en bucles en JavaScript devolver las llaves, no los valores. Para obtener el bucle en el que trabajar, suponiendo que no haya agregado propiedades personalizadas a la matriz, que haría:

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

Pero debe siempre bucle de una matriz con un habitual para bucle para evitar que accidentalmente incluyendo propiedades enumerables personalizadas:

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

¿Por qué usted "* siempre * bucle de una matriz con un habitual para el bucle"? – ojrask

+0

@ojrask - respuesta anterior, pero básicamente las propiedades personalizadas, si se agregan, podrían repetirse. Pero, por supuesto, con ES6 ahora tiene un bucle 'for of' que puede usar con matrices o cualquier iterable. –

+0

Ah sí, ya veo. No pensé en eso. ¿Tal vez edites la respuesta para explicar eso? :) – ojrask

5

Puede agregar solo un único oyente que escuche todos los botones de opción, en lugar de oyentes individuales.

usando jQuery, puede hacerlo de esta manera

$(document).ready(function(){ 
    $('input[type=radio]').click(function(){ 
     alert(this.value); 
    }); 
}); 

Demo

Sólo para las radios dentro de un formulario con el ID formA

$(document).ready(function(){ 
     $('#formA input[type=radio]').click(function(){ 
      alert(this.value); 
     }); 
    }); 

Sólo para radios con un id myradio

$(document).ready(function(){ 
    $('input[type=radio]').click(function(){ 
     if (this.id == "myradio") 
      alert(this.value); 
    }); 
}); 

Demo

+2

1. Necesito el código de JavaScript puro. 2. Quiero adjuntar el detector de eventos solo a aquellas radios que tienen el atributo de nombre establecido en "myradio" (considerar). Pero creo que el código anterior adjuntará la función a todas las radios en todo el documento. :( – Acn

+0

@BigFatPig puede hacer que se adjunte solo a las radios dentro de esa forma particular, o incluso radios que tienen una identificación particular – xbonez

+0

@BigFatPig ver las ediciones – xbonez

5

Un buen comienzo, pero no use for..in de esa manera, ya que iterar sobre todas las propiedades enumerables y no se ha comprobado si todos ellos representan elementos.

mucho mejor usar un índice:

for (var i=0, iLen=radios.length; i<iLen; i++) { 
    radios[i].onclick = function() {...}; 
} 
1
for(var property in object) { ... } 

se utiliza para bucle de objetos para encontrar propiedades. para la matriz se puede utilizar normal para bucle

for(var i=0; i< radios.length; i++) { 
    var radio = radios[i]; 
    .... 
} 
Cuestiones relacionadas