Ver Mensaje Individual
  #8 (permalink)  
Antiguo 17/02/2013, 14:06
Avatar de emprear
emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 4 meses
Puntos: 1567
Respuesta: Ocultar elementos de una lista según su clase

He visto tu función(y tu html) y tiene muchas fallas, estas fallas las podemos dividir muy genericamente en 2

1. las de sintáxis
2. como implementar método, funciones y propiedades
pero si hay de las primeras ya no podrás evaluar las segundas

iniar el documento con
<html>

<html>
Está mal
<boby> NO existe, <body> si
getElementByClassName NO existe, getElementsByClassName sí, ves la diferencia?
Veas a las cosas que me refiero, eso es falta de atención, por lo tanto a partir de ahora que cada ejemplo que quieras hacer, usá como base:

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <meta charset="utf-8" />
  3. <title>título</title>
  4. <script type="text/javascript">
  5. //<![CDATA[
  6. // aqui tu script
  7. //]]>
  8. </head>
  9.  
  10. </body>
  11. </html>

Ahora vamos a tu caso particular, voy directamente a mostrarte como resolverlo. Pero antes unas aclaraciones finales:
Javascript suele ofrecer a veces varias formas de resolver un problema, no te quedes con lo primero que te funcione, ni siquiera lo que yo te indique, siempre puede haber algo mejor.
Si querés aprender, tenés que conocer las herramientas primero, luego aplicarlas en función de un objetivo.
Vamos al punto, lo que querés no es precisamente fácil y tampoco estoy seguro de que objetivo cumple, da la sensación que estás utilizando las clases como quien filtra un texto (o realiza una búsqueda) usando etiquetas y no precisamente para aplicar estilos, bue, no sé , es un poco complejo.

el html quedaría asi
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es-ar">
  3. <meta charset="utf-8" />
  4. <title>Filtro x className</title>
  5. <style type="text/css">
  6. li{list-style:none;}
  7. form{display:inline-block;}
  8. <script type="text/javascript">
  9. function boxes(laClase,t){
  10. var cb = document.getElementsByName('box');
  11. var lista = document.getElementsByClassName(laClase);
  12.     for (e=0; e < cb.length; e++) {
  13.         if(t.checked == false){
  14.             for (var i=0; i<lista.length; i++) {
  15.             //console.log(lista[i].className); // descomentar para verificar
  16.             lista[i].style.display = 'none';
  17.             }
  18.         }else{
  19.             for (var i=0; i<lista.length; i++) {
  20.             //console.log(lista[i].className); // descomentar para verificar
  21.             lista[i].style.display = 'block';
  22.             }  
  23.  
  24.         }
  25.     }
  26. }
  27. </head>
  28. <form action="#">
  29. <input type="checkbox" name="box"
  30. checked="checked" onclick="boxes('clase1',this);"> Clase 1
  31. <input type="checkbox" name="box"
  32. checked="checked" onclick="boxes('clase2',this);"> Clase 2
  33. <input type="checkbox" name="box"
  34. checked="checked" onclick="boxes('clase3',this);"> Clase 3
  35. <input type="checkbox" name="box"
  36. checked="checked" onclick="boxes('clase4',this);"> Clase 4
  37. <input type="checkbox" name="box"
  38. checked="checked" onclick="boxes('clase5',this);"> Clase 5
  39. <input type="checkbox" name="box"
  40. checked="checked" onclick="boxes('clase6',this);"> Clase 6
  41. <input type="checkbox" name="box"
  42. checked="checked" onclick="boxes('clase7',this);"> Clase 7
  43. </form>
  44. <div id="lista">
  45. <ul>
  46. <li class="clase1 clase2">clase1 clase2</li>
  47. <li class="clase1 clase3 clase4">clase1 clase3 clase4</li>
  48. <li class="clase3 clase4">clase3 clase4</li>
  49. <li class="clase1 clase3">clase1 clase3</li>
  50. <li class="clase2 clase4 clase5">clase2 clase4 clase5</li>
  51. <li class="clase3 clase6">clase3 clase6</li>
  52. <li class="clase7">clase7</li>
  53. </ul>
  54. </div>
  55. </body>
  56. </html>

Vamos a desglosarla un poco
la función en los cbox se invoca asi
onclick="boxes('clase1',this);"
pasando como parámertros la clase a buscar en el class y la palabra reservada this, que representa al propio elemento (el checkbox que se clickea en este caso)


Código:
function boxes(laClase,t){
var cb = document.getElementsByName('box');
var lista = document.getElementsByClassName(laClase);
con eso creas dos arrays, uno contiene todos los cbox de nombre "box" y otro que tiene todos los li con la clase pasada (recordá que getElementsByClassName() no funciona en IE<9, más arriba en otro post dejé una función equivalente para IE8)

Código:
	for (e=0; e < cb.length; e++) {
		if(t.checked == false){
ahi recorrés todos los cbox y si el clickeado (recordá this y el argumento t) está en false (como todos vienen marcados por defecto, con el primer click ya pasa a false

Código:
			for (var i=0; i<lista.length; i++) {
			//console.log(lista[i].className); // descomentar para verificar
			lista[i].style.display = 'none';
			}
recorres todos los elementos de lista, y le cambias el style.display, date cuenta que a cada click la variable lista se regenera y contiene solo los elementos que tengan la clase definida en el primer argumento de la función, luego, obviamente, haces a la inversa

Demo:
http://foros.emprear.com/javascript/...por_class.html


Ahora, a estudiar, http://librosweb.es es un buen inicio

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.