D3树节点双击高亮文本

时间:2012-10-24 21:33:57

标签: javascript svg d3.js tree

我有一个树视图(类似于http://mbostock.github.com/d3/talk/20111018/tree.html),除了我将展开/收缩节点从单击更改为双击事件:

即代替

.on("click", function(d) { toggle(d); update(d); });

我正在使用:

.on("dblclick", function(d) { toggle(d); update(d); });

它运作良好。问题是双击会突出显示节点上的文本标签。它不会影响转换,但它非常烦人。有没有人知道一种阻止这种情况发生的方法,除了删除节点并在转换结束时将其添加回去?

BTW,我已经尝试添加

d3.event.preventDefault()

在双击事件中,它没有任何帮助。

2 个答案:

答案 0 :(得分:1)

Google返回了以下结果: http://chris-barr.com/index.php/entry/disable_text_selection_with_jquery/

该页面上的代码是

$(function(){
    $.extend($.fn.disableTextSelect = function() {
        return this.each(function(){
            if($.browser.mozilla){//Firefox
                $(this).css('MozUserSelect','none');
            }else if($.browser.msie){//IE
                $(this).bind('selectstart',function(){return false;});
            }else{//Opera, etc.
                $(this).mousedown(function(){return false;});
            }
        });
    });
    $('.noSelect').disableTextSelect();//No text selection on elements with a class of 'noSelect'
});

但是,在这种情况下,您可以将'.noSelect'替换为'.node',并且应该禁用所有节点的文本突出显示。

答案 1 :(得分:0)

如果您不想完全禁用文本选择(通常对用户来说更好),您可以通过selectSubString手动取消选择元素。

.on("dblclick", function(d) { 
    toggle(d); update(d);
    var text = d3.select(this).select("text")[0][0]
    text.selectSubString(0,0)
});

但是,由于SVG API在许多情况下尚未完全实现,因此尚未跨浏览器工作。 (至少在Chrome中有效)

更好的跨浏览器方式是重写文本。这通常也会导致选择:

g.on("dblclick", function(d) {
    toggle(d); update(d);
    var text = d3.select(this).select("text")
    var value = text.text()
    text.text(value)
})

至少可以在Firefox和Chrome中使用。