2012-03-20 100 views
0

我知道這可能是一個愚蠢的問題,我知道JS範圍的問題是非常常見的,但是,您是否可以善意地幫助我完成這個任務。Ajax函數內的Javascript變量範圍

這裏是我的功能:

function checkOpen(storeData) { 
if (storeData.menu === 'true') { 

    var offerImgPath = '/wcsstore/ConsumerDirectStorefrontAssetStore/images/colors/color'+ Brand.styleColour + '/v3/', 
     offer1, 
     offer2; 

    cafeTabContent = '<p>Cafe/Restaurant facilities are available in this store.</p>'; 
    cafeTabContent += '<p class="menu_link"><a href="/store_menus/menu.pdf" target="_blank">Click here to download a menu</a></p>'; 

    if (Brand.storeLocatorSettings.cafeOffersOn === true) { 

     $.ajax({ 
      url : Arcadia.Brand.storeLocatorSettings.offersPageURL, 
      success : function(data) { 
       var offerContainer = $(data).find('#basic_story_content'); 
       offer1 = offerContainer.children(':first-child').attr('src'); 
       offer2 = offerContainer.children(':last-child').attr('src'); 
      } 
     }); 

     console.log(offer1); 

     cafeTabContent += '<p>Current offers:</p>'; 
     cafeTabContent += '<p class="offer_graphic"><img src="' + offer1+ '" alt="Offer 1" /></p>'; 
     cafeTabContent += '<p class="offer_graphic"><img src="' + offer2+ '" alt="Offer 2" /></p>'; 
    } 

    return cafeTabContent; 
} else { 
    return false; 
} 
}; 

是我遇到的問題是,儘管offer1 &供應2被阿賈克斯成功函數外部定義的事實,在這個函數中應用的值不被保留外因此console.log(offer1)返回undefined而不是圖像路徑。我知道這是一個範圍問題,它真的讓我煩惱。任何幫助將不勝感激。

+1

謝謝你們,我知道這只是我愚蠢的一個例子。看到你們所有人都給了我正確的答案,我會在Ajinkya看到他的第一個信用點。 – 2012-03-21 09:30:13

回答

1

在Ajax中A意味着異步。
因此,在返回實際數據之前執行控制檯語句。這意味着成功返回值後,將分配給offer1和offer2,但您之前已將其打印在控制檯上。
試試這個

$.ajax({ 
      url : Arcadia.Brand.storeLocatorSettings.offersPageURL, 
      success : function(data) { 
       var offerContainer = $(data).find('#basic_story_content'); 
       offer1 = offerContainer.children(':first-child').attr('src'); 
       offer2 = offerContainer.children(':last-child').attr('src'); 
     console.log(offer1); 
     console.log(offer2); 
      } 
     }); 
1

你所面對的是不同的(雖然隱約相關的)問題:AJAX的異步特性。

當您的代碼調用$.ajax()時,該請求將異步執行,並且代碼在請求發送時立即返回。因此offer1offer2仍未定義。

正確的事情就是把任何代碼依賴於AJAX導致到您的success回調函數(或稱回調從調用的函數)。

1

這不是範圍問題。問題在於,當ajax請求完成並且調用回調(設置爲offer1offer2)時,console.log(...)內容已經很長時間了。

試着在回調中放入另一個console.log('ajax complete');,並注意它最後被調用。

您可以通過簡單地將該函數的其餘部分放在回調中來修復它,很可能。