D3 svg点击事件和圆圈点击事件重叠
D3 svg click event and circle click event overlapping
我要解决的问题如下:
我创建了一个 500x500 像素的 svg。
在此 svg 中,我附加了一个半径为 50px 的圆。
我在圆圈上添加了一个点击事件,使其颜色变为红色。
我在 svg 的其余部分添加了一个点击事件,以便圆圈的颜色变为绿色。
这可能吗?
我已经尝试将点击事件放在 svg 上,它覆盖了整个 500x500px 以防止附加到圆圈的点击事件起作用。
有人提示我使用 stopPropagation,但没有成功。
var svg = d3.select("#cv")
.attr("height", 300)
.attr("width", 300)
.style("border", "1px solid red")
.on("click", function(d) {
circ.style("fill", "green")
});
var circ = svg
.append("circle")
.attr("r", 100)
.attr("cx", 100)
.attr("cy", 100)
.attr("stroke", "black")
.style("fill", "grey")
.on("click", function(d) {
circ.style("fill", "red")
});
#cv {
width: 300px;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="cv">
<defs>
<pattern id="image" x="0" y="0" patternUnits="userSpaceOnUse" height="200" width="200">
<image x="0" y="0" href="https://i.stack.imgur.com/skwGx.jpg" width="200" height="200"></image>
</pattern>
</defs>
</svg>
您可以为此使用一个技巧:附加一个与 SVG 尺寸相同的白色 rect
angle,然后向其添加点击监听器。确保先添加它,因为 SVG 没有 z-index
,而是通过在所有先前的项目上绘制每个项目来工作。所以你定义的第一项本质上是背景。
var svg = d3.select("#cv")
.attr("height", 300)
.attr("width", 300)
.style("border", "1px solid red");
var bg = svg.append("rect")
.attr("width", 300)
.attr("height", 300)
.attr("fill", "white")
.on("click", function(d) {
circ.style("fill", "green")
});
var circ = svg
.append("circle")
.attr("r", 100)
.attr("cx", 100)
.attr("cy", 100)
.attr("stroke", "black")
.style("fill", "grey")
.on("click", function(d) {
circ.style("fill", "red")
});
#cv {
width: 300px;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="cv">
<defs>
<pattern id="image" x="0" y="0" patternUnits="userSpaceOnUse" height="200" width="200">
<image x="0" y="0" href="https://i.stack.imgur.com/skwGx.jpg" width="200" height="200"></image>
</pattern>
</defs>
</svg>
我要解决的问题如下:
我创建了一个 500x500 像素的 svg。 在此 svg 中,我附加了一个半径为 50px 的圆。 我在圆圈上添加了一个点击事件,使其颜色变为红色。 我在 svg 的其余部分添加了一个点击事件,以便圆圈的颜色变为绿色。
这可能吗?
我已经尝试将点击事件放在 svg 上,它覆盖了整个 500x500px 以防止附加到圆圈的点击事件起作用。
有人提示我使用 stopPropagation,但没有成功。
var svg = d3.select("#cv")
.attr("height", 300)
.attr("width", 300)
.style("border", "1px solid red")
.on("click", function(d) {
circ.style("fill", "green")
});
var circ = svg
.append("circle")
.attr("r", 100)
.attr("cx", 100)
.attr("cy", 100)
.attr("stroke", "black")
.style("fill", "grey")
.on("click", function(d) {
circ.style("fill", "red")
});
#cv {
width: 300px;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="cv">
<defs>
<pattern id="image" x="0" y="0" patternUnits="userSpaceOnUse" height="200" width="200">
<image x="0" y="0" href="https://i.stack.imgur.com/skwGx.jpg" width="200" height="200"></image>
</pattern>
</defs>
</svg>
您可以为此使用一个技巧:附加一个与 SVG 尺寸相同的白色 rect
angle,然后向其添加点击监听器。确保先添加它,因为 SVG 没有 z-index
,而是通过在所有先前的项目上绘制每个项目来工作。所以你定义的第一项本质上是背景。
var svg = d3.select("#cv")
.attr("height", 300)
.attr("width", 300)
.style("border", "1px solid red");
var bg = svg.append("rect")
.attr("width", 300)
.attr("height", 300)
.attr("fill", "white")
.on("click", function(d) {
circ.style("fill", "green")
});
var circ = svg
.append("circle")
.attr("r", 100)
.attr("cx", 100)
.attr("cy", 100)
.attr("stroke", "black")
.style("fill", "grey")
.on("click", function(d) {
circ.style("fill", "red")
});
#cv {
width: 300px;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg id="cv">
<defs>
<pattern id="image" x="0" y="0" patternUnits="userSpaceOnUse" height="200" width="200">
<image x="0" y="0" href="https://i.stack.imgur.com/skwGx.jpg" width="200" height="200"></image>
</pattern>
</defs>
</svg>