2012-02-23 1 views
0

Googleマップを使用してジョージア州のすべての郡を表示し、ユーザーがクリックして選択した郡についての国勢調査データを収集できるよう、過去1週間のページを作成しました。郡はGPolygonsの配列である、と私は、この(sudoのコード)とのインタラクティブマップを実装しました:私は(クロームで全体の時間をテスト)ページ上で作業している間にこれは素晴らしい仕事をChromeがjavascriptからクラッシュする

instantiate map; 
fill polys[] array from vb code-behind; 
for (var i=0; i<polys.length; i++) { 
    GEvent.addListener(polys[i], "click", function() { 
     highlight polygon and select item in listbox; 
     or 
     un-highlight polygon and deselect item in listbox; 
    } 
} 

先日、私が作業していたページやそのページの操作がほぼ完了したので、私が開いた時間の90%がクラッシュし始めました。これらのクラッシュは非常に激しく、コンピュータが完全に復旧するまでに15分ほどかかります。それはクロムだけでなく、私のコンピュータ全体に影響を与えます。私は、ページ上のすべてのjavscriptをコメントアウトし、セグメントごとに再導入し、問題領域はポリゴンオーバーレイ上にリスナーを作成するforループです。ループ自体とコード内の問題ではないことを確認するために、私はループ条件をシミュレートし、Webページは依然としてクロムでクラッシュします。

var count=0; 
for (var i=0; i<5; i++) 
    count=1; 
alert(count); 

このような単純なループでも、ページはクラッシュします。なぜこのコードを処理できないのかわからない。誰でもこの問題を解決する方法に関する提案はありますか?このページは、FirefoxとIE9で正常に開きます。

--update--より鮮やかにクラッシュを説明するために:クロームページのロードを開始します。ページはまだ空白になっていますが、マウスを動かすだけでマウスオーバーやクリックで何も起こらない限り、物事は減速し始め、マシン全体がますます反応しなくなります。コンピュータは約10分間停止したままになり、 "Aw、snap!"エラーページが表示され、クラッシュ後さらに5分間遅く応答しなくなります。 エラーを引き起こす関数全体がここにあります。

  var polys = []; 
      var labelsAr = []; 
      var poly; 
      var point; var point2; 
      var marker; 
      var label; 
      var map; 
      if (document.getElementById("map") != undefined) { 
       // init map 
       map = new GMap2(document.getElementById("map")); } 

      var pnames; 
      pnames = "<%=pnames%>"; 
      var labels = pnames.split(","); 


function setupmap(){ 
    if (GBrowserIsCompatible()) { 
     if (document.getElementById("map") != undefined) { 


     polyfip = []; 
     <%=polyfipSt%> 

     // add map controls and set loc 
     // the map = new GMap2 statement is not within a code block 
     map.addControl(new GLargeMapControl()); 
     map.addControl(new GMapTypeControl()); 
     map.setCenter(new GLatLng(32.80, - 83.50), 7); 
     var colour = "#ff6666"; 

     var tooltip = document.createElement("div"); 
     map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip); 
     tooltip.style.visibility="hidden"; 

     <%=output%> 

     //PROBLEM CODE 
       for (var i=0; i<polys.length; i++) { 
        GEvent.addListener(polys[i], "click", function() { 
         var evtObj = window.event ? event : e; 
         for (var i=0; i<polys.length; i++) { 
          if (this == polys[i]) { 
           if (evtObj.ctrlKey) { 
            map.closeInfoWindow(); 
            clickCounty(labels[i]); //a function elsewhere defined with simple if-else checks to highlight the county 
           } 
           else { 
            if (document.forms["pageform"].MainContent_CountySelection.options[i].selected==true && countiesSelected==1) { 
             clickCounty(labels[i]); 
             map.closeInfoWindow(); 
             } 
            else { 
             var overlaylatlng = this.getVertex(0); 
             for (var j = 0; j < document.forms["pageform"].MainContent_CountySelection.length; j++) { 
              document.forms["pageform"].MainContent_CountySelection.options[j].selected=false; 
              var tempPoly = polys[j]; 
             tempPoly.color = "EFEDB0"; 
              map.addOverlay(tempPoly); 
              } 
             countiesSelected = 0; 
            //an infowindow with some js function links 
            var infoWindow = map.openInfoWindowHtml(overlaylatlng,"<form id='f" + i + "' name='f" + i + "' method='post' action='countystats.aspx'><input type='hidden' name='countyName' id='countyName' value='" + labels[i] + "' /></form> County: "+labels[i]+" <br /><br /><a href='javascript:submitForm(\"f" + i + "\")'>Core Data</a><br /><form id='fs" + i + "' name='fs" + i + "' method='post' action='countystats2.aspx'><input type='hidden' name='countyName' id='countyName' value='" + labels[i] + "' /></form><a href='javascript:submitForm(\"fs" + i + "\")'>Single Tract Statistics</a> <form id='fsc" + i + "' name='fsc" + i + "' method='post' action='getACScounty.aspx'><input type='hidden' name='countyName' id='countyName' value='" + labels[i] + "' /></form><a href='javascript:submitForm(\"fsc" + i + "\")'>ACS All Tracts in County Statistics</a> <br /><a href=getsp1.aspx?countylist='" + polyfip[i] + "'>Census2010 County</a> <form id='fscsp" + i + "' name='fscsp" + i + "' method='post' action='getACScountysp.aspx'><input type='hidden' name='countyName' id='countyName' value='" + polyfip[i] + "' /></form><a href='javascript:submitForm(\"fscsp" + i + "\")'>Census2010 Sub-County</a>"); 
             clickCounty(labels[i]); 
            } 
           } 
           break; 
          } 
         } 
        }); 
       } 
      //END PROBLEM CODE 
     } 
    } 
} 

<% =出力は> []配列、およびそれらがマップ微細に表示されポリゴンにVisual Basicのコードで書かれた多角形の全体のスルーです。

スクリプトのPROBLEM CODEセグメントをコメントアウトすると、必要な機能がなくてもページが正常に読み込まれます。セグメントを含めると、ページがクラッシュします。しかし、問題コードを省略し、この関数内に別のforループを含めても、ページがクラッシュします。

for (var i=0; i<5; i++) { } 

などのforループもこのページをクラッシュします。私は今この問題を何日も抱え続けており、それが私を狂わせてしまっている。誰でも問題が何であるかについて何か考えがあります..

また、私はクロムでコンソールに移動してサンプルループを入力すると、正常に実行されます。つまり、入力した場合は、必要に応じて、クリックすると正しく呼び出される各オーバーレイにリスナーが生成されます。ここでも、関数内にこれを含めてページをクラッシュさせますが、コンソールでうまく動作します。

+0

単純なループを空白ページのコンソールにコピー/ペーストすると、クラッシュするのですか? ...そうでない場合、あなたの問題は他の場所にあります。 – jondavidjohn

+0

「クラッシュ」を定義します。正確な行動を記述します。 –

+0

「クラッシュ」が「私は「ああ、スナップ」を持っています。ページを参照してください。その後、 'chrome:// crashes'を訪問し、バグ/クラッシュレポートを送信してください。問題を再現できる場合は、コードを参照してください。 –

答えて

1

intを使用してカウンタを宣言してください... javascriptは動的に型指定されています。

使用var

var count=0; 
for (var i=0; i<5; i++) 
    count=1; 
alert(count); 
+0

+1彼のブラウザをクラッシュさせるというのはまだ不思議です...私のことは、予期せぬ識別子エラーを投げるだけです。私はそれを試すことについて緊張していた:)。 –

+0

私の間違い、私は間違った質問を書いた。私は宣言するためにvarを使用します。それはまだ "ああ、スナップ!"とクラッシュするエラーページ。 –

1

あなたはループを呼んでいたものを投稿するだけでなく、いくつかのheap snapshotsを取ることができますか? ループの直前に1つを取得し、可能であれば、ループがクラッシュする前に実行している間に数回取得します。

ループ自体は無害ですが、それを呼び出すコードが無限スコープの問題を引き起こす可能性がありますか?

0

私はたくさんのものを試して、やっと動作するものを見つけましたが、意味がありません。あなたがこれを理解していればコメントしてください。

問題領域にEXACTコードを本体として持つ別の関数addListeners()を定義し、問題コードと同じ行からaddListeners()関数というsetupmap()関数の問題コードを削除しました。変数polyfip []から削除され、グローバル化されました。したがって、問題コードがそれ自身のブロック内にあることを除いて、コードに変更はありません。

なぜこの問題が解決されるのですか?私を倒す...

0

polys.lengthは何ですか?それが大きい/巨大であれば、JavaScript V8 VMヒープを使い果たしているだけです(ヒープスナップショットは本当に良いアドバイスです)。この場合、「Aw、snap!」と表示されます。エラー。答えの "解決策"と表現していることは、コードのメモリフットプリントを一時的に減らします。

+0

polys.lengthの値は159です。setupmap()関数で空のループを挿入しても、エラーが発生します。 5回の反復の空のループでは、メモリが枯渇する可能性はありません。あなたはそう思いますか..? –

+0

まあ、メモリの問題は私にはほとんどないようですが、ヒープのプロファイリングは、少なくともプログラムの動作のいくつかの洞察力を持っていると便利です。 1つのスナップショットをループの前に、もう1つはループが実行されている間に(@ user1090190によって通知されるように)取る。次に、それらを比較して(組み込み関数)、それらの間のメモリー割り当てについて知ることができます。 –

関連する問題