2017-11-30 9 views
0

私は都市の天気詳細を取得するために次のコードを持っています。 私はページをロードするとき、URL getメソッドで特定の都市の正確な天気の詳細を提供しています。しかし、各結果の都市名は印刷できません。私の例では、常に「シドニー」と書かれていますJQueryで配列要素を印刷するには?

結果を使って各都市名を印刷するにはどうすればよいですか?

コード:

x = window.location.search.substr(6); 
 
y = x.split("%2C"); 
 

 
$(document).ready(function() { 
 
    $('#b1').click(function() { 
 

 
    for (i = 0; i < y.length; i++) { 
 

 
     city = y[i]; 
 

 
     $.ajax({ 
 
     url: 'http://api.openweathermap.org/data/2.5/weather?q=' + city + 
 
      "&units=metric" + 
 
      "&appid=ace585585ed8eb42338b8e663fe0170e", 
 
     type: 'get', 
 
     dataType: 'jsonp', 
 
     success: function(data) { 
 
      var w = showd(data); 
 
      var para2 = $("<p></p>").text(city); 
 
      var para = $("<p></p>").text(w); 
 
      $("body").append(para2, para); 
 
     } 
 
     }); 
 

 
     function showd(data) { 
 
     return data.weather[0].description; 
 

 
     } 
 
    } 
 
    }); 
 
}); 
 

 
$(document).ready(function() { 
 
    document.getElementById("b1").click(); 
 
});
<Script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></Script> 
 

 
<button style="visibility:hidden;" id="b1">Click</button><br><br> 
 
<p id="data"></p> 
 
<p id="p2"></p>

URL:

file:///C:/wamp/www/aTravelz/checkweather.html?wthr=Moscow%2CLondon%2CColombo%2CSydney 

結果:

Sydney 

overcast clouds 

Sydney 

light intensity shower rain 

Sydney 

few clouds 

Sydney 

broken clouds 
+0

読んでいくつかの時間を費やす[どのようにJavaScriptのクロージャは動作しますか?](https://stackoverflow.com/questions/111102/how-do-javascript-closures-work?rq=1) –

答えて

1

あなたのコードが使用している都市の最後の値(for-loopが完了した後)AJAX応答が同じになるので、使用されます。あなたがに必要

は、各AJAX要求のためのcityの値をロック

(function(city){ $.ajax({ 
      //rest of the ajax code stays as is 
}))(city); 

として、またはデモに示すよう@xanderが(コメントに言ったようにあなたがlet代わりのvarを使用することができますウェル)

デモ

var arr = [ 1,2,3 ]; 
 
for(var counter = 0; counter < arr.length; counter++) 
 
{ 
 
    let c = arr[ counter ]; 
 
    setTimeout(function(){ 
 
     console.log(c) 
 
    }, 100); 
 
}

+0

市区町村変数がfor-blockにスコープされている場合にも有効です。 ES6を使うときは 'let city = y [i]'としてください。 – xander

+0

@xander AJAX呼び出しはまだfor-loopの中にあるので、 'city'へのアクセス権を持っています。 – gurvinder372

+0

はい、成功閉鎖は、 'var'ではなく' let'で定義されたときに、すべてのajax-requestと異なる 'city'変数を取得するので、間違っていないとうまくいくはずです。 – xander

関連する問題