【问题标题】:AmCharts : Uncaught TypeError: Cannot read property 'mouseX' of undefinedAmCharts:未捕获的类型错误:无法读取未定义的属性“mouseX”
【发布时间】:2017-11-05 07:00:03
【问题描述】:

我正在使用 AmCharts 来处理与股票相关的事件。我的控制台窗口出现以下奇怪错误。

Uncaught TypeError: Cannot read property 'mouseX' of undefined
    at b.followCursor (amcharts.js:271)
    at b.showBalloonReal (amcharts.js:130)
    at amcharts.js:130

我的代码如下: -我使用这个函数将数据填充到reduceEventData变量中。

function getCompanyEventChartData() {
        var jqhx = $.ajax({
            type: "GET",
            data: { 'marketID': '@Model.MarketID', 'companyID': '@Model.CompanyID' },
            url: "@Url.CompanyChartEvent()"
        })
        .done(function (data) {
            for (var i = 0; i < data.length; i++) {
                if (data[i][1] == "31") {
                    var e0 = {
                        date: new Date(data[i][0]),
                        type: "sign",
                        backgroundColor: "#85CDE6",
                        graph: closeGraph,
                        text: "D",
                        description: "temporary",
                        url: "https://www.google.com/",
                        urlTarget: "_blank"
                    };
                    dividendEventData.push(e0);
                }
            }
        });

股息事件数据就是这种格式。

[["Sunday, 18, Dec, 2016",31],["Thursday, 24, Dec, 2015",31],["Thursday, 11, Dec, 2014",31],["Thursday, 19, Dec, 2013",31],["Saturday, 22, Dec, 2012",31],["Saturday, 24, Dec, 2011",31],["Tuesday, 22, Feb, 2011",31],["Tuesday, 19, Jan, 2010",31],["Saturday, 29, Nov, 2008",31],["Wednesday, 20, Feb, 2008",31],["Tuesday, 27, Feb, 2007",31],["Monday, 28, Mar, 2005",31]]

然后我像这样将股息事件数据添加到我的图表中。

simpleDataSet.stockEvents = dividendEventData;
                setTimeout(function () {
                    $("#chartcurtain").hide();
                    chart.validateData();
                }, 1000);

我的图表是这样的。 Chart Image

我的图表一次可以正常工作并显示说明。但是在下次重新加载后,当我将鼠标悬停在事件图标上时,它不会显示描述,并且它给出了我之前在控制台中提到的错误。我已经删除了我的 cookie 并验证了从 ajax 调用返回的数据总是相同的。我关注了this stackoverflow thread,但仍然是同样的错误。

【问题讨论】:

    标签: javascript charts amcharts typeerror


    【解决方案1】:

    当您第一次初始化图表时,它需要 data/config 作为 JavaScript 对象和数组。然后它继续将简单的 JS 对象转换为适当类的实例。

    在股票事件的情况下,它将stockEvents 对象数组转换为StockEvent 实例数组。

    这就是您的图表第一次工作的原因。

    现在,当您向已经初始化的图表添加事件时,您基本上是在向stockEvents 数组添加一个基本对象。现在,当您这样做时,您最终会得到一组混合的 StockEvent 实例和基本对象。

    这次对象没有转换成StockEvent实例,因此出现异常。

    您需要做的是将一个新事件实例化为StockEvent,然后将该实例推送到stockEvents

    类似这样的:

    var e0 = new AmCharts.StockEvent();
    e0.date = new Date(data[i][0]);
    e0.type = "sign";
    e0.backgroundColor = "#85CDE6";
    e0.graph = closeGraph;
    e0.text = "D";
    e0.description = "temporary";
    e0.url = "https://www.google.com/";
    e0.urlTarget = "_blank";
    dividendEventData.push(e0);
    

    这应该会解决它。

    这是一个工作示例:

    var chart = AmCharts.makeChart("chartdiv", {
      "type": "stock",
      "theme": "light",
    
      "categoryAxesSettings": {
        "minPeriod": "mm"
      },
    
      "dataSets": [
        {
          "fieldMappings": [
            {
              "fromField": "value",
              "toField": "value"
            }
          ],
          "dataProvider": generateChartData(),
          "categoryField": "date"
        }
      ],
    
      "panels": [
        {
          "stockGraphs": [
            {
              "valueField": "value",
              "type": "smoothedLine"
            }
          ]
        }
      ],
    
      "chartCursorSettings": {
        "valueBalloonsEnabled": true
      }
    });
    
    function generateChartData() {
      var chartData = [];
      var firstDate = new Date(2012, 0, 1);
      firstDate.setDate(firstDate.getDate() - 1000);
      firstDate.setHours(0, 0, 0, 0);
    
      for (var i = 0; i < 1000; i++) {
        var newDate = new Date(firstDate);
        newDate.setHours(0, i, 0, 0);
    
        var a = Math.round(Math.random() * (40 + i)) + 100 + i;
    
        chartData.push({
          date: newDate,
          value: a
        });
      }
      return chartData;
    }
    
    function test() {
      var dividendEventData = [];
      for (var i = 0; i < 5; i++) {
        var r = Math.floor(Math.random() * 1000);
        var e0 = new AmCharts.StockEvent();
        e0.date = new Date(chart.dataSets[0].dataProvider[r].date);
        e0.type = "sign";
        e0.backgroundColor = "#85CDE6";
        e0.graph = chart.panels[0].stockGraphs[0];
        e0.text = "D";
        e0.description = "temporary";
        e0.url = "https://www.google.com/";
        e0.urlTarget = "_blank";
        dividendEventData.push(e0);
      }
      chart.dataSets[0].stockEvents = dividendEventData;
      chart.validateData();
    }
    #chartdiv {
    	width: 100%;
    	height: 200px;
    }
    <script src="//www.amcharts.com/lib/3/amcharts.js"></script>
    <script src="//www.amcharts.com/lib/3/serial.js"></script>
    <script src="//www.amcharts.com/lib/3/themes/light.js"></script>
    <script src="//www.amcharts.com/lib/3/amstock.js"></script>
    <div id="chartdiv"></div>
    <input type="button" value="add event" onclick="test();" />

    这是相同的 CodePen 版本: https://codepen.io/team/amcharts/pen/c37ef299206c6ab5a09c15b0f665e6f0?editors=0010

    【讨论】:

    • 请查看这里的错误和代码详情> Image
    • 我发布了一个更新的特色工作演示。你会看到我的代码在那里运行良好。 (点击“添加事件”)。要检查的一件事是您是否正在运行最新版本的股票图表。 (3.21.2) 如果不是,请尝试升级以查看是否可以解决问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2015-01-06
    • 2017-07-26
    • 2019-02-26
    • 2021-12-25
    相关资源
    最近更新 更多