2017-04-22 26 views
0

我正在做一個ajax調用返回成功的API,但是有一個輕微的問題,被設置爲undefined的變量,我不明白爲什麼。我選擇一個<i>元素並將其存儲在變量中以將其顯示爲加載欄,然後我嘗試在成功回調中再次隱藏它。如何通過jQuery將定義的變量設置爲未定義的ajax調用?

該元素已成功存儲並用於在ajax調用之前顯示加載欄,但它給出了一個錯誤,說明它在成功回調中未定義。我很困惑可能會導致問題的原因。在線找不到任何其他解決方案。請參閱下面的代碼。

奇怪的是我有一個<ul>元素在<i>元素之後聲明,它永遠不會被設置爲undefined。

$("li.country").on("click", function(){ 
    var i = $(this).find("i"); //this is where the element is stored 
    var cc = $(this).attr("data-city") + $(this).attr("data-country-code"); 
    var ul_week = $("#week"); 
    i.toggleClass("no_show"); //works fine here, shows the element 
    $.ajax({ 
     url:  forecast_base_url + cc + units + APPID, 
     success: function(result){ 
     i.toggleClass("no_show"); //gives an error here 
     $("#cc_city").html("This forecast for " + result.city.name + "."); 
     ul_week.html(""); 
     for (var i = 0; i < result.list.length; i++) { 
      ul_week.append(
      "<li>Hello World"+ i +"</li>" 
     ); 
     } 
     console.log(result); 
     }, 
     error:  function(err){ 
     console.log(err); 
     } 
    }); 
    }); 
+0

這是不相關的,並且原則上,將工作,但是你正在使用變量'i'來做兩件事情:作爲jQuery變量,也作爲一個循環變量。正如我所說,它會起作用,但如果您使用不同的變量名稱,長期來看它會更好。特別是,我發現給jQuery變量比如'$'前綴是很有用的,以便讓代碼的其餘部分清楚它是什麼類型的數據。解決你的問題,我認爲這個問題可能是一個範圍。我想我已經擁有了。在下面檢查我的答案。 – Manngo

+0

Cam在下面正確回答了問題。我將繼續提出關於編碼慣例的建議。 「i」變量也由Ajax函數使用。感謝您的輸入:)。 – Courtney

回答

2

@charlietfl指出,該問題是由可變提升你的Ajax回調,而不是在jQuery的覆蓋i問題中引起的。

JavaScript沒有塊範圍(除了ES6 let),所以for循環中的var聲明被提升到頂部,像這樣:

$.ajax({ 
    url:  forecast_base_url + cc + units + APPID, 
    success: function(result){ 
    var i = undefined; // variable i is hoisted up 
    i.toggleClass("no_show"); //gives an error here 
    $("#cc_city").html("This forecast for " + result.city.name + "."); 
    ul_week.html(""); 
    for (i = 0; i < result.list.length; i++) { 
     ul_week.append(
     "<li>Hello World"+ i +"</li>" 
    ); 
    } 
    console.log(result); 
    }, 
+1

顯示的閉包中的'i'(每個回調)沒有相關性。 OP的問題與提起 – charlietfl

+0

感謝您的更正,@charlietfl。 – Cam

+0

更新更合適...我建議你刪除其餘部分,因爲它是誤導性的 – charlietfl