11

Consideremos un simple caso de JSelemento actual de getElementsByClassName

document.getElementsByClassName('test')[0].onclick=function(){ 
document.getElementsByClassName('test')[0].innerHTML = 'New Text'; 
} 

¿Cómo puedo extender el código de trabajo en general para todos los elementos con class="test". Me refiero a hacer clic en el elemento y reemplazar su contenido. De hecho, necesitamos obtener el número de nodo (provisto dentro del corchete) del evento click.

Estoy tratando de comprender mejor javascript en códigos discretos, no es un método práctico como jQuery.

Respuesta

16

Sólo iterar sobre ellos:

var elements = document.getElementsByClassName('test'); 

for (var i = 0; i < elements.length; i++) { 
    elements[i].addEventListener('click', (function(i) { 
     return function() { 
      this.innerHTML = 'New Text'; 
     }; 
    })(i), false); 
}​ 

utilicé (function(i) { return function() { ... }; })(i) en lugar de solo function() { ... } porque si lápiz para usar i en la devolución de llamada, el valor de i será elements.length - 1 cuando lo llame. Para solucionarlo, debe sombrear i y hacerlo pasar esencialmente por valor.

+0

Me pregunto si no sería mejor definir la función una vez, y simplemente agregar su referencia en cada iteración del ciclo. No estoy seguro de si el navegador es lo suficientemente inteligente, pero puede estar creando una función anónima en cada iteración. –

2
var all = document.getElementsByClassName('test'); 
for(var i=0;i<all.length;i++) 
    all[i].onclick=function(){ 
     this.innerHTML = 'New Text'; 
    } 

Pero es más recomendable utilizar addEventListener (o attachEvent, en el IE/Algunas versiones de Opera, supongo):

var all = document.getElementsByClassName('test'); 
for(var i=0;i<all.length;i++) 
    all[i].addEventListener('click',function(){//If you're gonna use attachEvent, use 'onclick' instead of 'click' 
     this.innerHTML = 'New Text'; 
    }}); 
+0

Él pregunta cómo hacer esto para todos los elementos con el nombre de clase 'test' y cómo obtener en javascript el elemento '[i]' que se hizo clic. No solo para configurar el innerHTML en 'Nuevo texto' – gabeio

4

sólo tiene que utilizar this dentro de la función. this será el elemento sobre el cual se lanzará el evento.

(function() { 
    var elms = document.getElementsByClassName("test"), 
     l = elms.length, i; 
    for(i=0; i<l; i++) { 
     (function(i) { 
      elms[i].onclick = function() { 
       this.innerHTML = "New Text"; 
      }; 
     })(i); 
    } 
})(); 

Es un poco más complicado que jQuery:

$(".test").click(function() { 
    $(this).html("New Text"); 
}); 

Pero será mucho más rápido y sin los excesos que jQuery añade;)

+0

IMO 'addEvntListener' es mejor que 'onclick' .. –

+0

@Derek ¡este es un punto interesante! ¿pero por qué? 'addEventListerner' no sobrescribe eventos anteriores, pero no es compatible con IE <9. ¿Hay alguna ventaja que me perdí? – Googlebot

+0

'onclick' está perfectamente bien, siempre que comprenda la limitación que conlleva: si lo sobrescribe, perderá cualquier evento adjunto existente. –

Cuestiones relacionadas