JQuery AJAX Контекст успеха - PullRequest
2 голосов
/ 08 апреля 2011

моя функция AJAX работает не совсем так, как я ожидаю.

Похоже, что "this" в успешном обратном вызове AJAX не относится к тому же "this", что и в рамках функции showSnapshotComment.

Я пытался использовать контекст, он все еще не работает. Мое использование, вероятно, неверно. Я, наверное, обдумываю это.

    function showSnapshotComments(snapshot) {
    var self = $j(this);
    alert($j(this).attr('class'));
    $j.ajax({
    cache: false,
    context: this,
    url: 'show_snapshot_comments/' + snapshot.id,
        async: true,
    dataType: 'script',
    success: function() {
    $j('#snapshots a.photo').each(function(i) {
        $j(this).qtip({
        content: $j(this).nextAll('.info').eq(i),
        position: {
          target: 'mouse',
          adjust: { mouse: true },
                viewport: $j(window)
          },
        hide: {
            event: 'click mouseleave',
            delay: 300
        },
        show: {
            solo: true,
            event: 'click mouseenter'
        },
        style: {
            tip: true,
            classes: "ui-tooltip-light"
        }
    });
});

    }
  }); 
}

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

this внутри обратного вызова AJAX действительно ссылается на тот же this, что и showSnaphotComments полученные вами ответы верны, но самый простой ответ объясняет, что реальная проблема заключается в функции $j().each внутри обратного вызова успеха- он изменит контекст при переборе элементов DOM ... но this внутри успеха AJAX верен, попробуйте следующее:

function showSnapshotComments(snapshot) {
  var self = $j(this);
  alert($j(this).attr('class'));
  $j.ajax({
    cache: false,
    context: this,
    url: 'show_snapshot_comments/' + snapshot.id,
    async: true,
    dataType: 'script',
    success: function() {
      var self = this; // same this as in showSnapshotComments
      $j('#snapshots a.photo').each(function(i) {
        $j(self).qtip({ // this changed to self
          content: $j(self).nextAll('.info').eq(i), // same here
          position: {
            target: 'mouse',
            adjust: { mouse: true },
            viewport: $j(window)
          },
          hide: {
            event: 'click mouseleave',
            delay: 300
          },
          show: {
            solo: true,
            event: 'click mouseenter'
          },
          style: {
            tip: true,
            classes: "ui-tooltip-light"
          }
        });
      });
}
1 голос
/ 08 апреля 2011

Измените вашу ссылку на себя, чтобы она была элементом DOM вместо объекта jquery (self = this), а в функции обратного вызова success измените ваши this ссылки на self.

Чтобы понять, зачем вам это нужно, вы должны прочитать о замыканиях и объеме замыканий:

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

0 голосов
/ 08 апреля 2011

Проблема с определением области действия этой переменной. Вместо этого попробуйте код ниже:

var self = $j(this);     
var that = this;
alert($j(this).attr('class'));     
$j.ajax({     
  cache: false,     
  context: that, 
  .
  .
  .
  .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...