EDITED:問題は関数 'find_callback'にあり、responseArrayという名前のグローバル配列にそれぞれの応答を挿入します。応答はオブジェクトの配列です。JavaScript関数はオブジェクトをグローバル配列変数にプッシュしません
私は、検索配列からOpenLayersのWaze実装にマーカーを追加しようとしています。私は複数の検索を実行し、結果を蓄積したい。私は3つの関数、onInit()
、find_callback()
とaddPoint()
を使用します。 'find_callback'関数を呼び出すと、以前のマーカーが上書きされます。それは
function addPoint(response){
var first_result = response;
var lon = first_result.location.lon;
var lat = first_result.location.lat;
map.setCenter(new OpenLayers.LonLat(lon,lat));
var markersPoint = new OpenLayers.Layer.Markers("Markers");
markersPoint.addMarker(
new OpenLayers.Marker(
new OpenLayers.LonLat(
lon,
lat
),
icon.clone()
)
);
g_waze_map.map.addLayer(markersPoint);
map.addPopup(
new OpenLayers.Popup.FramedCloud(
"point_"+first_result.location.lat,
new OpenLayers.LonLat(lon,lat),
null,
"<div style='font-family:Arial,sans-serif;font-size:0.8em;'>"
+first_result.name+"<div>",
anchor=null,
true,
null
)
);
}
//called when map loads
function onInit(){
map = g_waze_map.map;
size = new OpenLayers.Size(15, 20);
offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
icon = new OpenLayers.Icon('http://www.waze.co.il/images/home.png',size,offset);
// array for the points
responseArray = new Array();
// find callback
find_callback = function(response){
for (var i=0, length = response.length; i<length; i++){
responseArray.push(response[i]);
}
// alert(responseArray[0]); // working, getting an object
}
// alert(responseArray[0]); // not working, getting 'undefined'
//search API example, calls 'find_callback' when search returns
g_waze_map.find('Turin','find_callback');
g_waze_map.find('Rome','find_callback', true);
// adding the points
for (var i=0, length = responseArray.length; i<length; i++){
addPoint(responseArray[i]);
}
};
おかげであるように、コード
/* array of search results (up to 10) sorted by relevancy */
[ {
//bounds that contain the this map feature (set map to this extent for closest zoom)
"bounds":{"bottom":32.0880470275879,
"left":34.7883338928223,
"right":34.7912673950195,
"top":32.0854721069336},
//location of the feature
"location":{"lat":32.08560397003471,"lon":34.78999763465419},
//name of feature
"name":"Street, City"
},
//up to 9 more results
// ...
]
:
g_wzae_map.find('THE LOCATION', 'find_callback');
応答:私は、単一の検索を実行すると!
toループ配列には使用しないでください。代わりにfor(var i = 0、length = response.length; i
Hemlock
こんにちは、それは重要ですか?とにかく私はforループを変更しましたが、関数 'find_callback'の外でresponseArrayを取得することはできません。ループの外側で 'find_callback'の内部でチェックするとうまくいきますが、関数onInit()から取得しようとすると 'undefined'が返されます。 –
@Sophia:配列に設定された追加のプロパティは 'for for'ループに含まれています。これは、[プロトタイプ](http://www.prototypejs.org/api/array)のようなJSライブラリを使用している場合、配列に多くの追加メソッドを追加する場合には問題です。また、[グローバルは悪です](http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=globals+are+bad)代わりに、[closures](http://jibbering.com/faq/notes/closures/)を使用してください(より簡単な説明が必要な場合は、[Morris Johns's](http://blog.morrisjohns.com/javascript_closures_for_dummies.html) )。 – outis