php - 开放层 : remove multiple popups

标签 php javascript html openlayers

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

最佳答案

使用 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. 弹出窗口 = 5, i = 0, max.popups.length = 5
  2. popups = 4, i = 1, max.popups.length = 4
  3. 弹出窗口 = 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]); 
  };
}

这不再与移动目标进行比较,而且执行速度也将比原来的循环更快,因为与零进行比较比与寄存器进行比较(在大多数计算机体系结构中)更快。

关于php - 开放层 : remove multiple popups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8398238/

相关文章:

mysql 的 PHP 日期格式

php - 那里有适用于 PHP 程序员的往返软件吗?

php - 寻找 PHP 正则表达式或函数来使用 .为了安全起见的电子邮件

javascript - 使用 AJAX 值的文件上传未从其他字段传递

html - IE7中大型菜单的CSS

css - 如何使 overflow CSS 属性以 hidden 作为值工作

php - Codeigniter - 如何将 JSON 作为参数传递给 View

javascript - 错误: "Maximum call stack size exceed" AJAX calling WebMethod

javascript - onFocus 在模式弹出后停止触发

javascript - 添加/编辑网页的地址栏,而不删除已有的内容。