【发布时间】:2015-06-17 09:34:14
【问题描述】:
我正在尝试创建一个拖放菜单,用户可以在其中将图像缩略图从 div 拖到画布上。
问题是源 div 使用精灵来显示其背景缩略图,因此我必须使用 setDragImage 来允许在拖动 div 时显示图像。
我可以成功地将 div 拖到画布上并很好地放置图像,但是我的问题是在拖动幽灵图像时直到我第二次拖动 div 时才显示。
我使用上一个答案中的代码:[HTML5 Drag and Drop events and setDragImage browser support
这是我对该代码稍作修改的版本:
var isIE = (typeof document.createElement("span").dragDrop === "function");
$.fn.customDragImage = function(options) {
var offsetX = 0,
offsetY = 0;
var createDragImage = function($node, x, y) {
var $img = $(options.createDragImage($node));
icon = "icon" + window.draggedimgsrc;
offsetX = window[icon][2] / 2;
offsetY = window[icon][3] / 2;
$img.css({
"top": Math.max(0, y-offsetY)+"px",
"left": Math.max(0, x-offsetX)+"px",
"position": "absolute",
"pointerEvents": "none"
}).appendTo(document.body);
setTimeout(function() {
$img.remove();
});
return $img[0];
};
if (isIE) {
$(this).on("mousedown", function(e) {
var originalEvent = e.originalEvent,
node = createDragImage($(this), originalEvent.pageX, originalEvent.pageY);
node.dragDrop();
});
}
$(this).on("dragstart", function(e) {
var originalEvent = e.originalEvent,
dt = originalEvent.dataTransfer;
if (typeof dt.setDragImage === "function") {
node = createDragImage($(this), originalEvent.pageX, originalEvent.pageY);
console.log("node="+node);
dt.setDragImage(node, offsetX, offsetY);
}
});
return this;
};
$("[draggable='true']").customDragImage({
createDragImage: function($node) {
//init icon [0] = icon filename | [1] = icon set | [2] = icon width | [3] = icon height
icon = "icon" + window.draggedimgsrc;
window.draggedimgset = window[icon][1];
image="/boards/markers/soccerm/set" + window[icon][1] + "/" + window[icon][0] + ".png";
return $node.clone().css("width", window[icon][2]).css("height", window[icon][3]).css("background", "transparent url(" + image + ") no-repeat center"); }
}).on("dragstart", function(e) {
e.originalEvent.dataTransfer.setData("Text", "Foo");
});
奇怪的是,当我在 $node.clone() 上弹出一个边框时,它在我第一次拖动时被设置,它似乎并没有将图像放在那里。
我还手动输入了宽度和高度,所以我知道它不是图像的大小。
我在菜单出现之前预加载图像。
有什么想法吗?
【问题讨论】:
-
有些东西在我看来很俗气。首先,您在
$.extend中定义函数的方式。我不认为这就是你的做法,所以在元素上实际调用customDragImage时,你的自定义函数参数可能不正确。此外,您在该函数中有 3 个参数,但您只能使用$node调用它。毕竟,在你绑定了 dragstart 事件之后,也许可以在$(this)上尝试trigger
标签: javascript jquery html drag-and-drop jquery-ui-draggable