javascript - d3 : intercepting keydown events over specific elements

标签 javascript d3.js

我想识别特定 D3 元素上发生的按键事件。以下代码片段(此处为 JSFiddle )正确识别了鼠标悬停在各个 div 上以及全局按键事件,但似乎并未触发特定于 div 的按键处理程序(目前仅在 Chrome 上进行了测试)。最简单的方法是什么:

  1. 识别光标位于哪个 div/svg 上,或者
  2. 将按键处理程序附加到特定的 div/svg

_.each(_.range(2), function (i) {
    var svg = d3.select("#plot" + i).append("svg")
        .attr("width", 100)
        .attr("height", 100);

    svg.append("rect")
        .attr("fill", "red")
        .attr("x", 0)
        .attr("y", 0)
        .attr("width", 100)
        .attr("height", 100)
        .on("mouseover", function () { console.log("mouseover", i); })
        .on("keydown", function () { console.log("div key", i); });
});

d3.select("body").on("keydown", function () { console.log("global key"); });

谢谢!

编辑

作为后续,我想我可以捕获鼠标悬停处理程序中的 div ID,并使用它来识别全局 keydown 事件中的适当 div - 但我很好奇是否有更优雅或更惯用的解决方案。

最佳答案

*哦。您的编辑正是这个解决方案。是的,这可能是最好的处理方式。 *

您可能需要使用鼠标悬停处理程序来跟踪当前获得焦点的元素,然后使用页面监听器将事件委托(delegate)给该节点。

像这样:

var focused = null;
svg.append("rect").on("mouseover", function () { focused = this; })

然后在你的页面处理程序中:

d3.select("body").on("keydown", function () { d3.select(focused); /* then do something with it here */ });

关于javascript - d3 : intercepting keydown events over specific elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126232/

相关文章:

javascript - 如何计算 HTML 元素内容的可见高度和宽度?

javascript - 将文本标签添加到 Force directed Graph 中的 d3 节点并在悬停时调整大小

javascript - 你如何使用 Javascript 计算 HTML DOM 中的子节点?

javascript - 除了看,还有什么方法可以知道当前在 HTML 元素上应用了哪种字体

javascript - 在 D3.js 中重新排序 SVG ( z-index ) 的元素

javascript - 根据 D3 中的当前值更改 html 属性

javascript - 图表上的动态行数

javascript - 如何为 Windows 8 和 Android 平板电脑制作 D3js 应用程序的 Web 应用程序

Javascript- 使用字符串函数.replace 替换文本

javascript - 只有一个值传递到另一个 php 页面