javascript – 在d3中拖动后始终禁止单击事件

前端之家收集整理的这篇文章主要介绍了javascript – 在d3中拖动后始终禁止单击事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在此处的一些先前问题中讨论了点击和拖动事件的解耦,例如,this one

通常,建议在单击处理程序中使用if(d3.event.defaultPrevented === false){…}.但是,如果mouseup和mousedown不在同一个元素中,这似乎不起作用(至少在某些浏览器中). Consider this jsfiddle(代码如下).这是我想要的行为:单击SVG触发器点击事件(矩形闪烁)中的任意位置,在SVG拖动矩形的任何地方拖动.观察到的行为(Chrome 33):如果点击的moused在矩形内并且mouseup在外面,则拖动和单击事件都会触发.如果mousedown和mouseup都在内部或两者都在外面,则不会触发click事件.

有人可以解释为什么如果mouseup和mousedown不在同一个元素中而触发click事件,以及如何可靠地防止这种情况发生?

  1. var container,rect,dragBehavior;
  2.  
  3. svg = d3.select('svg').attr("width",500).attr("height",300);
  4. container = svg.append('g');
  5. rect = container.append('rect').attr('width',100).attr('height',100);
  6.  
  7. dragBehavior = d3.behavior.drag()
  8. .on('dragend',onDragStart)
  9. .on('drag',onDrag)
  10. .on('dragend',onDragEnd);
  11.  
  12. svg.call(dragBehavior).on('click',onClick);
  13.  
  14. function flashRect() { rect.attr('fill','red').transition().attr('fill','black'); }
  15.  
  16. function onDragStart() { console.log('onDragStart'); }
  17.  
  18. function onDrag() {
  19. console.log('onDrag');
  20. var x = (d3.event.sourceEvent.pageX - 50);
  21. container.attr('transform','translate(' + x + ')');
  22. }
  23.  
  24. function onDragEnd() { console.log('onDragEnd'); }
  25.  
  26. function onClick(d) {
  27. if (d3.event.defaultPrevented === false) {
  28. console.log('onClick');
  29. flashRect();
  30. } else {
  31. console.log("default prevented");
  32. }
  33. }

解决方法

将dragBehavior添加到矩形而不是整个svg元素.
这是修复 http://jsfiddle.net/Mn4Uk/27/的小提琴链接
  1. rect
  2. .call(dragBehavior)
  3. .on('click',onClick);

猜你在找的JavaScript相关文章