если вы обновляете карту с элементами управления, будьте осторожны, чтобы не иметь нескольких элементов управления и обработчиков событий (см. ПОСЛЕДНЮЮ ЗАМЕТКУ в конце этого поста).
два разных события могут закрыть ваше всплывающее окно: aПоле ЗАКРЫТЬ ('X') внутри всплывающего окна И автоматическая процедура, которая закрывает всплывающее окно, когда всплывающее окно теряет фокус.
этот псевдокод был взят из функциональной карты с всплывающими окнами, которые появляются, когда пользователь нажимает наa any MARKER.
я создаю слой на карте (в данном случае из динамического файла KML, анализируемого по php):
var urlKML = 'parseKMLTrack07d.php';
var layerKML = new OpenLayers.Layer.Vector("KML1", {
strategies: [new OpenLayers.Strategy.Fixed()],
protocol: new OpenLayers.Protocol.HTTP({
url: urlKML,
format: new OpenLayers.Format.KML({
extractStyles: true,
extractAttributes: true,
maxDepth: 2
})
})
});
, затем я создаю элемент выбора, который я вызываю'selectStop' и я связываем 2 функции с СОБЫТИЯМИ (когда МАРКЕР выбран и не выбран):
var selectStop = new OpenLayers.Control.SelectFeature(layerKML,{onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
layerKML.events.on({
"featureselected": onFeatureSelect,
"featureunselected": onFeatureUnselect
});
map.addControl(selectStop);
selectStop.activate();
это две функции, когда МАРКЕР выбран или НЕ ВЫБРАН
function onFeatureSelect(event) {
var feature = event.feature;
var content = feature.attributes.name + '<br/>'+feature.attributes.description;
popup = new OpenLayers.Popup.FramedCloud("chicken",
feature.geometry.getBounds().getCenterLonLat(),
new OpenLayers.Size(100,100),
content,
null, true, onFeatureUnselect);
feature.popup = popup;
map.addPopup(popup);
// GLOBAL variable, in case popup is destroyed by clicking CLOSE box
lastfeature = feature;
}
function onFeatureUnselect(event) {
var feature = lastfeature;
if(feature.popup) {
map.removePopup(feature.popup);
feature.popup.destroy();
delete feature.popup;
}
}
обратите внимание, что в функции onFeatureSelect я создаю глобальную переменную с именем 'lastfeature'.причина, по которой я это делаю, заключается в том, что мой onFeatureUnselect будет использоваться для уничтожения всплывающего окна, если оно НЕ ВЫБРАНО или КОЛЛЕКЦИЯ ЗАКРЫТА.
если бы я не сохранил объект как глобальную переменную, мне пришлось бы отдельно рассматривать отмену выбора и закрытие блока, поскольку СОБЫТИЯ, КОТОРЫЕ ПРИЧИНАЮТ КАЖДОЕ, различны.
для создания внутри коробки ЗАКРЫТЬво всплывающем окне я установил аргумент «от второго до последнего» (в объявлении всплывающего окна в функции onFeatureSelect) в значение «ИСТИНА» и в качестве функции обратного вызова для поля закрытия выберите «onFeatureUnselect»:
popup = new OpenLayers.Popup.FramedCloud("chicken",
feature.geometry.getBounds().getCenterLonLat(),
new OpenLayers.Size(100,100),
content,
null, true, onFeatureUnselect);
ПОСЛЕДНЕЕ ПРИМЕЧАНИЕ: если вы используетеобновить слой, будьте осторожны, чтобы не дублировать ваши обработчики.в этом случае, когда ваш javascript запускается, создайте переменную 'id1', которая будет содержать ваш идентификатор элемента управления selectStop.проверьте, существует ли он, прежде чем создавать новый элемент управления и обработчик.например:
if (id1 == '') {
var selectStop = new OpenLayers.Control.SelectFeature(layerKML,{onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
layerKML.events.on({
"featureselected": onFeatureSelect,
"featureunselected": onFeatureUnselect
});
map.addControl(selectStop);
selectStop.activate();
id1 = selectStop.id;
} else {
selectStop = OpenLayers.Control.SelectFeature(layerKML,{onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
}
вы можете проверить, дублируете ли вы свои обработчики событий, поместив предупреждение в свой onFeatureSelect.Если вы нажмете на маркер и получите несколько окон предупреждений, то у вас будут дубликаты обработчиков.создается впечатление, что вы не можете уничтожить всплывающее окно, что не соответствует действительности.вы уничтожили ОДНО всплывающее окно, но у вас есть N одинаковых всплывающих окон (кстати, с таким же идентификатором).