Javascript не работает при использовании асинхронного атрибута: Highcharts - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь ускорить мою страницу. Но проблема в том, что я думаю, что Highcharts js может замедлить мой сайт.

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

Меня попросили отложить разбор js, поэтому я добавил атрибут асинхронности в тег сценария, но после добавления атрибута асинхронности моя карта перестала отображаться.

Мой скрипт-тег выглядит следующим образом.

<script async src="assets/js/jquery.min.js"></script>
<script async src="assets/js/script.min.js"></script>
<script async type="text/javascript" src="assets/js/jquery-3.3.1.js"></script>
<script async src="js/highcharts/highstocks.js"></script>
<script async src="js/highcharts/mapmodulesdata.js"></script>
<script async src="js/highcharts/mapmodulesexporting.js"></script>
<script async src="js/highcharts/map-export-data.js"></script>
<script async src="js/highcharts/map.js"></script>
<script async src="js/highcharts/worldmap.js"></script>

Пожалуйста, поправьте меня, если я что-то упустил

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Вы должны вызывать API Highcharts только после загрузки "highcharts.js" в дом, вы можете следовать примеру ниже:

https://codepen.io/anon/pen/ydorpE?&editable=true

  var script =   document.getElementById("script1");  

script.onload = function(){ 
afterLoad()
}



function afterLoad () {
  Highcharts.chart('container', {

  title: {
    text: 'Solar Employment Growth by Sector, 2010-2016'
  },

  subtitle: {
    text: 'Source: thesolarfoundation.com'
  },

  yAxis: {
    title: {
      text: 'Number of Employees'
    }
  },
  legend: {
    layout: 'vertical',
    align: 'right',
    verticalAlign: 'middle'
  },

  plotOptions: {
    series: {
      label: {
        connectorAllowed: false
      },
      pointStart: 2010
    }
  },

  series: [{
    name: 'Installation',
    data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
  }, {
    name: 'Manufacturing',
    data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
  }, {
    name: 'Sales & Distribution',
    data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
  }, {
    name: 'Project Development',
    data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227]
  }, {
    name: 'Other',
    data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
  }],

  responsive: {
    rules: [{
      condition: {
        maxWidth: 500
      },
      chartOptions: {
        legend: {
          layout: 'horizontal',
          align: 'center',
          verticalAlign: 'bottom'
        }
      }
    }]
  }

});

  
}
#container {
  min-width: 310px;
  max-width: 800px;
  height: 400px;
  margin: 0 auto
}
<script id='script1' async   src="https://code.highcharts.com/highcharts.js"></script>
<script async src="https://code.highcharts.com/modules/series-label.js"></script>
<script async src="https://code.highcharts.com/modules/exporting.js"></script>
<script async src="https://code.highcharts.com/modules/export-data.js"></script>

<div id="container"></div>
0 голосов
/ 26 июня 2019

Вам нужно создать диаграмму после того, как все ваши скрипты будут выполнены.window.onload ожидает также асинхронные сценарии, поэтому вы можете использовать его:

window.onload = function() {
    Highcharts.mapChart('container', {...});
}

Демонстрационная версия: https://jsfiddle.net/BlackLabel/j3tfveqa/

Документы: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onload

0 голосов
/ 26 июня 2019

Правильный способ загрузки этих скриптов и последующего вызова Highcharts должен быть примерно таким:

<header>
<!-- remove all scripts from here -->
</header>
<body>
...

<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/script.min.js"></script>
<script type="text/javascript" src="assets/js/jquery-3.3.1.js"></script>
<script src="js/highcharts/highstocks.js"></script>
<script src="js/highcharts/mapmodulesdata.js"></script>
<script src="js/highcharts/mapmodulesexporting.js"></script>
<script src="js/highcharts/map-export-data.js"></script>
<script src="js/highcharts/map.js"></script>
<script src="js/highcharts/worldmap.js"></script>

<script>
(function() {
  // Now in this function you can add Highcharts call
})();
</script>
</body>
...