Firefox点击事件错误

时间:2015-04-28 18:00:23

标签: javascript jquery firefox d3.js

我不确定如何为你们重新解决这个问题,但我会尽力向你解释。我有一个d3树布局结构。通过单击父级气泡应该扩展其子级,依此类推。在我的代码中,我目前有:

 // Enter any new nodes at the parent's previous position.
 var nodeEnter = node.enter().append("g")
   .attr("class", "node")
   .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
   .on("mousedown", function(d, event) { 
     if(event.ctrlKey){
       if (d.shortName != undefined) {
         modalOpen(d);
       }
       else{
         click(d);
       }
     }
     //event.which is handled in chrome
     //event.button is handled in IE10
     else if((event.which == 1)||(event.button == 1)||(event == 1)){
       click(d);
     }
  });

FireFox无法识别event.ctrlKey但需要。有一个问题。主要问题是else if语句。我有用于chrome的event.which,用于IE的event.button和FireFox中的事件似乎不会给我一个整数。 Mozilla Developer Network页面上描述的mouseevent.button属性表示:

The button number that was pressed when the mouse event was fired: 
Left button=0, middle button=1 (if present), right button=2. 
For mice configured for left handed use in which the button actions are
reversed the values are instead read from right to left.

我总是尝试左键单击,但有时我会得到0或2的值。如果我尝试右键单击我会得到1,0或2.它永远不会真正一致。如果我确实进入了最接近的节点,并且我定期点击,我得到的数字是19,9,3,2,0或1. 19和9似乎是最一致的,尽管在这种情况下。我不知道为什么Firefox必须如此困难,但我希望你们中的一个可以帮助我解决这个问题,所以每次都不会发生这种情况。

1 个答案:

答案 0 :(得分:2)

在d3中设置事件处理程序时,两个传递的参数不是基准和事件(如您所假设的),而是基准和索引,如下所示:

.on("mousedown", function(d, i) { 
    // 'd' is the datum
    // 'i' is the index
})

API文档(https://github.com/mbostock/d3/wiki/Selections#on)中描述了这一点:

  

selection.on(type [,listener [,capture]])

     

为当前的每个元素添加或删除事件侦听器   选择,用于指定的类型。类型是字符串事件类型   名称,例如"点击","鼠标悬停"或"提交"。 (任何DOM事件类型   可以使用您的浏览器支持。)监听器存储   使用命名约定装饰选定的DOM元素   " __ ontype&#34 ;.以与调用相同的方式调用指定的侦听器   其他运算符函数,传递当前数据d和索引   我,将此上下文作为当前DOM元素。访问   侦听器中的当前事件,使用全局d3.event。返回   忽略事件监听器的值。

这可以解释为什么你得到随机整数 - 索引会根据你点击的元素而变化。为了获取鼠标事件,请使用全局d3.event,如下所示:

.on("mousedown", function(d, i) { 
    if(d3.event.ctrlKey){
        // your code here
    }
})

所以你的最终代码应如下所示:

// Enter any new nodes at the parent's previous position.
var nodeEnter = node.enter().append("g")
    .attr("class", "node")
    .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
    .on("mousedown", function(d, i) { 
        if(d3.event.ctrlKey){
            if (d.shortName != undefined) {
                modalOpen(d);
            } else {
                click(d);
            }
        }
        //event.which is handled in chrome
        //event.button is handled in IE10
        else if((d3.event.which == 1)||(d3.event.button == 1)||(d3.event == 1)){
            click(d);
        }
});