Uncaught TypeError добавляет диаграмму в уценку с помощью Jekyll

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

Я просто добавляю необходимые скрипты в свой .md файл (в начале):

<script type="text/javascript" src="/assets/js/jQuery/jquery-1.11.1.min.js"></script>

<script type="text/javascript" src="/assets/js/highcharts/highcharts.js"></script>

<script type="text/javascript" src="/assets/js/highcharts/highcharts-more.js"></script> 

Они загружаются без проблем, и если, например, я удаляю highcharts.js, highcharts-more.js выдает ReferenceError, потому что он зависит от highcharts.js. Все идет нормально. Однако, когда я использую функцию $(...).highcharts(), я получаю следующую ошибку:

Uncaught TypeError: $(...).highcharts is not a function

Если я проверю исходники в консоли Chrome, то увижу, что загружены highcharts...

Поэтому я предполагаю, что более поздний скрипт, вызывающий highcharts, запускается до загрузки highcharts. Я вообще этого не понимаю :). Пожалуйста помоги!

Полный код:

---
layout: post
title: "De geschiedenis van de eerste klasse."
categories: [posts,random]
utilities: highlight
---
<script src="https://gist.github.com/yizeng/2371e8b83c9254ed77f2.js"></script>

<script type="text/javascript" src="/assets/js/jQuery/jquery-1.11.1.min.js"></script>

<script type="text/javascript" src="/assets/js/highcharts/highcharts.js"></script>

<script type="text/javascript" src="/assets/js/highcharts/highcharts-more.js"></script> 

<script src="https://rawgit.com/highslide-software/pattern-fill/master/pattern-fill.js"></script>

<link rel="stylesheet" type="text/css" href="/assets/css/custom.css" />

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">

   <!--Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">

<script src="/assets/js/moment/moment.js"></script>

<script>
  elo_evolution = {{ site.data.elo-evolution | jsonify }}
  max_elo_data ={{ site.data.max_elo_data | jsonify}}
  dates = {{site.data.dates| jsonify}}
  teams = {{site.data.teams| jsonify}}
  seasons = {{site.data.seasons| jsonify}}
</script>

<script>
  function max() {
    var args = Array.prototype.slice.call(arguments);
    return Math.max.apply(Math, args.filter(function(val) {
       return !isNaN(val);
    }));
}

  function drawEloChart(team_select) {
  // series = data that will be shown (dates & elo)
  series = []
  for (i=0;i<seasons.length;i++) {
      data = []
      for (j=0;j<elo_evolution[team_select][seasons[i]][0].length;j++) {
          data.push([elo_evolution[team_select][seasons[i]][0][j],elo_evolution[team_select][seasons[i]][1][j]])
      }
      series.push({name:seasons[i],data:data, marker: {symbol: "circle"} })
  }

  // Max ELO opmaak
  for(i=0;i < max_elo_data[team_select].length;i++) {
      series[max_elo_data[team_select][i][0]].data[max_elo_data[team_select][i][1]] = { marker: {
                                                                                          symbol: 'url(http://www.highcharts.com/demo/gfx/sun.png)',
                                                                                          enabled: true,
                                                                                          fillColor: '#FF0000',
                                                                                          lineWidth: 0.2,
                                                                                          radius: 2,
                                                                                          lineColor: "#FF0000" // inherit from series
                                                                                  },y:series[max_elo_data[team_select][i][0]].data[max_elo_data[team_select][i][1]][1],x: series[max_elo_data[team_select][i][0]].data[max_elo_data[team_select][i][1]][0]}
  }

   $('#container').highcharts({
       chart: {
           type: 'spline',
           zoomType: 'x',
           plotBackgroundImage: 'http://i.imgur.com/9ePWdzK.png',
          // renderTo: 'container',
          // Fancy stuff here
          events: {
              selection: function (event) {
                  if (event.xAxis) {
                      // Zoom
                      // alert(this.options)
                      this.options.plotBackgroundImage= ""
                      this.redraw()
                      // this.chart.options.plotBackgroundImage='http://upload.wikimedia.org/wikipedia/commons/a/a6/Roses_renoir.JPG';
                      // this.chart
                      // text = 'min: ' + Highcharts.numberFormat(event.xAxis[0].min, 2) + ', max: ' + Highcharts.numberFormat(event.xAxis[0].max, 2);
                  } else {
                      // Reset zoom
                  }
              }
          }
      },
       credits: {
          enabled: false
        },
      // chart: {
      //     type: 'spline'
      // },
      title: {
          text: 'ELO Rating Jupiler Pro League Ploegen'
      },
      subtitle: {
          text: 'Een analyse van 20 jaar JPL.'
      },
      xAxis: {
          // events: {
          //     afterSetExtremes: function() {
          //     // Na Zoom, geen background image meer.
          //     }
          // },
          type: 'datetime',
          // dateTimeLabelFormats: { // don't display the dummy year
          //     month: '%e. %b',
          //     year: '%Y'
          // },
          // title: {
          //     text: 'Date'
          // },
          // labels: {
          //     format: "{value:%Y-%m-%d}"
          // },
          min: dates[0],
          max: dates[dates.length - 1],
          labels: {
                  formatter: function() {
                      if ((moment(this.value).year()-1)%5 == 0) {
                           date_string = String(moment(this.value).year()-1) + "/" + String(moment(this.value).year())
                      } else {
                          date_string = ""
                      }

                      return date_string;
                  }            
          },

      },
      yAxis: {
          title: {
              text: 'ELO Rating'
          },
          min: 1100,
          max: 2000,
          labels: {
              formatter: function() {
                      if (this.value == 1500) {
                          y_label = "<strong>GEM</strong>"
                      }
                      else {
                          y_label = this.value
                      }

                  return y_label;
              }  
          }
      },
      tooltip: {

          formatter: function () {
              var s = '<table><td colspan="2" style="text-align: center"><strong>' + this.y + '</strong></td>'
              gameday_index = this.series.data.indexOf(this.point)


              s += '<tr><td class="tooltip-elo-one" style="text-align: right"><b>' + elo_evolution[team_select][this.series.name][2][gameday_index]   + '</b></td></tr>' +  
              '<td class="tooltip-elo-one" style="text-align: right"><b>' + elo_evolution[team_select][this.series.name][3][gameday_index]   + '</b></td></tr>' + 

              // Datum
              '<tr>' +
              '<td colspan="2" class="tooltip-elo-one" style="text-align: right"><b>' + moment(this.x).calendar()  + '</b></td></tr>'

                          // elo_evolution[team][this.series.name][3] +


                  s += '</table>'
              // });


              return s;
          },

          useHTML: true,
      },

      plotOptions: {
          spline: {
              marker: {
                  enabled: false,
                  states: {
                      hover: {
                          enabled: true
                      }
                  }
              },
              color: 'rgb(50,50,50)',
              showInLegend: false
          }
      },

      series: series
  });
};
</script>
  <script>
  $( document ).ready(function() {

      for (i = 0;i<teams.length;i++) {
          if (teams[i] == "Anderlecht") {
              // $("#dropdown").append('<option><a id="team_' +String(i) +'" href="#" onclick="clickTeam(this.id);return false;">' +
              //                              '<img class="floatLeft" src="/assets/images/posts/Team Logos/' + teams[i] + '.png"' +  'height="20" width="20" />' +
              //                              '&nbsp;' + teams[i] + '</a></option>')

              $("#dropdown_list").append('<li><a id="team_' +String(i) +'" href="#" onclick="clickTeam(this.id);return false;">' +
                                          '<img class="floatLeft" src="/assets/images/posts/Team Logos/' + teams[i] + '.png"' +  'height="20" width="20" />' +
                                          '&nbsp;' + teams[i] + '</a></li>'
                  )

              var team_select = teams[i]
              var team_count = i
              $("#button_list").html(teams[i] + '  &nbsp;<span class="caret"></span>')

          } else  {
                              // $("#dropdown").append('<option><a id="team_' +String(i) +'" href="#" onclick="clickTeam(this.id);return false;">' +
                              //              '<img class="floatLeft" src="/assets/images/posts/Team Logos/' + teams[i] + '.png"' +  'height="20" width="20" />' +
                              //              '&nbsp;' + teams[i] + '</a></option>')
              $("#dropdown_list").append('<li><a id="team_' +String(i) +'" href="#" onclick="clickTeam(this.id);return false;">' +
                                          '<img class="floatLeft" src="/assets/images/posts/Team Logos/' + teams[i] + '.png"' +  'height="20" width="20" />' +
                                          '&nbsp;' + teams[i] + '</a></li>'
                  )
          }

      }
      drawEloChart(team_select);
});
</script>

<div class="btn-group text-center" role="group">

<button id="button_list" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Kies team&nbsp;<span class="caret"></span></button>

<ul id= "dropdown_list" class="dropdown-menu scrollable-menu" role="menu">
</ul>

</div>


  <div id="container" style="min-width: 310px; height: 600px; margin: 0 auto"></div>



{% highlight ruby %}
def foo
  puts 'foo'
end
{% endhighlight %}




{% highlight javascript linenos=table %}
function myFunction() {
    alert("Hello World!");
}
{% endhighlight %}

Функция drawEloChart вызывается в конце скрипта $( document ).ready(function(). Затем drawEloChart вызывает highcharts, и именно здесь возникает ошибка.


person Willem Lenaerts    schedule 02.06.2015    source источник
comment
не могли бы вы предоставить jsfiddle?   -  person Alex Filatov    schedule 02.06.2015
comment
вы должны проверить, что другая jquery.js библиотека не загружена после того, как вы загрузите highcharts.js   -  person Alex Filatov    schedule 02.06.2015
comment
Убедитесь, что вы создаете диаграмму после загрузки страницы (событие onload). Кроме того, убедитесь, что вы используете последнюю версию highcharts. И, конечно же, проверьте правильность путей ко всем файлам.   -  person Paweł Fus    schedule 02.06.2015
comment
@AlexFilatov, может быть! Как мне убедиться, что все мои сценарии загружаются только после загрузки стандартных сценариев макета (которые содержат jquery)?   -  person Willem Lenaerts    schedule 02.06.2015
comment
См. первую строку в этой демонстрации: jsfiddle.net/4okzs960 — диаграмма создается внутри обратного вызова jQuery: $(function () { ... }).   -  person Paweł Fus    schedule 02.06.2015
comment
Это, к сожалению, не исправить. Хорошо, я схожу с ума здесь. Код отлично работает вне jekyll, поэтому я уверен, что проблема в том, что сказал @AlexFilatov: моя библиотека jquery загружается до highcharts, а после этого загружается библиотека jquery кода шаблона jekyll, ломая higcharts (по какой-то причине). Однако, если моя гипотеза верна, должно работать следующее исправление: загрузить highcharts внутри $(document).ready(function(), вызвав $.getScript('/assets/js/highcharts/highcharts.js'); т. Заранее спасибо за помощь, ребята!   -  person Willem Lenaerts    schedule 02.06.2015
comment
Вы можете скинуть свой код в репозиторий github?   -  person David Jacquel    schedule 02.06.2015
comment
@DavidJacquel github.com/exergos/jekyll-highcharts-problem , все в карта блога. Я поместил код, вызывающий highcharts, в отдельный js, voetbalelo.js. Блог, который я хочу опубликовать: 2015-06-02-voetbal-elo.md. Спасибо!   -  person Willem Lenaerts    schedule 02.06.2015
comment
Я вижу, что оставил скрипт, загружающий voetbalelo.js, в качестве комментария, теперь изменил его. Теперь ошибка: Uncaught TypeError: $(...).highcharts не является функцией   -  person Willem Lenaerts    schedule 03.06.2015


Ответы (1)


Задача решена!

Проблема заключалась в том, что jQuery загружается ПОСЛЕ highcharts.js, создавая проблему Uncaught TypeError: $(...).highcharts is not a function.

Я попытался исправить это, загрузив highcharts.js следующим образом:

$( document ).ready(function() {
       $.getScript(".../highcharts.js");
});

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

Чтобы исправить это и заставить его работать вовремя, используйте «async: false»:

 $( document ).ready(function() {
      $.ajax({
        url: ".../highcharts.js",
        dataType: 'script',
        async: false
      });
  });

Спасибо всем за помощь!

person Willem Lenaerts    schedule 03.06.2015