2011-12-06 7 views
4

OpenLayers 2.11を使用して空間測量を作成しようとしていますが、複数のポップアップを閉じる機能に問題があります。Openlayer:複数のポップアップを削除する

次のコードは1つのポップアップで正常に機能しますが、複数のポップアップを閉じてコンテンツをポストすることはできません。

新しいポップアップを作成するときに古いポップアップを破棄するOpenLayersメソッドはありますか?

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

-

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

ページをリロードするためには,.submit()を作成しないでください。 – igorti

答えて

6

それは半分だけマーカーを除去からメンバーを除去しながらアレイを通してカウントするi使用 -

function loop_popups() { 
    for(var i = 0; i < map.popups.length; ++i) { 
    map.removePopup(map.popups[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

0

あなたは自動的にのように、他のすべてのポップアップを閉じるようにexclusive: trueaddPopupにを渡すことができます。

map.addPopup(popup, true) 

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

を参照してください、私はOpenLayersを自身のバギー尻自然に対処する上で、この便利を見つけました。他のユーザーが原子力発電所との比較をしようとしていたことはわかりません。それはまったく必要ありませんでした。

関連する問題