我可以将$(this)传递给.getJSON回调函数吗?任何解决方法?

sea*_*bun 5 javascript jquery

我试图在每个li上获取rel的值并将其传递给.getJSON函数.然后我想将回调中的thumbnail_url值添加到li后代的image标签中.我的问题是如何将$(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;
    })
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<ul class="sample">
   <li rel="value1">
       <img src="">
   </li>
   <li rel="value2">
       <img src="">
   </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

Tad*_*eck 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;
    });

});
Run Code Online (Sandbox Code Playgroud)

原因是因为this回调.each()中的回调不同于回调中的回调$.getJSON().

  • @GlennFerrieLive那是什么惯例?虽然我也使用`那个',但我已经看到了野外使用的两个变量.jQuery本身在整个地方使用`self`. (3认同)
  • @GlennFerrieLive,尊重,Crockford并不总是对的.在实践中,你会看到`self`和`that`一样多用来坚持`this`.我更喜欢"自我",因为它比"那个"更具有语法意义,因此不那么容易混淆和更具可读性. (3认同)

bfa*_*tto 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;
        }
    });
});
Run Code Online (Sandbox Code Playgroud)