2011-12-06 73 views
4

我正在嘗試使用OpenLayers 2.11創建一個空間調查,但在關閉多個彈出窗口時遇到了一些問題。Openlayer:刪除多個彈出窗口

以下代碼適用於一個彈出窗口,但該功能無法關閉多個彈出窗口併發布內容。

是否有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> 
+0

不form.submit()導致頁面重新加載? – igorti

回答

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. 彈出窗口= 5,I = 0,max.popups.length = 5個
  2. 彈出窗口= 4,i = 1,max.popups.length = 4個
  3. 彈出窗口= 3,I = 2, max.popups.length = 3個
  4. 彈出窗口= 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

奇妙的例子,謝謝。 – DnfD

相關問題