为D3.js中的drag、zoom阻止冒泡和默认事件

本文探讨了D3.js在模态框内的拖拽与缩放事件与模态框本身的可拖动特性之间的冲突问题,并提供了解决方案。通过使用D3.js自带的方法阻止默认事件,确保了两种拖动行为可以正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务需求是模态框为可拖动,模态框内为D3.js的拖拽和缩放事件,然而两者是冲突的,出现的效果特别奇怪,但是在D3中回调函数并没有Event事件,所以只能用D3自带的阻止默认事件方法去处理。
  • 原生阻止默认事件方法
//阻止浏览器的默认行为 
function stopDefault(e) {
    //阻止默认浏览器动作(W3C) 
    if (e && e.preventDefault)
        e.preventDefault();
    //IE中阻止函数器默认动作的方式 
    else
        window.event.returnValue = false;
    return false;
}

function stopBubble(e) {
    //如果提供了事件对象,是非IE浏览器 
    if (e && e.stopPropagation)
        //使用W3C的stopPropagation()方法 
        e.stopPropagation();
    else
        //使用IE的cancelBubble = true来取消事件冒泡 
        window.event.cancelBubble = true;
}

//调用

$("div").on("clcik",function(event){
    var e = event || window.event;
    stopDefault(e);
    stopBubble(e);
})
  • D3.js 阻止默认事件方法
var draged = d3.behavior.drag().on("drag", ondrag)
    .on("dragstart", function () {
      d3.event.sourceEvent.stopPropagation();
    }).on("dragend", function () {
      d3.event.sourceEvent.stopPropagation();
    });

var zoomed = d3.behavior.drag().on("zoom", ondrag)
    .on("zoomstart", function () {
      d3.event.sourceEvent.stopPropagation();
    }).on("zoomend", function () {
      d3.event.sourceEvent.stopPropagation();
    });

需要阻止的四个事件分别为
- dragstart :拖动开始时触发
- dragend :拖动结束时触发
- zoomstart :缩放开始时行为
- zoomend :缩放结束时行为

参考资料:
D3 API详解

D3.js是一个强大的JavaScript库,用于数据可视化,其中的zoom缩放拖拽功能允许用户交互式地探索复杂的数据集。在D3的`d3.zoom()`函数中,你可以创建一个缩放行为,它可以应用于SVG、Canvas或任何支持CSS变换的元素上。 以下是D3 zoom缩放拖拽的基本实现步骤: 1. **创建Zoom行为**: ```javascript const zoom = d3.zoom() .scaleExtent([1, 10]) // 设置缩放范围 .on("zoom", zoomed); // 触发事件处理函数(zoomed) svg.append("g") .call(zoom); // 将zoom行为应用到SVG元素的子元素上 ``` 2. **定义zoomed函数**: 这个函数会在每次缩放事件后被调用,更新视图的位置比例: ```javascript function zoomed() { svg.select(".zoom-gROUP") .attr("transform", d3.event.transform); // 更新元素的transform属性 } ``` 3. **拖拽处理**: D3没有内置的拖拽功能,但你可以结合`d3.behavior.drag()`来添加拖拽。首先,创建一个可拖拽的元素,然后定义`dragged`函数来处理拖动事件: ```javascript const drag = d3.drag() .on("start", dragstarted) .on("drag", dragged) .on("end", dragended); element.call(drag); ``` 4. **处理开始、移动结束事件**: ```javascript function dragstarted(d) { // 在开始拖动时设置初始位置 d3.event.sourceEvent.stopPropagation(); // 阻止默认的鼠标事件 } function dragged(d) { // 根据拖动更新元素位置 } function dragended(d) { // 拖动结束后可能需要更新状态或数据 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值