Foros del Web » Programando para Internet » Jquery »

Problema con funcion each() de jQuery

Estas en el tema de Problema con funcion each() de jQuery en el foro de Jquery en Foros del Web. Saludos, estoy teniendo problemas para implementar (y entender) esta funcion para una cosilla que quiero hacer. Tengo una serie de enlaces que se generan dinamicamente ...
  #1 (permalink)  
Antiguo 04/09/2009, 01:10
 
Fecha de Ingreso: junio-2008
Mensajes: 175
Antigüedad: 16 años, 5 meses
Puntos: 11
Problema con funcion each() de jQuery

Saludos, estoy teniendo problemas para implementar (y entender) esta funcion para una cosilla que quiero hacer.
Tengo una serie de enlaces que se generan dinamicamente a partir de unos datos contenidos en una base de datos del tipo:
enlace0, enlace1, etc. y los identifico mediante la clase .textlink0, .textlink1, etc.

Lo que quiero es poder distinguir entre cada uno de los enlaces cuando se hace click y mostrar u ocultar informacion cuando se haga click en cada enlace. Aqui viene el codigo que he pensado pero que por lo que veo no funciona aunque segun parece, o hago mal algo, o no entiendo del todo bien la funcion .each()

Código PHP:
$(document).ready(function(){
$(
'#vids').each(function(i){
        $(
'.textlink' i).css('cursor''pointer');
        
// Para cada enlace con id=i cuando se haga click, lo muestro o lo oculto
        
$('.textlink' i).click(function(){
            $(
'.textooculto' i).hide();
        });
    });
}); 
Nota: la clase .textlink y .textooculto estan contenidas dentro de la capa #vids.

Saludos!
  #2 (permalink)  
Antiguo 04/09/2009, 07:51
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 19 años, 3 meses
Puntos: 55
Respuesta: Problema con funcion each() de jQuery

bueno hay q hacer una pequeña correccion para q soporte el formato textolink0, textolink1, ...

Código javascript:
Ver original
  1. $(document).ready(function(){
  2. var i=0;
  3. $('#vids').each(function(){
  4.         $('.textlink' + i).css('cursor', 'pointer');
  5.         // Para cada enlace con id=i cuando se haga click, lo muestro o lo oculto
  6.         $('.textlink' + i).click(function(){
  7.             $('.textooculto' + i).hide();
  8.         });
  9. i++;
  10.     });
  11. });
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 04/09/2009, 08:58
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 9 meses
Puntos: 101
Respuesta: Problema con funcion each() de jQuery

A ver si esto aclara:

botones = $('#vids a'); // todos los botones

var i=0;
botones.each(function(boton){

boton.click(function(){
$('this').toggle();
return false;
});
i++;
}); // fin de each


Usar clases con nombre diferente puede confundir:
.textlink0, .textlink1

En el caso de querer usar identificadores diferentes, usa "id" en vez de "class".

De cualquier manera, lo que los hace unicos es el atributo "href" que les definas.

nota: lo que le falta a este ejemplo es el tema de ocultar la informacion anterior, cada vez que pulses un nuevo link.

Otra cosa: si en realidad no vas a usar enlaces, el evento click debería devolver:
return false;
  #4 (permalink)  
Antiguo 07/09/2009, 09:15
 
Fecha de Ingreso: junio-2008
Mensajes: 175
Antigüedad: 16 años, 5 meses
Puntos: 11
Respuesta: Problema con funcion each() de jQuery

Hola, gracias por vuestras respuestas. He conseguido solucionarlo pero no acabo de entender el codigo que has puesto. La primera duda que tengo es con la linea:

botones = $('#vids a');

ya que no entiendo como haces para distinguir entre cada enlace sin declarar ningun tipo de selector especifico, ¿lo hace jquery de manera automatica? por otro lado aqui esta el codigo con el que he conseguido lo que queria aunque no se por que no funciona sin el "return false" (otra de mis dudas):

Código PHP:
    botones = $('#vids a'); // todos los botones
    
var i=0;
    
botones.each(function(i){
        
i++;
        
//botones.click(function(){
        
$('.texto' +i).click(function(){
            $(
'.textooculto' +i).toggle();
            return 
false;
        });
    }); 
// fin de each 
Código PHP:
<div id="vids">
        <
a href="#" class="texto1">Click</a>
        <
br />
        <
div class="textooculto1">Primer Texto Oculto</div>
    </
div>
    
    <
p>&nbsp;</p>
    
    <
div id="vids">
        <
a href="#" class="texto2">Click</a>
        <
br />
        <
div class="textooculto2">Segundo Texto Oculto</div>
    </
div
He tenido que hacer una chapucilla ya que mis IDs empiezan por 1 por lo que primero he inicializado la variable a 0 y luego la he incrementado mediante i++
  #5 (permalink)  
Antiguo 07/09/2009, 11:19
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 9 meses
Puntos: 101
Respuesta: Problema con funcion each() de jQuery

Primero definis un conjunto (en este caso, de botones):

botones = $('#vids a');

Asi estas diciendo que queres reunir a todos los enlaces ("a") que estan contenidos en el div llamado "vids".

Y una vez que tenes el conjunto, lo recorrer, diciendo "each" ("a cada uno" literalmente).

No necesitas tener un nombre unico para cada link, sino que los seleccionas por tipo de elemento. Y aqui es donde creo que no estas bien afianzado. En la identificacion.

Vuelvo a decirte que "class" (es decir, "clase") se utiliza mas que nada para grupos. Y que para hacer identificadores unicos ("textooculto1", "textooculto2", etc) lo mas claro es usar "id".

Te acrodas que en javascript podias seleccionar por id y por classname? En el primer caso, obtendrias un solo elemento. En el segundo, podrías tener varios.

Siguiendo: una vez que tenes el conjunto de botones, los recorres:

botones.each( function(boton) { alert(boton); } )

Aqui vas a tener un alert por cada elemento. Probalo. Estas recorriendo "cada boton" del conjunto "botones".

Finalmente, con "return false" estas diciendo que das prioridad al evento "click" por sobre el enlace definido en "href". Si no pusieras false, se ejecutaria mas bien un enlace que el "mostrar / ocultar".
  #6 (permalink)  
Antiguo 07/09/2009, 11:25
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 9 meses
Puntos: 101
Respuesta: Problema con funcion each() de jQuery

OJO! Te vuelvo a decir lo mismo: el atributo id ha de ser UNICO en toda la pagina. Y aqui estas repitiendo "vids" en dos divs diferentes. Cuando tendrías que estar usando "class" para poder repetir un nombre.

Cita:
<div id="vids">
<a href="#" class="texto1">Click</a>
<br />
<div class="textooculto1">Primer Texto Oculto</div>
</div>

<p>&nbsp;</p>

<div id="vids">
<a href="#" class="texto2">Click</a>
<br />
<div class="textooculto2">Segundo Texto Oculto</div>
</div>
Otra cosa en donde te vendría bien ahondar es en la jerarquia. Si tu codigo es realmente el que publicastes, no necesitas identificadores unicos para los divs ocultos. Sencillamente pensas en terminos de "parent", "children" y "sibling" (padre, hijo, hermano), y usas un un codigo jquery para seleccionar el div "hermano" de tu link. Esto es "div" hermano de "a", o sea "contenidos en un mismo " vids ".
nota: el padre seria ese "vids". Y los hijos del padre, logicamente, son "a" y "div".

Pero no te marees todavia. Segui usando identificadores, y luego si los selectores de jerarquia, cuando tengas mas cancha.
  #7 (permalink)  
Antiguo 07/09/2009, 11:35
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 9 meses
Puntos: 101
Respuesta: Problema con funcion each() de jQuery

Un enlace que es de gran utilidad para estudiar selectores y jerarquia es el manual de jquery:
http://docs.jquery.com/Selectors

Ahi se entiende que para la siguiente linea:
botones = $('#vids a');
lo que estamos diciendo es "cualquier vinculo ('a') dentro de la etiqueta con id ('#') 'vids' ".

Es decir, cualquier vinculo dentro de "vids".

Eso es una jerarquia: uno dentro de otro: padre-hijo.

Tambien estan las jerarquias de hermanos, como te decia.
  #8 (permalink)  
Antiguo 07/09/2009, 12:12
 
Fecha de Ingreso: junio-2008
Mensajes: 175
Antigüedad: 16 años, 5 meses
Puntos: 11
Respuesta: Problema con funcion each() de jQuery

Vaya, excelentemente documentado!! Creo que ahora me ha quedado mucho mas claro. La verdad es que como dices tendria que cambiar el id por class (crearme una clase ".vids" en lugar de usarlo como identificador) de todos modos aun tengo que depurar un poco el codigo una vez acabe de entender del todo como funciona jQuery.

Todavia me tengo que estudiar la jerarquia del DOM y todos los tipos de selectores que existen en jQuery pero creo que poco a poco lo conseguire!

De nuevo te doy las gracias y a ver si me entra de una vez!! (que yo y el JS no nos llevamos muy bien :P)
  #9 (permalink)  
Antiguo 08/12/2009, 05:30
 
Fecha de Ingreso: diciembre-2009
Mensajes: 4
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con funcion each() de jQuery

Hola, tengo una duda relacionada con esta. Yo tengo más o menos la misma situación que nuestro compañero, realizo la misma función para recorrer los enlaces de mi div, el problema es que no soy capaz de que los enlaces hagan nada (ni siquiera veo el alert). Creo que el problema pude venir de que mi div lo creo devolviendo datos mediante el load (Ajax) de jquery, el cual realiza una llamada a un php que hace unas consultas a mi base de datos y devuelve lo que quiero. La información la devuelve bien en mi div, incluso con el firedeug veo que se ha montado el DOM correctamente y ahi están mis div creados y "a" correctamente, pero cuando accedo a ellos no funcionan. He probado ha acceder de muchas formas y nada. ¿Hay algún problema entre las sentencias lquery y datos devueltos de esta forma?. Me como la cabeza y nada. No pongo el código por si es un problema facilón de filosofía de trabajo (que es a lo que me suena), pero si hace falta lo pongo. Gracias.
  #10 (permalink)  
Antiguo 08/12/2009, 07:34
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 9 meses
Puntos: 101
Respuesta: Problema con funcion each() de jQuery

El problema con load es que carga la data pero no deja procesarla inmediatamente. Necesitas una funcion callback. Y creo que load la trae, pero la cosa no queda ahi. Necesitas una funcion que se ejecute, en lo posible, asincronicamente.

El tema es que tu script se lee linealmente. Load empieza a cargar la data pero ya da paso al proximo renglon, que pretende modificar lo que aun no esta incorporado en el DOM. Por esto es importante usar las llamadas a tus modificadores "div" y "a" recien cuando termine de ejecutarse load o alguna otra funcion de ajax.

Aca esta todo:
http://www.cristalab.com/tutoriales/...-jquery-c226l/

Por otro lado, una funcion each, hoy por hoy, me resulta asi de simple:

Cita:
jQuery.each(listado, function(){
alert($(this));
});
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 23:02.