前端自定义拖拽如何封装鼠标事件?

2017-03-28 15:42:34 +08:00
 0f2e3z8n4z

百度 ife2017 里面有这么一道题,实现一个图片裁剪器。

传送门 http://ife.baidu.com/course/detail/id/37

我的疑问是关于这个裁剪框。

我的需求:

这个裁剪框是拖拽生成出来的,可以通过边框上的点拖拽改变高度和宽度,可以移动。

我的思路:

自然是绑定相应相应的事件。 mousedown , mousemove , mouseup 。

  1. 拖拽框的父元素应该绑定三个事件 down , move , up 。没毛病。 2.拖拽框自身也要绑定事件,同上。 3.拖拽框上的调整点也要绑定事件吧,因为要通过拖动改变大小 3.都使用事件冒泡

问题:

  1. 然后我发现写的 function Clipper(){}里面有一大坨 element.addEventListener(),这个应该怎么写才优雅?
  2. 然后我上 github 上看看类似的代码,发现有一些是把 move 和 up 事件都绑定到 document , down 事件绑定到元素上。这样做应该会有优化?
  3. 还有,绑定完的事件在 mouseup 的时候是不是要移除掉?
  4. 我还看到有人把 move 这个事件嵌套到 down 事件的回调函数里面,这样写是正确的吗,这样写,是不是因为出于要 down 了才能 move 这个原因?绑定事件还要看时机?

暂时不考虑 H5 的 drag and drop

所以应该怎么样写才好?

谢谢大家 : )

2020 次点击
所在节点    程序员
3 条回复
0f2e3z8n4z
2017-03-28 17:15:06 +08:00
Clipper 是我封装的图片裁剪器
otakustay
2017-03-28 22:10:05 +08:00
拖拽的思路都是 mousedown 绑在要拖的元素上,触发时在 document 上绑定 mousemove 和 mouseup , up 时注销 document 上的事件,这样保证不会鼠标动太快移出元素事件丢失
另外 ie 有 setCapture 功能, ff 有类似的,自己搜吧
0f2e3z8n4z
2017-03-29 11:16:02 +08:00
@otakustay 好的 thx

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX