d3/d3-brush

Cannot avoid brush selection reset

AlainRo opened this issue · 1 comments

A click in the extent outside the selection rectangle reset the 2D brush selection to null. Fair enough.
But is it possible to take control of this behavior which occurs before the brush start event ??

This issue can be seen in this example:
http://bl.ocks.org/AlainRo/9264cd08e341f2c92f020c39642c34d1

As I like to say, everything is possible, it’s just a question of how much work is involved. You have a few options:

  • Remove the overlay element from the brush after applying it.
svg.append("g")
    .attr("class", "brush")
    .call(d3.brush().on("brush", brushed))
  .selectAll(".overlay")
    .remove();
  • Register a listener that takes priority for input events that would initiate a brush gesture, namely mousedown or touchstart. See d3/d3-zoom#66 (comment) for a related discussion of event propagation; probably the easiest thing is to use a capturing event listener and then call event.stopImmediatePropagation (or event.stopPropagation) to prevent the brush from receiving the initiating input event.
  • Use brush.filter to tell the brush to ignore input events on the overlay (using event.target to detect the receiving element; see brush.js), so that they won’t start a brush gesture.
  • Use a start brush event listener to set the brush selection to something other than null as desired. See Brush Snapping II for an example, although note that this doesn’t snap the brush on start (because it intentionally preserves the normal brush behavior of letting you clear the brush selection by clicking on the background).

If you have further questions, please use Stack Overflow tag d3.js to ask for help. Although I make an effort to assist everyone that asks, I am not always available to provide help promptly or directly. Stack Overflow provides a better collaborative forum for self-help: tens of thousands of D3-related questions have already been asked there, and some answered questions may be relevant to you.

If you have a question about D3’s behavior and want to discuss it with other users, also consider the d3-js Google Group or joining the d3-js Slack.

Thank you! 🤗