2012-05-02 13 views
1

InfoWindowオブジェクトのarrrayをGoogle Maps JavaScript API v3から管理しようとしています。私はこのようなすべてのInfowindowオブジェクトを管理することができますので、私の配列は、グローバルのように定義されます。InfoWindow close()関数が機能していません

は、私はいくつかの詳細を追加するためのコードを編集したショーンが語ったとおり.close()関数は何もしていません

  google.maps.event.addListener(markers[id], 'click', function() { 


       for (var i = 0; i < infowindows.length; i++) { 
        var infoWin = infowindows[i]; 
        if (infoWin === undefined || infoWin === null) { 
         continue; 
        } 
        infoWin.close(); 

       } 

       map.panTo(markers[id].getPosition()); 
       infowindows[id].open(map,markers[id]); 
      }); 

。私は.open()と呼ぶことができるので、適切な方法でオブジェクトにアクセスしていることがわかります。誰でもこの問題について考えていますか? ありがとう!

EDIT(13/8 /日):これは、CSSに問題があるように見えたので、私は、私はいくつかのjQueryを使ってマップを示したときの表示スタイルを強制的にそれを修正するために管理:

$('#google-map').css("display", "block !important");  

感謝あなたの種類の答えのためにたくさん!

+0

'typeof infowindows [index] ==" object "'がtrueと評価されていますか? – andresf

+0

Thanx、andresf.Yes。私はinfowindows [index] .open()を問題なく呼び出すことができます – gotardo

答えて

1

私はコメントを追加し始めましたが、私には複数の提案がありますので、明確にするために完全な答えを追加しています。ここに私の最初のフィードバックは、一つの質問で、次のとおりです。あなたの目的は反復するの内容であるときはJavaScript for - inループはオブジェクトのプロパティを列挙に使用されることが意図されており、一般的に避けるべきである

  1. アレイ。 {

  2. あり確実に知る方法はありませんが、forループの定義内indexはありません(;;私< infowindows.length私は++ VAR I = 0)のため

    :だから、にループ制御を変更varキーワードを含まないため、グローバル変数を作成している可能性があります。 #1で示唆したように、従来のforループを使用するようにリファクタリングすると、この問題は解決されます。

  3. ガード条件の必要性はないようです:if (typeof infowindows[index] == "object") {ですので、テスト全体を削除してみてください。配列にInfoWindowのインスタンスが含まれていることがわかっている場合は、これは不要です。

  4. forループの最後の閉じ括弧の後のセミコロン}は不要です。私はそれが何らかの害を及ぼしているとは思わないが、それは除去すべきである。

質問:このコードは、エラーを生成していますか?

あなたのコメントをフォローアップ:

あなたは配列にnullメンバーがあるだろうと信じている場合for - inを使用する必要はありません。割り当てられていない配列メンバーがある場合は、undefinedになります。 nullのメンバーがある場合は、コードがnullに設定されているためです。しかしeather場合には、あなたはこれらの状況に対処し、まだ配列の繰り返し使用することができます:あなたの意図は、ループ繰り返しであるときfor - inを使用して

for (var i = 0; i < infowindows.length; i++) { 
    var infoWin = infowindows[i]; 
    if (infoWin === undefined || infoWin === null) { 
     //skips the remainder of the loop code and starts a new iteration 
     continue; 
    } 

    infoWin.close(); 
} 

を時々作品悪い習慣ですが、最終的にトラブルにあなたを取得します。オブジェクトのプロパティを列挙し、プロトタイプチェーンからプロパティを取得することさえあるので、あなたは何を得るのか完全には決して決して決してありません。また、for - inは、配列のプロパティを順番に列挙しないことがあります。これは、問題が発生することがあります。

open()を呼び出すのに似たロジックを使用している場合は、2つのループの間で配列に変更を加えて、close()を呼び出してループの原因となっている何かを行うと仮定する必要があります。あなたの質問にいくつかのコードを追加すると、それが役に立ちます。

+0

こんにちは@Sean Mickey、ありがとうございます。コードはエラーを生成していません。私はあなたが私に与えたリファクタのアドバイスを考慮していますが、いくつかの問題があります:アレイインデックスが相関性がないので、インフォーワードウィンドウ[1]とインフォボックス[3]が存在する可能性がありますが、インフォボックス[2]ヌル。 私はinfowindows [index] .open()を呼び出すたびにアルゴリズムのロジックが動作するように見えます(for-inループのすべてのインフォウィンドウを開くことができます)。しかし、彼らはちょうど閉じないでください... – gotardo

+0

@gotardo喜んで助けてください - あなたのコメントに答えて私の答えにコンテンツを追加しました。 –

+0

こんにちは、ショーン、あなたの役に立つ助けをお願い致します。私はあなたが言ったようにリファクタリングコードを持っていますが、動作しません。事実は: - infoWinはInfoWindowオブジェクトで、.close()が呼び出されたときに常に使用されます。 - .close()を呼び出す代わりに、infowindows [i] .open(map、marker [i])を呼び出してすべての情報ウィンドウを開くことができます。 – gotardo

1

繰り返しますが、これはinfoWin.close()は、情報ウィンドウを閉じていない場合は、最も明白な原因はinfoWinが情報ウィンドウではないということです...

コメントはあまりにも長いです。

  for (var i = 0; i < infowindows.length; i++) { 
       var infoWin = infowindows[i]; 
       if (infoWin === undefined || infoWin === null) { 
        continue; 
       } 
       infoWin.close(); 
      } 

あなたがinfowindowsと呼ばれているオブジェクトの配列を通じてこのループ反復し、あなたはinfoWinundefinednullはありませんが、それはそれは実際に情報ウィンドウだことを確認していないことをテストします。

.close()はエラーを起こさないので、それは何でもclose()メソッドを持っています。 InfoWindowのみがgetContent()メソッドを持っているので、そのオブジェクトが実際にInfoWindowであることを肯定的な指標としてテストできます。

InfoWindow の場合、マップへのリンクが必要です。その場合、close()メソッドが機能するはずなので、何かが変更されている必要があります。

+0

こんにちはAndrew、ありがとうございました。実際、infoWinはinfoWindowオブジェクトなので、私はinfoWin.open(map、marker [i])を実行することができ、ループはmap内のすべてのinfoWindowを開きます。 – gotardo

+0

@gotardoデモレーターへのリンクがありますか?何かが 'close()'メソッドを変更しているに違いありません。 –

関連する問題