javascript - d3 zoom 和 brush 同时工作

标签 javascript d3.js

我想知道如何同时处理缩放和画笔行为。

假设您有一个应用程序可以控制是否激活“选择区域”选项。如果激活,则当用户开始视觉选择时,预计会刷亮一组 SVG 元素。如果停用,则用户将移动一些 SVG 容器(平移)。

如何在不相互覆盖并使用状态正常工作的情况下声明两个 native d3 行为?或者,当用户想要不同的行为时,我必须销毁事件并声明新事件,反之亦然,这是唯一的解决方案吗?

或者,还有其他不同的方法吗?

我有一段代码如下:

var zoomer, brush;
zoomer = self.get('zoomer');

if (zoomer === undefined){
    self.set({zoomer: d3.behavior.zoom().translate([0,0]).scale(1)});
} else{
    self.zoomCurrent();
}

brush = self.get('brush');
if (brush === undefined) {
    self.set({brush: d3.svg.brush().x(d3.scale.identity().domain([0, self.get('config').width]))
        .y(d3.scale.identity().domain([0, self.get('config').height]))});
}


svgObject = d3.select(self.get('target')).append('svg')
    .attr('xmlns', 'http://www.w3.org/2000/svg')
    .attr('xlink', 'http://www.w3.org/1999/xlink')
    .attr('id', self.get('targetNoChar')+'SVG')
    .attr('width',self.get('config').width)
    .attr('height',self.get('config').height)
    .attr("pointer-events", "all")
    .call(self.get('zoomer').on("zoom", function (d) { self.zoomFunction(d3.event, this,d) }))
    .append('g')
        .attr('class', 'zoomer')
        .attr("pointer-events", "all")
    .append('g')
    .attr("pointer-events", "all");

d3.select('svg').append('g')
        .attr('class', 'brush')
        .attr("pointer-events", "all")
        .datum(function() { return { selected: false, previouslySelected: false};})
        .call(self.get('brush').on('brushstart', function (d) { self.brushStart(d3.event, this,d) })
            .on('brush', function (d) { self.brush(d3.event, this,d) })
            .on('brushend', function (d) { self.brushEnd(d3.event, this,d) }));

我如何处理 d3.behaviour.zoom 和 brush 而不会相互覆盖?

非常感谢。

最佳答案

找到的第一个解决方案:

最后,我的决定是在状态发生变化时重新声明事件定义,最终代码如下:

setAreaMode: function () {
        var self = this;

        if (self.get('selectAreaMode')===true) {
            self.setCursorToCrosshair();

            /* Deactivating zoom tool */
            self.get('zoomer').on('zoom', null);

            /* Adding brush to DOM */
            d3.select('svg').append('g')
                .attr('class', 'brush')
                .attr("pointer-events", "all")
                .datum(function() { return { selected: false, previouslySelected: false};});

            /* Attaching listeners to brush */
            d3.select('.brush').call(self.get('brush').on('brushstart', function (d) { self.brushStart(d3.event, this,d) })
                .on('brush', function (d) { self.brush(d3.event, this,d) })
                .on('brushend', function (d) { self.brushEnd(d3.event, this,d) })
            );
        } else if (self.get('selectAreaMode')===false) {
            self.setCursorToDefault();
            /* Activating zoomer */
            self.get('zoomer').on('zoom', function (d) { self.zoomFunction(d3.event, this,d) });

            /* Deactivating listeners brush tool */
            d3.select('.brush').call(self.get('brush').on('brushstart', null)
                .on('brush', null)
                .on('brushend', null));

            /* Removing brush from DOM */
            d3.select('.brush').remove();
        }
    }

还有其他想法吗?

关于javascript - d3 zoom 和 brush 同时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17108890/

相关文章:

javascript - D3 变焦设置

javascript - 文件更改时刷新页面

javascript - 如何使用 d3.js 将文本在 svg 图像上居中?

javascript - Angular Directive(指令)将范围隔离到未定义的父绑定(bind)

带有选择选项的 Javascript 搜索框

javascript - 如何在 d3.js 中使用 .scale 和 .translate?

javascript - 将图表的数据点与 x 轴上的刻度线对齐

javascript - 在选择某些东西之前隐藏 d3.chart 的详细信息

javascript - 如何实现类似google图片搜索的图片库

javascript - 接下来用 Express 进行 js 动态 API 调用