2012-02-23 4 views
0

Я работаю над страницей на прошлой неделе, которая использует карты Google для отображения всех округов в Грузии и позволяет пользователю нажимать на них и собирать данные переписи о выбранных округах. Округа в массиве GPolygons, и я реализовал интерактивную карту с этим (Судо-код):Хром сбой с 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, который создает слушатели на многоугольных оверлеях. Чтобы убедиться, что это проблема с самим циклом, а не с кодом внутри, я смоделировал условия цикла, и веб-страница все еще падает с хром. Даже с такой простой петлей:

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 
     } 
    } 
} 

<% = выход> является целой кучей полигонов, написанных от VB кода в Polys [] массив, и они появляются на карте штрафе.

Если я прокомментирую сегмент PROBLEM CODE скрипта, страница загрузится отлично, без необходимости в функциональности. Если я включу сегмент, страница выйдет из строя. Однако, если я опускаю сегмент ПРОБЛЕМНОГО КОДА и включаю в него любую другую петлю в любом случае, страница выходит из строя. Даже петля для петли, такая как

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

приведет к сбою страницы. Я застрял в этой проблеме уже несколько дней, и это сводит меня с ума. У кого-нибудь есть какие-то идеи относительно проблемы.

Кроме того, если я перехожу на консоль в хром и набираю цикл образца, он выполняется нормально. т.е. если я типа

for (var i=0; i<polys.length; i++) { 
    GEvent.addListener(polys[i], "click", function() { 
     alert("Listening!"); 
    }); 
} 

карта генерирует слушателей на каждом накладкой, что огонь правильно при нажатии, как хотелось бы. Опять же, включая что-то вроде этого внутри функции, сбой страницы, но в консоли он отлично работает.

+0

Когда вы копируете/вставляете этот простой цикл в консоль на пустой странице, это может привести к его краху? ... Если нет, ваша проблема в другом месте. – jondavidjohn

+0

Определите «крушение». Опишите точное поведение. –

+0

Если «крушение» означает «Я получил« Aw, хватаю ». страница. ", то, пожалуйста, посетите' chrome: // crashes' и отправьте отчет об ошибке/сбое. Если вы можете воспроизвести проблему, нам бы хотелось увидеть код. –

ответ

1

не использовать int, чтобы объявить счетчик ... javascript динамически типизирован.

использование var

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

+1 Все еще странно, что он разбил бы его браузер ... мой просто бросает неожиданную ошибку идентификатора. Я нервничал из-за того, что пытался это сделать :). –

+0

Моя ошибка, я написал вопрос неправильно. Я использую var для объявления i. Он по-прежнему падает с «Aw, snap!». страница ошибки. –

1

Вы можете разместить то, что вызов цикла, а также взять несколько heap snapshots? Получите один непосредственно перед циклом и, если возможно, несколько, пока цикл работает до того, как он сработает.

Сам цикл безвреден, но вызывающий его код может вызвать бесконечную проблему охвата?

0

Хорошо. Я попробовал массу вещей, и наконец нашел что-то, что работает, но не имеет смысла. Прокомментируйте пожалуйста, если вы это понимаете.

Я определил отдельную функцию addListeners() с кодом EXACT в проблемной области как тело, пропустил код проблемы из функции setupmap(), вызванный функцией addListeners() из той же строки, что и код проблемы был удален из и преобразовал переменную polyfip []. Таким образом, в коде нет изменений, за исключением того, что код проблемы находится внутри собственного блока.

Кто-нибудь знает, почему это решает проблему? Beats the hell from me ..

0

Ваш любимый polys.length? Если он большой/огромный, у вас просто заканчивается куча Java V8 VM (получение снимка с кучей - это действительно хороший совет.) В этом случае вы увидите «Aw, snap!». ошибка. То, что вы описываете как «решение» в своем ответе, временно уменьшает объем памяти вашего кода.

+0

polys.length - значение 159. Даже вставка пустого цикла в функцию setupmap() вызывает ошибку. Пустая петля из 5 итераций не может привести к исчерпанию памяти. Ты так думаешь..? –

+0

Ну, проблема с памятью кажется мне очень маловероятной, но профилирование кучи все же будет полезно, по крайней мере, иметь некоторое представление о поведении программы. Возьмите один снимок перед циклом, другой - во время цикла (как это рекомендовано @ user1090190). Затем вы можете сравнить их (встроенную функцию), чтобы узнать о распределении памяти между ними. –

Смежные вопросы