我目前正在与HTML5拖放作斗争,因为我想实现一些特定的东西。
我有一个可以使用HTML5 API拖动的div,但我只希望在用户真正想要的情况下进行拖动(因为它之后会触发更多处理程序)。
这就是为什么当满足某个条件时,我会触发dragstart
mousemove
.
var fnMousemove = function (oEvent) {
if (myCondition) {
document.removeEventListener("mousemove", fnMousemove);
oDraggable.setAttribute("draggable", true);
oDraggable.addEventListener("dragstart", fnDragstart);
oDraggable.addEventListener("drag", fnDrag);
oDraggable.addEventListener("dragend", fnDragend);
// Fire a dragstart event, now that we know what to do with it
var e = document.createEvent("MouseEvents"); //$NON-NLS-1$
e.initEvent("dragstart"); //$NON-NLS-1$
oDraggable.dispatchEvent(e);
}
};
但正如您已经猜到的那样,从某种意义上说,这不起作用,因为dragstart
被正确触发,但没有其他拖动事件(drag
,dragend
......
我在那里有什么事情没有正确处理吗?或者您能看到从鼠标移动处理程序启动浏览器拖放的解决方法吗?(按住鼠标按钮)
提前感谢!
您可以在此处找到一个简单的运行示例
通常触发 dragstart 的机制似乎预测了通常跟随 dragstart 的其他事件并相应地触发它们。
因此,如果您自己触发 dragstart 事件,那么您也必须自己实现流程的其余部分。
为了特别解决您的问题,我建议您按如下方式创建用户体验:
- 指示用户单击相应的区域以启用拖动
- 用户单击该区域后,显示反馈以指示现在可以使用拖动。
它只是意味着您应该寻找的是如何根据拖放 API 的当前状态改善用户体验。
正如 igwe-kalu 所说,你必须自己实现拖动事件。我用你的小提琴来触发 dragend 事件并使用新的构造函数。
var fnMousemove = function (oEvent) {
var iTopDiff = Math.abs(oEvent.pageY - mStartPos.top);
var iLeftDiff = Math.abs(oEvent.pageX - mStartPos.left);
if (iTopDiff > 50 || iLeftDiff > 50) {
document.removeEventListener("mousemove", fnMousemove);
oDraggable.setAttribute("draggable", true);
oDraggable.addEventListener("dragstart", fnDragstart);
oDraggable.addEventListener("drag", fnDrag);
oDraggable.addEventListener("dragend", fnDragend);
// Fire a dragstart event, now that we know what to do with it
var e = new DragEvent("dragstart", {"dataTransfer": dataTransfer}); //$NON-NLS-1$
oDraggable.dispatchEvent(e);
}
};
var fnMouseup = function (oEvent) {
document.removeEventListener("mousemove", fnMousemove);
var e = new DragEvent("dragend", {"dataTransfer": dataTransfer}); //$NON-NLS-1$
oDraggable.dispatchEvent(e);
};
JSFiddle: http://jsfiddle.net/p0391zhv/