2012-05-22 1 views
5

Я попытался получить значение rel на каждом li и передать его функции .getJSON. Затем я хочу добавить значение thumbnail_url из обратного вызова в тег изображения потомков li. Мой вопрос в том, как передать объект $ (this) функции обратного вызова. Кажется, что $ (this) null.

$('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: Неожиданный идентификатор (unexpected_token_identifier) ​​ – Musa

+1

Javascript CLOSURES удар снова! –

+0

Помимо оригинальной проблемы, у вас также есть другая проблема: она должна быть 'var url = 'http: // sampleurl/api/url?' + $ (This) .attr ('rel');' – Steve

ответ

8

Просто назначьте его вне обратного вызова (как я устанавливаю self), а затем использовать внутри обратного вызова (со ссылкой на переменную вы установили):

$('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; 
    }); 

}); 

Причина этого в том, что this отличается обратным вызовом для .each(), чем в обратном вызове для $.getJSON().

+0

Просто хочу указать что вы скопировали ошибку в коде OPs. Это должно быть 'var url = 'http: // sampleurl/api/url?' + $ (This) .attr ('rel');' – Steve

+0

@Steve: Вы правы, я действительно скопировал код OP, установив, что не работал для него. – Tadeck

+0

Отлично! Это идеально. – seanbun

7

Если вы используете $.ajax вместо $.getJSON, вы могли бы использовать 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

Блестящий. Рад узнать эту хорошую альтернативу. – seanbun

+1

Любое другое существенное различие между этими функциями $ .ajax() и # .getJSON()? – seanbun

+1

Ну, '$ .ajax' является более подробным, как вы можете видеть. В этом примере я передал параметры, необходимые для того, чтобы он вел себя точно так же, как 'getJSON', но [есть много других доступных опций] (http://api.jquery.com/jQuery.ajax/). '$ .get',' $ .post' и '$ .getJSON' в основном являются обертками' $ .ajax'. – bfavaretto

Смежные вопросы