D3で、次のようなドラッグ関数を定義した場合:
var drag = d3.behavior.drag()
.on("drag", function () {alert("drag")})
.on("dragend", function () {alert("dragEnd")});
本当に次のことはできません。
d3.select("#text1")
.on("click", function(d,i) {alert("clicked")})
.call(drag);
理由は、「ドラッグ」が発生した後にクリックが発生するからです。私の意見では、ドラッグエンドとクリックの間に大きな違いがあるので、クリックするための別のイベントがあるはずです。
SVG要素内のドラッグイベントのクリックと終了を区別するための解決策は何ですか?
ドキュメント には、これに関するいくつかの明示的な例があります。
ドラッグ可能な要素に独自のクリックリスナーを登録する場合、次のようにクリックイベントが抑制されたかどうかを確認できます。
_selection.on("click", function() {
if (d3.event.defaultPrevented) return; // click suppressed
console.log("clicked!");
});
_
これは、直後のstopPropagation()
の例とともに、どのイベントを起動して処理するかを制御できます。
明確にするために、ドラッグエンドとクリックイベントを区別することは完全にあなた次第です。これを行う最も簡単な方法は、おそらくドラッグが行われたときにフラグを設定し、そのフラグを使用してdragend
またはclick
イベントを処理するかどうかを決定することです。
4.9.0以降、 .clickDistance()
があり、これを使用して、ドラッグを開始した場所からどの距離を移動した後、click
イベントを取得できなくなります。
ボタンを放す前にDOMから要素を削除すると(たとえば、click
ハンドラーで .raise()
を使用して)、drag
イベントが発生する可能性があることに注意してください。