Chrome вылетает из JavaScript? - PullRequest
       5

Chrome вылетает из JavaScript?

0 голосов
/ 24 февраля 2012

Я работаю над страницей на прошлой неделе, которая использует карты Google для отображения всех округов в Грузии и позволяет пользователю нажимать на них и собирать данные переписи по выбранным округам.Округа находятся в массиве GPolygons, и я реализовал интерактивную карту с помощью этого (sudo-code):

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

Это прекрасно работало, пока я работал над страницей (тестирование все время проводилось вchrome), и так как я почти закончил работу над ним и со страницами, с которыми он взаимодействует на днях, он начал падать в 90% случаев, когда я его открывал.Эти сбои настолько интенсивны, что моему компьютеру требуется около 15 минут для полного восстановления.Это влияет на весь мой компьютер, а не только на хром.Я закомментировал весь javscript на странице и заново представил его сегмент за сегментом, а проблемной областью является цикл for, который создает прослушиватели наложений полигонов.Чтобы убедиться, что это проблема с самим циклом, а не с кодом внутри, я смоделировал условия цикла, и веб-страница все еще падает в chrome.Даже с таким простым циклом:

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

страница все равно падает.Я понятия не имею, почему он не может обработать этот код.Кто-нибудь есть какие-либо предложения о том, как решить эту проблему ..?Страница прекрасно открывается в Firefox и IE9.

- обновление -

Чтобы более ярко описать сбой: chrome начинает загрузку страницы.Хотя страница по-прежнему полностью пуста, все начинает замедляться, и вся моя машина становится все более и более безразличной, пока я не могу только двигать мышью и ничего не происходит при наведении мыши или щелчках.Компьютер останавливается около 10 минут, загружает «Ой, щелк!»сообщение об ошибке и остается медленным и не отвечает в течение еще 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
        }
    } 
}

<% = output> - это целый набор полигонов, записанных из кода vb в массив polys [], и они хорошо отображаются на карте.

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

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 24 февраля 2012

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

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

1 голос
/ 24 февраля 2012

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

используйте var

var count=0;
for ( var i=0; i<5; i++)
    count=1;
alert(count);
0 голосов
/ 24 февраля 2012

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

0 голосов
/ 24 февраля 2012

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

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

Кто-нибудь знает, почему это решает проблему? Черт побери из меня ..

...