javascript - 如何捕获多层鼠标事件?

标签 javascript d3.js pointer-events

现在我正在努力解决一个问题。请看下面的代码,我想实现两个功能,一个是缩放容器(即缩放容器中的所有节点),第二个是提醒容器中节点的id,当鼠标悬停在其上方。

但是,当我将 rect 的“pointer-event”值设置为 all 时,缩放效果很好,但节点无法捕获鼠标悬停事件。当我将该值设置为“none”时,节点可以捕获鼠标悬停事件,但缩放不起作用。看来“nodes”和“rect”位于不同的层,因此无法同时捕获事件。

有人知道如何解决这个问题吗?提前致谢。

    var zoom = d3.behavior.zoom()
        .scaleExtent([0.1, 10])
        .on("zoom", zoomed);
    function zoomed() {
        container.attr("transform", "translate(" + d3.event.translate +")scale(" + d3.event.scale +")");
    }

    var container = svg.append("g");
    var rect = svg.append("rect")
        .attr("width", width/2)
        .attr("height", height)
        .style("fill", "none")
        .style("pointer-events", "all")
        .call(zoom);
    var node = container.append("g")
        .attr("class", "nodes")
        .selectAll(".node")
        .data(nodes)
        .enter().append("g")
        .attr("class", "node")
        .attr("id",function(d){return d.userID});
    node.on("mouseover", function(d) {      
        alert(d.userID);
    });        

最佳答案

问题是,您将容器 div 附加到背景矩形之前。在这种情况下,鼠标事件的目标将是矩形,因为容器组和节点位于该元素下方。试试这个代码。

var zoom = d3.behavior.zoom()
    .scaleExtent([0.1, 10])
    .on("zoom", zoomed);

function zoomed() {
    container.attr("transform", "translate(" + d3.event.translate +")scale(" + d3.event.scale +")");
}

var rect = svg.append("rect") //Append background rect first
    .attr("width", width/2)
    .attr("height", height)
    .style("fill", "none")    
    .style("pointer-events", "all")    
    .call(zoom);

var container = svg.append("g"); //Then append the container group

var node = container.append("g")
    .attr("class", "nodes")
    .selectAll(".node")
    .data(nodes)
    .enter().append("g")
    .attr("class", "node")
    .attr("id",function(d){return d.userID});

node.on("mouseover", function(d) {      
    alert(d.userID);
});       

关于javascript - 如何捕获多层鼠标事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28163639/

相关文章:

javascript - 图像 map 上的 onmouse Enter 和 onmouseleave 无法在 IE11 或 Edge 中正确触发,但可以在其他浏览器中使用

javascript - 鼠标悬停事件上的 clearTimeout 未从 Mouseout 事件中清除 setTimeout

javascript - XML3D css 转换与自定义转换属性

javascript - d3.js 仅应打开根及其子项

d3.js - D3.js:获取所选选项的值(value)?

javascript - Prop 验证中缺少 React eslint 错误

javascript - Firebase 函数返回 "Response is not valid JSON object."

javascript - 判断我的选择是否包含任何现有元素的正确方法

jquery - jquery ui Accordion 的指针事件