javascript - d3js 缩放事件处理程序未正确触发事件

标签 javascript d3.js

我正在使用 d3 版本 4.2.8 中的 d3.zoom() 函数在力图上移动。我希望鼠标指针更改为移动光标,只要我在图表上“拖动自己”即可。一旦我松开鼠标按钮,它就应该变回“十字准线”。

我使用了两个控制台日志来查看事件何时被触发。在控制台中它可以工作:当我单击并按住鼠标按钮时,它会显示“缩放开始”,一旦我离开它,它就会显示“缩放完成”。

唯一不起作用的是将光标更改为“移动”:虽然控制台显示“缩放开始”,但光标仍保持在“默认”位置。只有在我离开鼠标按钮后,它才会更改为“移动”(然后由于“缩放完成”触发而立即更改为“十字准线”)。

为什么控制台在正确的时间打印了消息,但是当我再次离开鼠标按钮后光标发生了变化?

// Prepare Zoom and Panning settings
var zoom = d3.zoom()
    .scaleExtent([.1, 10])
    .on("start", zoomBegin)
    .on("end", zoomFinish)
    .on("zoom", zoomed);

// View is needed as the new D3V4 zoom cannot be applied directly on the SVG but a group element    
var view = svg.append("g");

svg.call(zoom)
    //prevent triggering the zoom on dblclicks
    .on("dblclick.zoom", null);

function zoomed() {
  view.attr("transform", d3.event.transform);
}

function zoomBegin() {
    console.log("Zoom begin");
    body.style("cursor", "move");
}

function zoomFinish() {
    console.log("Zoom finish"); 
    //body.style("cursor", "crosshair");
}

最佳答案

正如我在评论中所说,我尝试了这个 here 。它适用于 IE11 和 Edge。如果我没有打开开发者工具,它也可以在 Chrome 中使用。如果开发工具打开,它将执行您所描述的操作。有一个关于它的真正的旧错误报告 here描述所有血淋淋的细节。

代码,因为没有它我就无法发布:)

function zoomBegin() {
  console.log("Zoom begin");
  svg.style("cursor", "move");
}

function zoomFinish() {
  console.log("Zoom finish");
  svg.style("cursor", "auto");
}

关于javascript - d3js 缩放事件处理程序未正确触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40222509/

相关文章:

javascript - 向访问者显示图像并从服务器中删除该图像(在同一页面加载时)

javascript - 关于闭包和函数作用域

javascript - 导致 Rect 元素调用鼠标悬停事件的文本元素

javascript - 如何制作带有嵌入 HTML 元素的 d3.js 工具提示

javascript - AngularJS 服务未定义 : Unknown provider: $scopeProvider <- $scope

javascript - 在哪里可以检索 Cognito 身份池的公钥?

javascript - 为什么 console.log 没有显示任何内容?

javascript - 在 d3 中应用缩放平移和轴重新缩放

select - 使用 d3.js 时,为什么在将新元素附加到条目选择时必须在 select 之后调用 selectAll?

javascript - 如何使用 d3.js 更改鼠标悬停时的图像