【问题标题】:Chart.js - Cannot read property 'getContext' of nullChart.js - 无法读取 null 的属性“getContext”
【发布时间】:2018-11-02 04:23:01
【问题描述】:

我的 main.js 文件中有以下 Javascript:

//array object of API stuff

function createChartWinLoss(wins, losses) {

  var pieData = [
    {
      value: losses,
      color: "#F7464A",
      highlight: "#FF5A5E",
      label: "Losses"
    },
    {
      value: wins,
      color: "#46BFBD",
      highlight: "#5AD3D1",
      label: "Wins"
    }
  ];

  var pieOptions = {
    segmentShowStroke : false,
    animateScale : true
  }


  var winLossChart = document.getElementById('winLossChart').getContext('2d');
  new Chart(winLossChart).Pie(pieData, pieOptions);
}

//creates the chart with test data
createChartWinLoss();

function summonerLookUp() {
  var SUMMONER_ID = "";
  var API_KEY = "keyhere";
  var sumID = $("#theKey").val();
  var div = document.getElementById('stuff');
  var combine = "";
  var array = [sumID];
  var wins;
  var losses;

  div.innerHTML = div.innerHTML + "<br />array count: " + array.length + "<br />";
  for (var i = 0; i < array.length; i++) {
    combine = "";
    SUMMONER_ID = array[i];
    getStuff(SUMMONER_ID, combine, API_KEY, div, i);
  }
}

function getStuff(SUMMONER_ID, combine, API_KEY, div, count) {
  var Topuser = SUMMONER_ID;
  $.ajax({
    url: 'https://euw.api.pvp.net/api/lol/euw/v2.5/league/by-summoner/' + SUMMONER_ID + '/entry?api_key=' + API_KEY,
    type: 'GET',
    dataType: 'json',
    async: false,
    data: {},
    success: function (json) {
      var user = Topuser;
      if (typeof json[user][0].queue != "undefined") {
        if (json[user][0].queue == "RANKED_SOLO_5x5") {
          combine = json[user][0].tier + " " + json[user][0].entries[0].division  + " - " + json[user][0].entries[0].wins + " Wins " + json[user][0].entries[0].losses + " losses";
          div.innerHTML = div.innerHTML + "<br />" + count + ": " + user + " " + combine;
          var wins = json[user][0].entries[0].wins;
          var losses = json[user][0].entries[0].losses;
          //populates chart with wins losses from api
          createChartWinLoss(wins,losses);
        }
      }
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      var user = Topuser;
      console.log(errorThrown);
      if (errorThrown === "Not Found") {
        div.innerHTML = div.innerHTML + "<br />" + count + ": " + user + " " + "UNRANKED";
      }
    }
  });
}

HTML如下:

<div class="container">
  <h2>Wins/Losses</h2>
  <canvas id="winLossChart" width="400" height="200"></canvas>
</div>

正如标题所示,我收到了Uncaught TypeError: Cannot read property 'getContext' of null,但我并不完全确定问题出在哪里。如果我不得不猜测,我会说它试图引用不存在的东西,但我不能 100% 确定我是否正确以及如何修复它。任何建议都会很棒。

【问题讨论】:

  • 这个脚本中有一大堆与 Chart.js 无关的东西,所以我们很难知道问题出在哪里。你能把你的问题简化为一个更小的、独立的例子吗?此外,您应该使用控制台来查找有关错误的更多详细信息。它来自哪条线路?您可以使用调试器解决问题吗? (在 Chrome 中使用 Pause on Exceptions。)
  • 没关系,我想我明白问题所在了。添加了答案。

标签: javascript charts


【解决方案1】:

引发错误的行是

var winLossChart = document.getElementById('winLossChart').getContext('2d');

这是说document.getElementById('winLossChart')不存在。

这可能是因为在 DOM 中创建完元素之前正在解释您的脚本。

您可以在 window.onload 函数中启动脚本:

window.onload = function() {
   createChartWinLoss();
}

或者您可以将脚本标签本身作为最后一个元素放在 html 文件的正文元素中。

<body>
  <div class="container">
    <h2>Wins/Losses</h2>
    <canvas id="winLossChart" width="400" height="200"></canvas>
  </div>
  <script src="myscript.js"></script>
</body>

任何一种解决方案都意味着代码的主入口点 (createChartWinLoss) 只会在页面上的其他元素(包括画布)创建之后发生。

作为解决此类问题的一般过程,当您在 Javascript 控制台中看到异常时,您应该能够打开堆栈跟踪,这会导致您发现错误源自在线var winLossChart = ...,这将使您更有可能发现问题的根源。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。该元素作为 dispHTMLUnkownElement 返回。

    解决方案是将&lt;!DOCTYPE html&gt;添加到我的响应顶部,然后 IE 会正确选择元素类型。

    【讨论】:

      【解决方案3】:

      也许这可以帮助别人...... 您必须使用 destroy() 方法。
      为此,您必须更改代码中的一些内容:

      var winLossChart = "";// Here you make your chart var global
      function createChartWinLoss(wins, losses) {
          var pieData = [{
              value: losses,
              color: "#F7464A",
              highlight: "#FF5A5E",
              label: "Losses"
          }, {
              value: wins,
              color: "#46BFBD",
              highlight: "#5AD3D1",
              label: "Wins"
          }];
          var pieOptions = {
              segmentShowStroke: false,
              animateScale: true
          }
          //Here´s the change inside the function where you run destroy().
          if(typeof winLossChart.destroy != "undefined") winLossChart.destroy();
          winLossChart = document.getElementById('winLossChart').getContext('2d');
          new Chart(winLossChart).Pie(pieData, pieOptions);
      }
      //creates the chart with test data...
      

      https://github.com/chartjs/Chart.js/issues/3231

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 2016-06-26
        • 2023-03-05
        • 2021-08-14
        相关资源
        最近更新 更多