Nvd3.jsを使用しており、クリックイベントを追加しようとしています
d3.selectAll(".nv-bar").on('click', function () {console.log("test");});
どうやってやるの ?
私は同じ問題に遭遇し、ドキュメントがないためにNVD3をすべてダンプしようとしていました... addGraph()にコールバック関数を追加する必要があります。また、d3.select()の代わりにd3.selectAll()にも注意してください。
幸運を。
nv.addGraph(function() {
var chart = nv.models.multiBarHorizontalChart()
.x(function(d) { return d.label })
.y(function(d) { return d.value })
.margin({top: 5, right: 5, bottom: 5, left: 5})
.showValues(false)
.tooltips(true)
.showControls(false);
chart.yAxis
.tickFormat(d3.format('d'));
d3.select('#social-graph svg')
.datum([data])
.transition().duration(500)
.call(chart);
nv.utils.windowResize(chart.update);
return chart;
},function(){
d3.selectAll(".nv-bar").on('click',
function(){
console.log("test");
});
});
これが同様に機能することがわかりました(少なくともマルチバーチャートの場合)。
chart.multibar.dispatch.on("elementClick", function(e) {
console.log(e);
});
調べるには、src/multibar.jsのソースを確認する必要がありました。そこにあるので、これは意図された方法だと思います。しかし、私はアレックスが彼の答えで言ったことを2番目に言います:NVD3のためのドキュメンテーションの欠如は本当に大きな欠点です。プロジェクトの一般的なアイデアが素晴らしいので、これは悲しいことです。すべての詳細に立ち入ることなく、D3の力を私たちに与えてください...
ここで3つのポイントがあります。
1)ドキュメントがないため、ソースコードを確認する必要があります。
2)すべてのグラフにはツールチップがあります。これは、ソースコードでイベントがすでに発生していることを意味します。
3)構成オブジェクト(ドキュメント内)をソースコードのロードマップとして使用します。
すなわち。
var config = {chart: {type: 'multiChart',xAxis:{},yAxis{}}
Nvd3/nv.d3.jsファイルを開く
Ctrl + F +グラフの種類。この場合は 'multiChart'です。
Nv.models.multiChartが表示されます。
下にスクロールしてツールチップイベントを探します。必要なドキュメントが見つかります。
lines1.dispatch.on('elementMouseout.tooltip', function(evt) {tooltip.hidden(true) });
stack1.dispatch.on('elementMouseout.tooltip', function(evt) {tooltip.hidden(true) });
bars1.dispatch.on('elementMouseout.tooltip', function(evt) {tooltip.hidden(true) });
したがって、独自のイベントを作成するには...
var config = {chart: {type: 'multiChart',
bars1: {
dispatch:{
elementClick:function(e){//do Stuff}
},
xAxis:{},yAxis{}
}
AngularJSを使用している場合は、app.js
。
$scope.$on('elementClick.directive', function(angularEvent, event){
console.log(event);
});
このcoderwallブログ は正しい方向に向かっています。
chr.scatter.dispatch.on('elementClick', function(event) { console.log(event); });
未定義のエラーを回避するには、console.log(e.data)の代わりにconsole.log(e)を使用してください。
これは私のために働きました:(e.target .dataは、x、yのような、その要素にアタッチされたデータ属性を出力します)
$(document).on("click", "#chart svg", function(e) {
console.log (e);
console.log (e.target.__data__);
});
コントローラーのオプションにコールバックを追加するだけです。BarChartを使用している場合は、マルチバーをディスクリートバーに置き換えます。
$scope.options = {
chart: {
type: 'multiBarHorizontalChart',
height: 450,
x: function(d){return d.label;},
y: function(d){return d.value;},
showControls: true,
showValues: true,
duration: 500,
xAxis: {
showMaxMin: false
},
yAxis: {
axisLabel: 'Values',
tickFormat: function(d) {
return d3.format(',.2f')(d);
}
},
callback: function(chart) {
chart.multibar.dispatch.on('elementClick', function(e){
console.log('elementClick in callback', e.data);
});
}
}
};
jQueryはこれを簡単にします:
$( ".nv-bar" ).click(function() {
console.log("test");
});
$('.nv-pie .nv-pie .nv-slice').click(function(){
temp = $(this).text();
alert(temp);
})
これは円グラフでも問題なく機能します。同様に、他のグラフでも同様に処理できます。
積み上げ面グラフの場合、interactiveGuideline
を無効にし、elementClick.area
を使用する必要があります。
chart.useInteractiveGuideline(false);
chart.stacked.scatter.dispatch.on("elementClick.area", function(e) {
console.log(e);
});