0

我想在鼠标悬停事件上添加每个 dataLabel (只需将其称为“highlightPoint()”)函数。如果我将此功能添加到一个点,它就可以工作。

chartObj.series[0].data[1].dataLabel.on("mouseover", function () {
                chartObj.series[0].data[1].setState('hover');
            });

如果我循环抛出我的数据点,它就不起作用。我猜对每个单独点的引用都不正确或类似的东西。

jsfiddle-链接

4

2 回答 2

1

在您遍历两个数据集后,i = 2 和 k = 1。所以鼠标事件总是试图使用 i=2 和 k=1 来访问数据点,这当然是越界了。看到这个小提琴:http: //jsfiddle.net/bLvfS/1/

for (var i = 0; i < chartObj.series.length; i++) {
    for (var k = 0; k < chartObj.series[i].data.length; k++) {
        var onmouseover = function(u, j) {
            return function() {chartObj.series[u].data[j].setState('hover');};
        }
        var onmouseout = function(u, j) {
            return function() {chartObj.series[u].data[j].setState();};
        }
        chartObj.series[i].data[k].dataLabel.on("mouseover", onmouseover(i,k));
        chartObj.series[i].data[k].dataLabel.on("mouseout", onmouseout(i,k));
    }
}

我添加了传递当前 i,k 对并返回要在鼠标事件上运行的实际函数的函数。也许有人有更好的解决方案......但它似乎工作。

于 2013-08-16T21:03:18.443 回答
1

问题在于闭包,请参阅工作小提琴:http: //jsfiddle.net/Fusher/bLvfS/2/

        for (var i = 0; i < chartObj.series.length; i++) {
            for (var k = 0; k < chartObj.series[i].data.length; k++) {
                (function(i,k){
                    chartObj.series[i].data[k].dataLabel.on("mouseover", function () {
                        chartObj.series[i].data[k].setState('hover');
                    });
                    chartObj.series[i].data[k].dataLabel.on("mouseout", function () {
                        chartObj.series[i].data[k].setState();
                    });
                })(i,k);
            }
        }
于 2013-08-19T08:24:47.973 回答