Конфликт прослушивателей кликов с информационным окном

Я пытаюсь создать карту, которая позволит пользователям сообщать о проблемах с маршрутами, щелкнув и заполнив форму в информационном окне (аналогично seeclickfix.com). Я еще не встроил php/SQL, который фактически сохранит информацию, предоставленную пользователем. Проблема: у меня есть кнопка в html моего информационного окна, чтобы пользователи могли отправить информацию и закрыть окно. Однако вместо того, чтобы просто закрыть окно, мой прослушиватель событий для новых маркеров получает щелчки через информационное окно, создавая нежелательный маркер за кнопкой. Google каким-то образом избегает этой проблемы; на верхнем правом выходе 'x' не зарегистрировано ни одного клика. Я попытался создать переменную логического сигнала («infopen»), чтобы моя функция addMarker знала, открыто ли информационное окно, но оно не работает... Есть идеи, почему?

Любые другие предложения относительно кода будут оценены! (Моя задача - создать систему для организации и хранения нескольких информационных окон/маркеров...)

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test Reporter </title>
<script type="text/javascript" src="http://maps.google.com/maps/
api/js?sensor=false"></script>
<script type="text/javascript">

var map;
var marker;
var markers = [];
var infowindow;
var infopen = false;
var edit = true;
var pos = new google.maps.LatLng(44.021, -71.831102);

function initialize() {

 var mapOptions = {
   zoom: 14,
   center: pos,
   mapTypeControl: true,
   panControl: false,
   zoomControl: true,
   mapTypeId: google.maps.MapTypeId.TERRAIN
 };
 map = new google.maps.Map(document.getElementById("map_canvas"),
 mapOptions);
 var table = "<table>" +
            "<tr><td>Problem:</td> <td><input type='text'
id='prob'/> </td> </tr>" +
             "<tr><td>Description:</td> <td><input type='text'
size='30' id='desc'/></td> </tr>" +
            "<tr><td align=right ><input type='button'
value='Save & Close' onclick='saveData()' /></td>" +
             "<td><input type='button' value='Cancel & Delete'
onclick='cancel()' /></td></tr>";

infowindow = new google.maps.InfoWindow({
content: table
});

google.maps.event.addListener(map, "click", function(event) {
           addMarker(event.latLng);
    });
} //end initialize

   // Add a marker to the map and push to the array, open an infowindow listener.
   function addMarker(location) {
           if (editon.editT[0].checked) edit = true;   //check 'edit' radio buttons
           if (editon.editT[1].checked) edit = false;
           alert('infopen is ' + infopen);
   if (edit== true && infopen== false) {  
//if edit toggle is selected and infowindow not open
    marker = new google.maps.Marker({
     position: location,                   //from event.latLng
     map: map,
     draggable: true,
   });

   markers.push(marker);  //add to markers array

   google.maps.event.addListener(marker, "click", function() { 
//listener for infowindow
     infowindow.open(map, marker);
     infopen = true; // stop the creation of new markers *in theory...
     //alert('infopen is ' + infopen);
   });
 }// end if
    } //end addMarker()

 // Sets the map on all markers in the array. (only used when clearing)
 function setAllMap(map) {
   for (var i = 0; i < markers.length; i++) {
     markers[i].setMap(map);
   }
 }

 // Deletes all markers in the array by removing references to
them.
 function deleteOverlays() {
   setAllMap(null);
   markers = [];
 }

//would passes along info to php... not yet
function saveData() {
     infowindow.close();
     infopen = false;    //reallow marker creation from click

   }

//closes window and clears marker
function cancel() {
   infowindow.close();
   infopen = false;    // reallow marker creation ***click still
heard by event listener***
   marker.setMap(null); //just clears from map
   }

</script>
</head>
<body onload="initialize()">
<br> </br>
<form name="editon"> Turn on editing:
<input type="radio" name="editT" value='true' checked/>Yes
<input type="radio" name="editT" value='false' />No
</form>

<div id="map_canvas" style="width:100%; height:70%"></div>
<p>If too cluttered:
<input onclick="deleteOverlays();" type=button value="Clear Map"/>
</body>
</html>

person Ben H    schedule 01.03.2012    source источник


Ответы (1)


Мой надуманный хак: добавьте setTimeout() вокруг infowindow.close(). Существует обоснование, объясненное ниже.

function saveData() {
   setTimeout(function() { infowindow.close(); }, 100);
}

//closes window and clears marker
function cancel() {
   setTimeout(function() { infowindow.close(); marker.setMap(null); }, 100);
}

100 мс кажется разумным. Как ни странно, установка маркера на нулевую карту в cancel() также должна быть тайм-аутом. Я не думаю, что вам больше нужна информация.

Я получил идею из этого примера кода: http://code.google.com/apis/maps/articles/phpsqlinfo_v3.html

В этом примере окно infoWindow закрывается (в обратном вызове) только после того, как сделан запрос к базе данных и гарантируется, что ответ был хорошим. Конечно, это должно занять несколько миллисекунд. Итак, при этих предположениях, как только ваша часть БД заработает, вы можете заменить уродливый setTimeout, и все должно работать! :)

person Heitor Chang    schedule 01.03.2012
comment
Я вижу, умница. Этого достаточно. Я надеюсь, вы правы, что запрос к базе данных будет выполняться одинаково. Спасибо! - person Ben H; 02.03.2012