次のd3ビジュアライゼーションがあります。上部の暗い色は、ノードが選択されたことを示します。選択されていないノードにマウスを合わせると不透明度が変わるため、クリックするとどのノードが選択されるかをユーザーが確認できます。
これは、CSSスタイルシートと次のjs / d3を介して実現されます。
nodeSelection.select("circle").on('mouseover', function(e) {
d3.select(this).classed("hover", true);
_this.fireDataEvent("mouseOverNode", this);
});
nodeSelection.select("circle").on('mouseout', function(e) {
d3.select(this).classed("hover", false);
_this.fireDataEvent("mouseOutNode", this);
});
ここまでは順調ですね。ただし、ドラッグすると、ドラッグ機能によって、ドラッグしていないノードでマウスオーバーイベントとマウスアウトイベントがランダムにトリガーされるように見えます。これにより、ノードの不透明度がちらつきます。Chromeの開発ツールを見ると、これはノードがクラス「ホバー」を取得しているためであることがわかります。このCSSクラスを追加する上記のコードは他のどこにも表示されません。コンソールログを使用して、mouseoverイベントとmouseoutイベントが発生していることを確認しました。これらのノードは、多くの場合、カーソルから遠く離れています。
この問題はFirefoxでは発生しません。
更新:私は実際にこれを投稿した直後にこれを修正することができました。ドラッグスタート内でリスナーの登録を明示的に解除し、ドラッグエンドで再登録します。彼らが同様の問題を抱えているならば、それはまだ何人かの人々にとって興味深いかもしれません。
ドラッグ機能は次のようになります。
var drag = d3.behavior.drag()
.on("dragstart", function(d) {
console.log("dragstart");
d.dragstart = d3.mouse(this); // store this
d.fixedbeforedrag = d.fixed;
d.fixed=true;
// deregister listeners
nodeSelection.select("circle").on("mouseover", null).on("mouseout", null);
})
.on("drag", function(d) {
d.px = d.x; // previous x
d.py = d.y;
var m = d3.mouse(this);
d.x += m[0] - d.dragstart[0];
d.y += m[1] - d.dragstart[1];
nodeSelection.attr("transform", "translate(" + [d.x, d.y] + ")");
_this.getForce().start();
})
.on("dragend", function(d) {
console.log("dragend");
delete d.dragstart;
d.fixed = d.fixedbeforedrag;
//reregisters listeners
_this.updateSVG();
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加