处理NVD3图表的javascript事件

处理NVD3图表的javascript事件,javascript,eclipse,d3.js,swt,nvd3.js,Javascript,Eclipse,D3.js,Swt,Nvd3.js,我正在将NVD3集成到基于EclipseSWT的应用程序中,我希望将图表的Javascript事件委托给嵌入Java代码(publishEventJavaSide和logToJavaContainer)。这非常适合重定向element单击事件。element单击的代码如下所示: nv.addGraph(function () { try { function generateChart() { return nv.models.discreteBa

我正在将NVD3集成到基于EclipseSWT的应用程序中,我希望将图表的Javascript事件委托给嵌入Java代码(publishEventJavaSide和logToJavaContainer)。这非常适合重定向
element单击事件。
element单击的代码如下所示:

nv.addGraph(function () {
    try {
        function generateChart() {
            return nv.models.discreteBarChart()
                .x(function (d) {
                    return d.name
                })
                .y(function (d) {
                    return d.value
                })
                .staggerLabels(false)
                .tooltips(true)
                .showValues(true);
        }

        var chart = generateChart();
        chart.dispatch.on('elementClick', function (e) {
            publishEventJavaSide('elementClick', JSON.stringify(e, jsonCensor));
        });
        logToJavaContainer('TRACE', 'The JSON Data to be displayed in the chart sent by the server is the following: \n' + JSON.stringify(JSON.parse(generateData()), null, 4));
        d3.select('#chart svg').datum(JSON.parse(generateData())).transition().duration(500).call(chart);
        nv.utils.windowResize(chart.update);
        return chart;
    } catch (e) {
        logToJavaContainer('ERROR', 'Error while running chart creation function' + JSON.stringify(e, ["message", "arguments", "type", "name", "stack"]));
    }
});
在浏览了源代码之后,我想,
chartClick
elementDblClick
elementMouseover
elementMouseout
的任何一个都应该像
elementClick
一样工作。但实际上,它们都不起作用。如果我为
elementDblClick
尝试以下代码(仅更改事件名称):

它不起作用。包装捕获捕获到来自行
chart.dispatch.on('elementDblClick',function(e)
)的以下错误:

运行图表创建功能时出错{ “消息”:“无法调用未定义的“on”方法”, “名称”:“类型错误”, “堆栈”: TypeError:无法调用未定义的 在d3_调度处(http://127.0.0.1:10080/chart:1132:78) 在Object.eval[作为生成](eval 在(eval) 在(http://127.0.0.1:10080/rwt-参考资料/rap client.js:54872:27),:12:16) 在http://127.0.0.1:10080/chart:10440:21" }
参考
图表.dispatch
肯定不是未定义的(我用警报检查了一下,它是
Object
),它来自某个地方的d3代码。我也非常确定,我的集成与此无关。我只能找到
元素click
的示例

我不是Javascript、D3或NVD3专家,请耐心听我解释。

您可以尝试:

chart.discretebar.dispatch.on("elementClick", function(e) {
    console.log('elementClick', e);
});

工作非常完美。只有chartClick不起作用,但实际上它不会太打扰我。你是怎么知道的?如何从源代码中看到它的?我明白了。从源代码中可以看到。“nv.models.discreteBar=function(){…”。好的。
Error while running chart creation function{
    "message":"Cannot call method 'on' of undefined",
    "name":"TypeError",
    "stack":
        "TypeError: Cannot call method 'on' of undefined
            at d3_dispatch.on (http://127.0.0.1:10080/chart:1132:78)
            at Object.eval [as generate] (eval 
            at <anonymous> (eval 
            at <anonymous> (http://127.0.0.1:10080/rwt-resources/rap-client.js:54872:27)), <anonymous>:12:16)
            at http://127.0.0.1:10080/chart:10440:21"
    }
chart.discretebar.dispatch.on("elementClick", function(e) {
    console.log('elementClick', e);
});