マーカーのセットが付いたマップがあります。すべてのマーカーにはリスナーが割り当てられています(クリック)。クリックイベントsetImage
は自己のメソッドをトリガーし、同じ画像(別のマーカーに割り当てられている)がマップ上に存在するかどうかも確認する必要があります。存在する場合は、他のマーカー画像を別の画像に置き換える必要があります。
問題:setImage
メソッドが実行された後、現在クリックされている画像に、すでにクリックされているすべてのマーカーが読み込まれます(マーカーは配列として保存されます)。リスナーコード内に同期呼び出しがあります。コードには、いくつかのRoRラッパーが含まれています。
function initialize() {
var myLatlng = new google.maps.LatLng(15.000, 0);
var myOptions = {
scrollwheel: false,
center: myLatlng,
zoom: 2,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
var locations = <%= array_or_string_for_javascript(@locations) %>;
var art_img = new google.maps.MarkerImage('<%= image_path(@artist.img_name + "_small.png") %>',
new google.maps.Size(70, 61),
new google.maps.Point(0,0),
new google.maps.Point(0, 61));
var shadow = new google.maps.MarkerImage('<%= image_path("flag_shadow.png") %>',
new google.maps.Size(75, 75),
new google.maps.Point(0,0),
new google.maps.Point(-7, 72));
var markers = [];
var markers_tmp = [];
<% @locations.each do |location| %>
var location = <%= location %>;
var image_url = location['result'];
if (image_url == "") {
image_url = '<%= image_path("flag_unselect.png") %>';
}
var image = new google.maps.MarkerImage(image_url,
new google.maps.Size(70, 61),
new google.maps.Point(0,0),
new google.maps.Point(0, 61));
var unsel_image = new google.maps.MarkerImage('<%= image_path("flag_unselect.png") %>',
new google.maps.Size(70, 61),
new google.maps.Point(0,0),
new google.maps.Point(0, 61));
var art_img = new google.maps.MarkerImage('<%= image_path(@artist.img_name + "_small.png") %>',
new google.maps.Size(70, 61),
new google.maps.Point(0,0),
new google.maps.Point(0, 61));
var myLatLng = new google.maps.LatLng(location['posx'], location['posy']);
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
shadow: shadow,
icon: image,
zIndex: location['loc_id']
});
markers.push(marker);
google.maps.event.addListener(marker, 'click', function() {
$.__customStorage = {};
$.ajax({
url: "/main/get_current_artist",
dataType: 'json',
async: false,
success: function(data) {
$.__customStorage.ajaxResponse = data;
}
})
var current_artist = '/assets/' + $.__customStorage.ajaxResponse + '_small.png';
art_img.url = '/assets/' + $.__customStorage.ajaxResponse + '_small.png';
for (var i = 0; i < markers.length; i++) {
if (markers[i] == this) {
markers[i].setIcon(art_img);
}
}
});
<% end %>
}
google.maps.event.addDomListener(window, 'load', initialize);