javascript - 使用 d3.dispatch 在 d3 组件之间广播事件

标签 javascript svg d3.js

我目前正致力于创建一个可重用的 d3 组件库,并希望创建一个“交互层”组件,该组件基本上在我的可视化上创建一个 svg 矩形,然后将与它的交互广播到其他监听这些交互的组件,即。鼠标悬停、鼠标移动、单击等

我一直在遵循 Mike Bostock 的可重用 d3 图表模式 (http://bost.ocks.org/mike/chart/),虽然我可以在每个组件内部创建一个调度程序以在内部调度事件,但我无法成功地让单独的组件监听另一个组件的调度事件。所以基本上我想要一个用于我的库的调度程序,所有组件都可以在使用时进行监听。

我进行了大量搜索,但没有找到答案,甚至没有找到有关如何执行此操作的提示,如果有人有任何想法,我们将不胜感激。

最佳答案

这是一种将事件直接与 d3 组件相关联的方法,而不是强制您在全局命名空间中注册每个事件。

广播事件的组件可能如下所示:

namespace.interactiveLayer = function() {

    dispatch = d3.dispatch('myEvent'); 

    me = function() {
        // ...
        svg.on('click', function() {
          pos = d3.mouse(this);
          dispatch.myEvent(pos);
        });
    };

    me = d3.rebind(me, dispatch, 'on')

    return me;
};

监听事件的组件可能如下所示:

namespace.listenerLayer = function() {

    me = function() {
        interactive = namespace.interactiveLayer();
        d3.select("body").call(interactive);
        interactive.on('myEvent', function(d) {
            alert('You clicked on ' + d);
        });
    };

    return me;
};

我提出了一个充实的 working example here .

关于javascript - 使用 d3.dispatch 在 d3 组件之间广播事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082893/

相关文章:

javascript - 将 <div> 大小设置为与窗口相同?

javascript - 换行符在 html 的文本区域中打印为空白。我该如何解决

javascript - 我使用 Raphael 的动画滞后,为什么?

javascript - 为 d3.js 可折叠树设置背景

javascript - 使用正则表达式检查是否存在新行

javascript - 我可以写一个JS函数: returns as a normal function would or wait and return AJAX results?

javascript - 1 个 svg 中的多个力导向图(文本显示问题)

firefox - 在 Firefox 中转换 SVG 的原点

javascript - DC.js 等值线 map CSS 与颜色冲突,没有 map 显示。如何关闭填充:none?

d3.js - D3 : display graph in tooltip