2015-10-08 3 views
1

Я должен использовать javascript для проекта, но я ничего не знаю о javascript. В js-файле я использую jVectorMap для отображения карты мира, которая обновляется каждые 5 секунд. Когда я открываю веб-страницу с помощью этого javascript-файла в своем веб-клиенте и жду несколько часов, у моего компьютера заканчивается ОЗУ. Я использую консоль хром и консольный инструмент для определения части кода, создающего эту проблему. Когда я удаляю эту часть, проблема с использованием памяти отсутствует.Утечки памяти Javascript с JVectorMap

Часть кода:

function ui_geo_map(countriesCount) { 
    $('#geo-world-map').empty(); 
    $('#geo-world-map').vectorMap({ 
     map: 'world_mill_en', 
     series: { 
      regions: [{ 
       values: countriesCount, 
       scale: ['#2ecc71', '#c0392b'], 
       normalizeFunction: 'polynomial', 
       legend: {vertical: true} 
      }] 
     }, 
     onRegionTipShow: function(e, el, code){ 
      el.html(el.html() + ' (' + countriesCount[code] + ' - servers)'); 
     } 
    }); 
}; 

function ui_geo() { 
    console.debug('Redrawing the geo map'); 
    $('.pywos-geo').remove(); 
    $.getJSON('/get/geo/all', function(data){ 
     $.each(data, function(key, val){ 
      countriesCount[val.country_code] = val.count; 
     }); 
     ui_geo_map(countriesCount); 
    }); 
}; 

Я знаю пустой следуют vectorMap, конечно, не правильный способ сделать это, но если я удалю $('#geo-world-map').empty(); карта не заменяется, вместо этого он отображается под предыдущий, который не то, что я хочу.

Может ли кто-нибудь помочь мне найти правильный способ сделать это без каких-либо утечек памяти?

+0

вы можете захотеть использовать [ 'удалить()' вместо 'пустой()'] (HTTP://stackoverflow.com/questions/3090662/jquery-empty-vs-remove), поэтому узлы внутри '$ ('# geo-world-map ') 'будет удаляться, а не просто опустели. Но у меня мало надежды, что это решит вашу проблему, поскольку обе функции не утечки памяти. Убедитесь, что у вас есть последняя jquerylibrary tho. Вы можете продолжить и удалить еще один код, пока не найдете утечку. – InsOp

+0

@InsOp: спасибо за ваш ответ. Если я удалю любой вызов ui_geo(), или если я не разрешаю его обновлять каждые 5 секунд, проблема с использованием памяти отсутствует. Вот почему я думаю, что проблема исходит из этой функции. – selfm

+0

- это случай, если вы закомментируете 'ui_geo_map (countriesCount);' в вашей 'ui_geo()' -функции тоже? – InsOp

ответ

1

Прежде всего есть метод remove который вы должны вызвать на экземпляре jVectorMap который грациозно удаляет все элементы DOM и связанные объекты JS:

var map = new jvm.Map({ 
    container: $('#geo-world-map'), 
    map: 'world_mill_en', 
    series: { 
     regions: [{ 
      values: countriesCount, 
      scale: ['#2ecc71', '#c0392b'], 
      normalizeFunction: 'polynomial', 
      legend: {vertical: true} 
     }] 
    }, 
    onRegionTipShow: function(e, el, code){ 
     el.html(el.html() + ' (' + countriesCount[code] + ' - servers)'); 
    } 
}); 

Также не нужно, чтобы воссоздать всю карту каждый раз, когда вам необходимо обновить значения (это большая трата ресурсов), вы можете просто обновить данные:

$.getJSON('/get/geo/all', function(data){ 
    $.each(data, function(key, val){ 
     countriesCount[val.country_code] = val.count; 
    }); 
    map.series.regions[0].setValues(countriesCount); 
}); 
+0

Большое спасибо за ваш ответ. Я понимаю смысл здесь. Однако я не эксперт js вообще, и я получил NS_ERROR_FAILURE, когда я использую этот код. – selfm

+0

countriesCount не определен на карте chen, и цвет coutries только черный, нет легенды, и ничто, кажется, не обновляется. – selfm

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