2010-09-08 11 views
6

tengo que obligar a la función de clic en cada div de esta lista ordenada con el fin de hacer que ocultar/novato mostrar una imagen en cada div imgXX, estoy con jQueryBinding función de clic en cada div jQuery

<ol id='selectable'> 
<li class="ui-state-default"> 
    <div id="img01" class="img"> 
     <div id="star01" class="star"> 
      <img src="../ima/star.png" height="30px"/> 
     </div> 
    </div> 
</li> 
<li class="ui-state-default"> 
    <div id="img02" class="img"> 
     <div id="star02" class="star"> 
      <img src="../ima/star.png" height="30px"/> 
     </div> 
    </div> 
</li> 
</ol> 

jQuery

$('div').each(function(){ 
    $(this).click(function(){ 
      if($(this).find('img').is(':visible').length){ 
        $(this).find('img').fadeOut(700); 
      } 
      else{ 
        $(this).find('img').fadeIn(700); 
       } 
    }); 
}); 
+1

¿Qué le está causando dolor? Umm ... ($ (esto) .find ('img'). Es (': visible'). La longitud no es correcta, creo. Is() te da un verdadero falso. Aplicarle longitud puede ser extraño. –

+0

@Sidhart Tiene razón, debería ser 'find ('img: visible')' – alex

+0

Tenga en cuenta que está vinculando el evento click en los elementos div anidados, por lo que podrían disparar dos veces. Puede usar '$ (' div.img ') 'o' $ (' div.star ') 'para seleccionar un conjunto de elementos div. Además,' .each (function() {$ (this) .click (...);}) 'puede acortarse a simplemente' .click (...) 'mientras aplica el evento a todos los elementos de la colección. – Guffa

Respuesta

5

El método is devuelve un valor booleano. Uso:

if($(this).find('img').is(':visible')) 

o:

if($(this).find('img:visible').length) 
+0

Excelente, ahorre mi tiempo –

8

Prueba esto:

$('div').each(function(){ 
    $(this).click(function(){ 
      if($(this).find('img').is(':visible')){ 
        $(this).find('img').fadeOut(700); 
      } 
      else{ 
        $(this).find('img').fadeIn(700); 
       } 
    }); 
}); 
1

A diferencia de la otros métodos de filtrado y transversal, .is() no crea un nuevo objeto jQuery. En cambio, nos permite probar el contenido de un objeto jQuery sin modificaciones.

Por lo tanto, no se puede utilizar extensamente sobre él, ya que devuelve un valor booleano. Eliminar 'longitud' y debería funcionar.

0

no creo que necesariamente se necesita el cada uno.

$('div').click(function(){ 

    var img = $(this).find('img'); 

    if($(img).is(':visible')){ 
    $(img).fadeOut(700); 
    } 

}); 
+0

¿funciona? – kubudi

0

No estoy seguro sobre el anidamiento de los divs, pero ya que está solicitando a la única desvanecerse img Estoy asumiendo que el .star div es visible y puede hacer clic. La función siguiente es un poco más eficiente ya que estoy usando children en lugar de find que es recursivo. Aparte de los selectores, esto debería funcionar para usted.

$('div.star').click(function() { 
    function() { 
     $(this).children('img').fadeOut(700); 
    }, 
    function() { 
     $(this).children('img').fadeIn(700); 
    } 
}); 
Cuestiones relacionadas