我最近迁移到D3 v4.10.2。我按照文档中的说明调用缩放行为,但是使用鼠标滚轮或触摸屏进行缩放时不会执行回调。我使用的是最新版本的chrome:
var some_svg = d3.select('body').select("#some-svg");
var some_svg_rect = some_svg.append("g").append("rect")
.attr("fill","none")
.attr("width",900)
.attr("height",400);
some_svg_rect.call(d3.zoom()
.on("zoom", function () {/*this code fails to execute*/}));
感谢在将“指针事件”设置为“全部”之后缩放正在工作但是拖动行为仅适用于拖动“启动”是否缺少?:
some_svg_rect.call(d3.drag()
.on("start", function () {/*this code works*/})
.on("drag", function () {/*this code fails toexecute*/})
.on("end", function () {/*this code fails to execute*/}));
答案 0 :(得分:3)
您的代码问题是SVG的默认pointer-events,其中包括:
当visibility属性设置为visible并且鼠标光标位于元素的内部(即' fill')和fill属性上时,元素只能是鼠标事件的目标设置为除了' none' 之外的值,或者当鼠标光标位于元素和笔划的周长(即' stroke')之上时attribute设置为none以外的值。 (强调我的)
但是,我建议你不要将填充设置为transparent
(正如other answer中所述),这通常是一个坏主意:尽管有些浏览器支持它,transparent
不是SVG规范的一部分。
而不是那样,只需将指针事件设置为visible
或all
:
.attr("pointer-events", "all")
这是一个演示(无耻地复制其他答案的代码)
var some_svg = d3.select('body').select("#some-svg");
var some_svg_rect = some_svg.append("g").append("rect")
.attr("fill", "none")
.attr("pointer-events", "all")
.attr("width", 400)
.attr("height", 250);
some_svg_rect.call(d3.zoom()
.on("zoom", function() {
console.log("zoom works")
}));

.as-console-wrapper { max-height: 20% !important;}
svg{
border: 1px solid gray;
}

<script src="https://d3js.org/d3.v4.min.js"></script>
<svg id="some-svg" width=400 height=250></svg>
&#13;
答案 1 :(得分:1)
而不是
.attr("fill","none")
使用
.attr("fill","transparent")
下面的工作代码
var some_svg = d3.select('body').select("#some-svg");
var some_svg_rect = some_svg.append("g").append("rect")
.attr("fill","transparent")
.attr("width",900)
.attr("height",400);
some_svg_rect.call(d3.zoom()
.on("zoom", function () {
console.log("hi")
}));
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg id="some-svg" width=1000 height=2000></svg>
&#13;