Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Duda con funcion Js

Estas en el tema de Duda con funcion Js en el foro de Javascript en Foros del Web. Hola, tengo el siguiente código: <!DOCTYPE html> <html> <head> <style> .boton_inactivo { border: 1px solid black; margin: 5px; background: green; } .boton_activo { border: 1px ...
  #1 (permalink)  
Antiguo 09/03/2018, 04:56
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 1 mes
Puntos: 0
Duda con funcion Js

Hola, tengo el siguiente código:

<!DOCTYPE html>
<html>
<head>
<style>
.boton_inactivo {
border: 1px solid black;
margin: 5px;
background: green;

}

.boton_activo {
border: 1px solid black;
margin: 5px;
background: yellow;

}
</style>

</head>

<body>
<ul>
<li><a class="boton_inactivo">prueba1</a></li>
<li><a class="boton_inactivo">prueba2</a></li>
<li><a class="boton_inactivo">prueba3</a></li>
<li><a class="boton_inactivo">prueba4</a></li>
<li><a class="boton_inactivo">prueba5</a></li>
<li><a class="boton_activo">Prueba6</a></li>
</ul>

<button onclick="seleccionar()">Cambiar</button>

<script>
function seleccionar() {
if (document.getElementsByClassName("boton_inactivo") .length > 0) {
var boton = document.getElementsByClassName("boton_inactivo");
var i;
for (i = 0; i <= boton.length; i++) {
alert (i);
boton[i].className = "boton_activo";
}
}
}
</script>

</body>
</html>



La idea es que tengo una serie de botones (en realidad son etiquetas <a href>) y pretendo que al pulsar un botón estas cambien de estilo.

He elaborado (modificando una que encontré) esta función que en teoria deberia hacerlo, pero no entiendo por qué se comporta de esta forma.

Cuando pulso el botón, teoricamente los elementos se cargan en el array boton[x] y les modifica el artibuto className, pero lo extraño es que solo lo hace con los elementos impares, es decir, solo cambia prueba1, prueba3 y prueba5....

Por mas vueltas que le doy y mas pruebas que hago no consigo encontrarle ninguna lógica.

Un saludo
  #2 (permalink)  
Antiguo 09/03/2018, 07:27
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Duda con funcion Js

Saludo

Intenta con esta condición

Código Javascript:
Ver original
  1. for (i = boton.length - 1; i >= 0; i--)
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 09/03/2018, 12:58
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 5 meses
Puntos: 86
Respuesta: Duda con funcion Js

El problema es, aunque te resulte extraño, es que usas getElementsByClassName. Este método es live. No te explico que quiere decir pues ya lo expliqué hace tiempo. En su lugar usa querySelectorAll()
  #4 (permalink)  
Antiguo 09/03/2018, 14:46
alvaro_trewhela
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con funcion Js

Y si pruebas con getElementsByTagName("a")
  #5 (permalink)  
Antiguo 10/03/2018, 09:50
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: Duda con funcion Js

Lo que mpozo quiso decir es que dicho método considera a la selección actual o "en vivo" de elementos de acuerdo con la clase usada para la búsqueda. Esto quiere decir que, si modificas un elemento previamente seleccionado y su nuevo estado no cumple con los requisitos para seguir estando seleccionado de acuerdo con la búsqueda inicial, entonces ya no se le considera y la selección decrementa su cantidad de elementos en uno y así sucesivamente.

Lo que sucede en tu caso es lo siguiente:

1. El total de elementos seleccionados al inicio es de 5.
2. En la primera iteración del bucle, se cambia la clase del primer elemento, por lo cual, ese total de 5 ahora pasa a ser 4 (recuerda que es un método "live" o "en vivo").
3. A su vez, el segundo elemento de la lista ahora pasa a ser el primero.
4. El contador i incrementó su valor en uno, por lo que, en la siguiente iteración, va a seleccionarse al segundo elemento de la lista, solo que este era originalmente el tercero pero ahora es el segundo porque se retiró al primero de la lista, produciéndose el desarreglo que has notado.

La solución, como te lo han dicho, consiste en trabajar con el método .querySelectorAll(".clase").

__________________
«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
  #6 (permalink)  
Antiguo 12/03/2018, 02:41
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Duda con funcion Js

Gracias a todos, entendí el problema.

Lo solucioné cambiando

boton[i].className = " boton_activo";

por

boton[i].className += " boton_activo";


Un saludo

Etiquetas: funcion, html, js
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:41.