score:7

Accepted answer

for a quick fix, you can move the range above the overlay and manually call the overlay event handlers from the range.

http://jsfiddle.net/rk5hp/

 svg.append("rect")
      .attr("class", "overlay")
      .attr("width", width)
      .attr("height", height)
      .on("mouseover", function() { focus.style("display", null); })
      .on("mouseout", function() { focus.style("display", "none"); })
      .on("mousemove", mousemove);

  // move range above overlay and call the overlay event handlers from there
  svg.append("rect")
      .attr("id", "range")
      .attr("class", "range")
      .attr("x", left)
      .attr("width", wid)
      .attr("height", height)
      .on("mousemove", mousemove)
      .on("mouseout", function() { focus.style("display", "none"); })
      .on("mouseover", function() {
          focus.style("display", null);
          // event handling for range mouseover (alert broke mouse move)
          console.log("i can see you!");
      });

bubbling acts at the dom level, and since there is no way to have a rect be a child of another rect, bubbling will not take care of this for you. grouping the elements together and placing a handler that checks the event target on the group will keep you from registering the event handler twice, but suffers from the same basic problem: when elements overlap, whichever element is declared last in the source order will get the event.

score:0

all above answers are right but i wanted to give another example:

    let log = console.log
let data = []
let pointstart = document.queryselector("svg").createsvgpoint()
let pointstop = document.queryselector("svg").createsvgpoint()
let divlog = d3.select("#log")
var svg = d3.select("svg")

var linearfn = d3.line()
  .x(d => d.x)
  .y(d => d.y)
  .curve(d3.curvelinear)

function logtagname(eventname, tagname) {
  divlog.html(divlog.html() + eventname + " : " + tagname + "<br/>")
}

svg.on("click", function() {
    log("tagname: ", event.target.tagname)
    logtagname("svg click", event.target.tagname)
    pointstart.x = event.x - 8
    pointstart.y = event.y - 8

    data.push({
      x: pointstart.x,
      y: pointstart.y
    })

    svg.selectall("path") // svg içinde tanımlı path elemanlarını bul
      .data([1]).enter() // 1 elemanlı dizinin eleman sayısı kadarı için enter()
      .append('path') // dizi elemanı kadar path oluştur
      .attr("fill", "none")
      .attr("stroke", "black")
      .attr("stroke-width", 8)
      .attr("d", linearfn(data))
      .on("click", function() {
        log("tagname: ", event.target.tagname)
        logtagname("path click", event.target.tagname)
        /* click event will start from path and pass to the svg element */
        // event.stoppropagation(); // letting pass event bubbling 
      })

    svg.selectall("circle")
      .data(data)
      .enter()
      .append("circle")
      .attr("cx", d => d.x + .5)
      .attr("cy", d => d.y + .5)
      .attr("r", 20)
      .attr("stroke-width", 3)
      .attr("stroke", "red")
      .attr("cursor", "move")
      .style("fill", "transparent")
      .attr("pointer-events", "all") // when clicked in/outside of circle, it'll handle events
      .on("mouseover", function() {
        log("over oldu")
        d3.select(this).style("stroke", "blue");
      })
      .on("mouseout", function() {
        log("out oldu")
        d3.select(this).style("stroke", "red");
      })
      .on("click", function() {
        event.stoppropagation(); // not letting pass event bubbling
        event.preventdefault();
        log("click oldu")
        d3.select(this).style("stroke", "black");
      })
  })
  .on("mousemove", function() {
    // fare hareketinde de çizdireceğiz ama x,y noktasını 
    // tıklanıncaya kadar diziye eklemeyeceğiz
    pointstop.x = event.x - 8
    pointstop.y = event.y - 8

    svg.select("path")
      .attr("d", linearfn(data.concat({
        x: pointstop.x,
        y: pointstop.y
      })))
  })

https://jsfiddle.net/jsfiddlecem/hnsu68jw/

score:16

you can also use the following style, to "hide" certain svg elements for mouse events. in my case, it was the mouseover event, that i wanted to bubble through:

pointer-events: none;

Related Query

More Query from same tag