2012-02-02 95 views
1

變量的知名度在此代碼:jQuery的內部封閉

$.each(divList, function(){ 
    var dropdown = ''; 
    $.get("ajax.php",{'some':'params', 'other':'params'},function(msg){ 
     dropdown = msg; 
     console.log(dropdown); 
    }); 
    console.log(dropdown); 
    $(dropdown).appendTo($(this)); 
}); 

...第一日誌顯示下拉變量保存正確的文本從阿賈克斯返回,第二個是空的(和appendTo什麼都不做)。

有沒有辦法讓這個作品?使用的瀏覽器是否存在一些依賴性?

回答

2

$.get()異步:它返回非常快,在後臺執行它的工作,並通過調用您提供的回調函數表示完成。

因爲你的第二個呼叫console.log()和您的來電appendTo()是回調外,他們將過快運行,之前$.get()完成並dropdown設置。

通常的模式是把呼叫appendTo()回調函數中:

$.each(divList, function() { 
    $.ajax({ 
     url: "ajax.php", 
     data: { 
      // your parameters... 
     }, 
     context: this, 
     success: function(msg) { 
      console.log(msg); 
      $(msg).appendTo(this); 
     } 
    }); 
}); 

編輯:如果您要訪問您的回調函數原來this參考,你可以通過它在context選項$.ajax(),如上面的代碼所做的那樣。

+0

Do'h。 在$ .get()方法中訪問$(this)(divList中的元素)的任何方法?是否有可能將它保存在一個變量或其他? – St0rM 2012-02-02 18:55:58

+0

是的,只是試過。只需將它保存爲var whatever = $(this)並在關閉中使用它。 謝謝。 – St0rM 2012-02-02 18:57:44

+1

您正在向服務器發送'context:'。這對回調上下文沒有幫助。 – 2012-02-02 19:01:09

1

分配this$get到一個新的變量,你可以在你的成功處理程序

2

的功能,所以其通過異步Ajax調用訪問的頂部Assing this一個變量訪問outher範圍:

$.each(divList, function(){ 
    var me = this; 
    $.get("ajax.php",{'some':'params', 'other':'params'},function(msg){ 
     var dropdown = msg; 
     console.log(dropdown); 
     $(dropdown).appendTo($(me)); 
    }); 
}) 
+0

似乎這不起作用 在同一個上下文中有多個$ .get只會使最後一個appendTo工作。 – St0rM 2012-02-02 20:30:09