2012-05-22 16 views
5

Intenté obtener el valor de rel en cada li y pasarlo a la función .getJSON. Luego quiero agregar el valor thumbnail_url de la devolución de llamada a la etiqueta de imagen de los descendientes li. Mi pregunta es cómo podría pasar el objeto $ (this) a la función de devolución de llamada. Parece que el $ (esto) es nulo.

$('ul.sample li').each(function() { 

     var url = 'http://sampleurl/api/url?' + $(this).attr('rel'); 

     $.getJSON(url, function (data){ 
      $(this).find('img').attr('src') = data.thumbnail_url; 
    }) 
}); 

HTML:

<ul class="sample"> 
    <li rel="value1"> 
     <img src=""> 
    </li> 
    <li rel="value2"> 
     <img src=""> 
    </li> 
</ul> 
+0

SyntaxError: identificador inesperado (unexpected_token_identifier) ​​ – Musa

+1

Javascript cierres huelga otra vez! –

+0

Además del problema original, también tiene otro problema: debe ser 'var url = 'http: // sampleurl/api/url?' + $ (This) .attr ('rel');' – Steve

Respuesta

8

Basta con asignar fuera de la devolución de llamada (como yo soy la creación self) y luego su uso dentro de devolución de llamada (haciendo referencia a la variable que ha configurado):

$('ul.sample li').each(function() { 

    var self = $(this); // using self to store $(this) 
    var url = 'http://sampleurl/api/url?' + self.attr('rel'); 

    $.getJSON(url, function (data) { 
     // now retrieving self - it is accessible from the callback 
     self.find('img').attr('src') = data.thumbnail_url; 
    }); 

}); 

La razón de esto es porque this es diferente en la devolución de llamada para .each() que en la devolución de llamada para $.getJSON().

+0

Solo quiero apuntar que copió un error en el código OPs. Debería ser 'var url = 'http: // sampleurl/api/url?' + $ (This) .attr ('rel');' – Steve

+0

@Steve: Tiene razón, de hecho he copiado el código de OP al arreglar lo no funcionó para el. – Tadeck

+0

¡Genial! es perfecto. – seanbun

7

Si utiliza $.ajax en lugar de $.getJSON, se puede utilizar la opción context:

$('ul.sample li').each(function() { 
    var url = 'http://sampleurl/api/url?' + $(this).attr('rel'); 
    $.ajax({ 
     url : url, 
     dataType : 'json', 
     context : this, 
     complete : function (data) { 
      // 'this' will be what you passed as context 
      $(this).find('img').attr('src') = data.thumbnail_url; 
     } 
    }); 
}); 
+0

Brillante. Me alegra saber esta buena alternativa. – seanbun

+1

¿Alguna otra diferencia importante entre estas funciones $ .ajax() y # .getJSON()? – seanbun

+1

Bueno, '$ .ajax' es más detallado, como puedes ver. En este ejemplo, pasé las opciones necesarias para que se comporte exactamente como 'getJSON', pero [hay muchas otras opciones disponibles] (http://api.jquery.com/jQuery.ajax/). '$ .get',' $ .post' y '$ .getJSON' son básicamente envoltorios para' $ .ajax'. – bfavaretto

Cuestiones relacionadas