Openlayer: удалить несколько всплывающих окон - PullRequest
4 голосов
/ 06 декабря 2011

Я пытаюсь создать пространственную съемку с использованием OpenLayers 2.11, но у меня есть некоторые проблемы с функцией закрытия нескольких всплывающих окон.

Следующий код отлично работает для одного всплывающего окна, но функция не может закрыть несколько всплывающих окон и опубликовать содержимое.

Существует ли метод OpenLayers для уничтожения старых всплывающих окон при создании нового всплывающего окна?

function submitform() {
  document.myform.submit();
  loop_popups();
}

-

function loop_popups() {
  for( var i = 0; i < map.popups.length; ++i ) { 
    map.removePopup(map.popups[i]); 
  };
}

-

<form name="myform" action="sqlinsert.php" method="post" target="_blank">
<a href="javascript: submitform()">Save/close</a>

Ответы [ 2 ]

6 голосов
/ 24 апреля 2012

Использование i для подсчета массива при удалении из него элементов удаляет только половину маркеров. Вместо этого попробуйте:

while( map.popups.length ) {
  map.removePopup( map.popups[0] );
}

Если вы хотите быть абсолютно уверенным, что цикл не повторяется вечно:

/**
 * Closes all the popups.
 */
function closePopups() {
  // Make sure the loop terminates...
  var maxIterations = 100;

  while( map.popups.length && --maxIterations ) {
    var popup = map.popups[0];
    map.removePopup( popup );
    popup.destroy();
  }
}

Этот тип техники замкнутого цикла используется на атомных электростанциях.

Предположим, у вас есть 5 всплывающих окон.

  1. popups = 5, i = 0, max.popups.length = 5
  2. popups = 4, i = 1, max.popups.length = 4
  3. popups = 3, i = 2, max.popups.length = 3
  4. popups = 2, i = 3, max.popups.length = 2

Значение i теперь превышает max.popups.length. Цикл завершается, но некоторые всплывающие окна не закрываются. (При попытке получить доступ к массиву всплывающих окон могла даже быть ошибка выхода за пределы допустимого диапазона ...)

Вы могли бы написать свой цикл как:

function loop_popups() {
  for( var i = map.popups.length - 1; i >= 0; i-- ) { 
    map.removePopup(map.popups[i]); 
  };
}

Это больше не сравнивает с движущейся целью, а также будет выполняться быстрее, чем ваш первоначальный цикл, потому что сравнение с нулем быстрее, чем сравнение с регистром (на большинстве компьютерных архитектур).

0 голосов
/ 04 августа 2013

Вы можете передать exclusive: true в addPopup, чтобы автоматически закрыть все другие всплывающие окна, например:

map.addPopup(popup, true)

См. http://dev.openlayers.org/docs/files/OpenLayers/Map-js.html#OpenLayers.Map.addPopup

Я нашел это полезным в борьбес ошибочной природой самого OpenLayers.Я не уверен, что другой пользователь пытался сделать при сравнении с атомными электростанциями;это было совершенно ненужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...