jQuery - почему $ (this) не работает в дочерних областях? - PullRequest
1 голос
/ 17 ноября 2010

Я не могу понять, почему этот скрипт не будет работать, пока я не создам ссылку на $ (this) и назначу ее другой переменной, например $ _this = $ (this);это было единственное решение, которое я получил, но мне было интересно, есть ли лучшее - менее новое.Заметьте, что я хочу иметь возможность использовать его в части $ _this.prepend ("Choose" + res) после получения ответа в функции обратного вызова:

 $('#loadScript').one('click',function(e){
    $loading = $('<span> Loading Files... </span>');
    $(this).after($loading);
    $_this = $(this);

    $.get('eval.php',{loadScriptGetOptions:1}, function(res){
     setTimeout(function(){
      $loading.remove();
      $_this.prepend("<option>Choose</option>"+res);
     },1200)

    })

})

заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

Вы забыли использовать var в в двух местах :

$loading = ...

и

$_this = ...

И мне нравится self против уродливого подчеркиваниятам.

 $('#loadScript').one('click',function(e){

    var $loading = $('<span> Loading Files... </span>');
    $(this).after($loading);

    var $self = $(this);

    $.get('eval.php',{loadScriptGetOptions:1}, function(res){
      setTimeout(function(){
         $loading.remove();
         $self.prepend("<option>Choose</option>"+res);
      }, 1200);

    });

});
1 голос
/ 17 ноября 2010

Ваш $ _this.prepend вызывается в функции setTimeout, где это отличается от внешних функций.Вы могли бы сделать что-то вроде:

function myFunc() {
    // What is $(this) here? 
}

 $('#loadScript').one('click',function(e){
    $loading = $('<span> Loading Files... </span>');
    $(this).after($loading);
    $_this = $(this);

    $.get('eval.php',{loadScriptGetOptions:1}, function(res){
       setTimeout(myFunc, 1200);
    })
})

В противном случае, я думаю, что ваше решение кажется нормальным.

Обратите внимание, что $_this - это переменная замыкания, используемая функцией, которую вы используете в setTimeout, поэтому, если вам нужно сослаться на известный элемент, вы можете и должен избавиться от негокак прокомментировали другие (то есть используйте $('#loadScript') для прямого доступа к элементу).

...