Foros del Web » Programando para Internet » Javascript »

addeventlistener u otro método para actuar en muchos botones

Estas en el tema de addeventlistener u otro método para actuar en muchos botones en el foro de Javascript en Foros del Web. Hola a todos, Actualmente utilizo una función y un listener para cambiar la "class" de un DIV cuando se pulsa un botón. El mismo está ...
  #1 (permalink)  
Antiguo 24/02/2016, 01:33
Avatar de majete  
Fecha de Ingreso: noviembre-2007
Mensajes: 96
Antigüedad: 16 años, 5 meses
Puntos: 2
Exclamación addeventlistener u otro método para actuar en muchos botones

Hola a todos,
Actualmente utilizo una función y un listener para cambiar la "class" de un DIV cuando se pulsa un botón. El mismo está dentro de la DIV, y al pulsar el botón cambia su aspecto.

Código Javascript:
Ver original
  1. <script type="text/javascript">
  2.     function changeClass()
  3.     {
  4.         var elemento
  5.         /* elemento es el DIV */
  6.         document.getElementById("elemento").className += " best-price";
  7.  
  8.     }
  9.  
  10.     window.onload = function()
  11.     {
  12.         var radio
  13.         document.getElementById("boton").addEventListener( 'click' , changeClass );
  14.     }
  15.     </script>

El tema es que esto tengo que aplicarlo ahora a 40 elementos DIV y cada uno de ellos tiene 10 botones que actúan de "radiobuttons", por lo que el tema se complica y no quiero meter mucho código. La idea es que es un cuestionario con 40 preguntas (cada una de ellas en un div) y una escala de 10 valores para responder (con botones que hacen de radiobuttons). Quiero hacer que cuando una persona responda a esa pregunta cambie su aspecto para que el usuario vea que ya la ha respondido.
El id de los DIV será id=q1,q2,q3...q40
A los botones id=q1_1,q1_2,q1_3,etc.

¿Qué utilizaríais?

Si utilizo código en cada botón para llamar a una función, como son en total 400 botones igual estoy complicando el asunto. Por ejemplo:

En los botones
Código Javascript:
Ver original
  1. onclick="preguntaRespondida(this)"

En cambio si utilizo el listener de arriba, no sé como hacerlo para que me valga para cualquier botón y capa div. Además no sé si es conveniente y si puede afectar a otros elementos fuera del formulario en el evento "click".

¿Qué me recomendáis? He encontrado varios métodos cada cuál distinto, pero para este caso de 40 divs y 400 botones en total?

Gracias!
JC

Última edición por majete; 24/02/2016 a las 05:12
  #2 (permalink)  
Antiguo 24/02/2016, 12:53
Avatar de carlillos  
Fecha de Ingreso: febrero-2007
Ubicación: México
Mensajes: 245
Antigüedad: 17 años, 2 meses
Puntos: 21
Respuesta: addeventlistener u otro método para actuar en muchos botones

Podrías ponerle la misma clase a cada botón para luego generar una lista de esos botones con "getElementsByClassName", luego haces un loop para agregar el evento a cada botón.
Código HTML:
Ver original
  1. <div id="div1">
  2.     <p>Texto 1</p>
  3.     <button type="button" class="boton" name="1">Responder</button>
  4. </div>
  5.  
  6. <div id="div2">
  7.     <p>Texto 2</p>
  8.     <button type="button" class="boton" name="2">Responder</button>
  9. </div>
  10.  
  11. var botones = document.getElementsByClassName('boton');
  12.  
  13. for (var i = 0; i < botones.length; i++) {
  14.    crear_evento(botones[i]);
  15. }
  16.  
  17. function crear_evento(boton) {    
  18.    boton.onclick = function () {        
  19.        document.getElementById('div' + boton.name).className = 'nueva_clase';        
  20.    }    
  21. }
Cada botón tiene un atributo "name" diferente para identificarlo y cambiar su div correspondiente. Este ejemplo tiene 2 divs pero funciona para la cantidad que sea.
Saludos.

Última edición por carlillos; 24/02/2016 a las 13:08
  #3 (permalink)  
Antiguo 24/02/2016, 15:39
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: addeventlistener u otro método para actuar en muchos botones

Como ya lo he dicho en repetidas ocasiones, la mejor manera de registrar un evento y un mismo handler en varios elementos, es delegando el evento a cualquiera de los elementos ancentros de los elementos a afectar. Por ejemplo, puedes delegarlo al documento y, mediante la propiedad target del objeto del evento, capturar al elemento en el cual se produjo el evento (elemento objetivo), verificar que su clase sea la que asignamos a los elementos en cuestión y, de cumplirse la condición, se procederá a ejecutar las instrucciones respectivas:
Código Javascript:
Ver original
  1. document.addEventListener("evento", function(event){
  2.     if (event.target.className == "clase"){
  3.         //Instrucciones
  4.     }
  5. }, false);

Es mucho más eficiente hacerlo así que recorriendo al conjunto de elementos e ir delegando el evento a cada uno de ellos. Además, esta forma también es útil para cuando se desea trabajar con elementos dinámicos.

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: addeventlistener, botones, evento, formulario, muchos, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:21.