【问题标题】:How do I capture keystroke events in D3 force layout?如何在 D3 强制布局中捕获击键事件?
【发布时间】:2013-02-22 01:49:48
【问题描述】:

我想响应针对我的力布局中节点的击键事件。我已经尝试添加我能想到的“keystroke”、“keypress”、“keyup”、“keydown”的所有变体,但它们都没有触发。我的鼠标事件触发得很好。我在 d3 源中找不到任何击键事件....有没有办法捕获击键?

        nodes.enter().append("circle")
            .on("click", function(d) { return d.clickHandler(self); })
            .on("mouseover", function(d) { return d.mouseOverHandler(self); })
            .on("mouseout", function(d) { return d.mouseOutHandler(self); })
            .on("keyup", function(d) { 
                console.log("keypress", d3.event); // also tried "keyup", "keydown", "key"
            })
            .classed("qNode", true)
            .call(force.drag);

【问题讨论】:

    标签: d3.js force-layout


    【解决方案1】:

    我认为这里的问题是您试图将键盘事件添加到不可聚焦的元素,尝试将keydown 事件添加到可聚焦元素(在本例中为主体):

    d3.select("body")
        .on("keydown", function() { ...
    

    在这里您可以使用d3.event 的属性,例如d3.event.keyCode,或者对于更特殊的情况,d3.event.altKeyd3.event.ctrlKeyd3.event.shiftKey 等。

    查看KeyboardEvent Documentation 也可能会有所帮助。

    我在这里做了一个简单的键盘交互:http://jsfiddle.net/qAHC2/292/

    您可以通过创建一个变量来“选择”当前对象来扩展它以将这些键盘交互应用到 svg 元素:

    var currentObject = null;
    

    然后在适当的鼠标事件方法中更新这个当前对象引用:

    .on("mouseover", function() {currentObject = this;})
    .on("mouseout", function() {currentObject = null;});
    

    现在您可以在之前设置的键盘交互中使用此当前对象。

    这是一个实际的 jsfiddle:http://jsfiddle.net/qAHC2/295/

    【讨论】:

    • 这工作正常,但它并没有让我了解我想要操纵的元素。当击键事件发生时,我如何知道光标下的是哪个 SVG 元素?
    • 为此,我建议在您的元素上添加一个mouseover 事件监听器,然后在该函数中测试按键,尽管我不确定这是一个理想的解决方案
    • 这就是我的问题:如何在不重建整个事件处理基础架构的情况下测试 mouseover 事件中的按键?
    • 我已经在我的答案中添加了你的意思,如果不是这样,请考虑修改问题
    • 明确的答案、相关文档的链接和活生生的例子。可惜,我只能给你一票。
    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 2011-05-13
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多