Openlayer:如何移除多个弹出窗口?

4

我正在尝试使用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>

form.submit()会导致页面重新加载吗? - igorti
2个回答

6

使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接