2012-10-30 10 views
10

私は(むしろ単純な)質問があります:D3.jsによる選択に対してforce.dragを "解除"する方法は?私は要素のセットを作成し、その上に "コール"を呼び出し、力に基づくレイアウトのドラッグコールバックを与えているとしましょう。これは次のようになりました。D3.js:選択肢からforce.dragを削除する

d3.selectAll('rect').call(force.drag); 

これで、後でノードの一部からその動作を削除することが可能になります。私のアプローチには、「クリック」、「ドラッグ」など、さまざまなリスナーをリセットする方法が含まれていました。いずれも機能しませんでした。誰かがコールバックを削除する方法を知っていますか?

答えて

19

あなたは近くにいます。ドラッグイベントはmousedownイベントによって開始され、dragという名前空間があります。参照:だからhttps://github.com/mbostock/d3/blob/master/src/behavior/drag.js#L5

を、これを削除するためにあなたができる:

d3.select('rect#no-drag').on('mousedown.drag', null); 
+0

これを完全に解決すると、私はそれを試してみました。 D3.jsでイベントの名前空間がデフォルトで設定されていますか? – user654123

+0

はい。また、独自のイベントリスナーを追加する場合は、それらの名前空間を使用することができます。彼らは、同じイベントを聞いている複数のリスナーを使用することを可能にします。 – nautat

+0

私はすでにjQueryプラグイン開発の名前空間付きイベントに精通していました。 D3.jsでは、修飾されたイベントごとに1つのコールバックしか登録できないように見えるので、名前空間には意味があります。再度、感謝します。 – user654123

1

この行は何とかそれはだないモバイル互換(クローム/アンドロイド)

d3.select('rect#no-drag').on('mousedown.drag', null); 
2

この質問はどのように求めていませんドラッグ要素をきめ細かくコントロールしていますが、条件に基づいてドラッグのオン/オフを切り替える方法を探していました。また、質問者はコメント内でドラッグを取り除いた後に戻す方法を尋ねました。

したがって、条件付きでドラッグイベントを許可する方法をお探しの場合は、drag.filterを使用してください。

drag.filterは、ブール値を返す必要があるコールバックを受け取ります。コールバックがtrueを返した場合はドラッグが行われ、そうでない場合はドラッグがトリガーされません。

これは、選択範囲からドラッグを削除してから、再度適用するよりもはるかにクリーンです。

+0

あなたは遅刻しています。'、 '__onmousedown.drag')['_']; 'それから後で復元します:' d3.selectAll( 'rect#no-drag'あなたのコメントは大変感謝しています。 – user654123

関連する問題