【发布时间】:2015-01-16 20:38:53
【问题描述】:
我正在页面上实现拖放功能。这个想法是,用户可以从特殊位置开始拖动图像并将其(释放鼠标左键)放到 textarea 中,在那里会发生特殊的标签插入。
我对拖动本身没有任何问题,我遇到的问题是我无法确定鼠标在 textarea 中的位置。我从mouseup 事件中知道x 和y 的位置,并且我明确知道鼠标指针在textarea 内,但无法确定我需要在哪个位置插入所需的标签。由于焦点不在文本区域内,selectionStart 和 selectionEnd 属性为 0。此外,值得注意的是,我通过在 mousemove 处理程序中返回 false 来防止默认行为 - 否则默认行为会将图像本身在 textarea 内(这对于 base64 图像非常不利)。
以下是我目前拥有的代码。
window.onPreviewItemMouseDown = function (e) {
var curTarget = $(e.currentTarget);
var container = curTarget.parent();
window.draggingImage = funcToGetId();
$(document).on("mousemove", window.onPreviewItemDragged);
$(document).on("mouseup", window.onPreviewItemDropped);
};
window.onPreviewItemDragged = function (e) {
return false;
};
window.onPreviewItemDropped = function (e) {
var target = $(e.target);
$(document).off("mousemove");
$(document).off("mouseup");
if (target[0].id === ID_TEXTAREA_TEXT) {
// here I need to get mouse pointer position inside the text somehow
}
return false;
};
感谢任何帮助。
【问题讨论】:
-
@Teemu 我尝试只插入图像标签,例如
[img]image_id[/img],而不是图像本身。这用于稍后在文本中显示图像(在文章中),此文本区域用于编辑文章的文本。 -
是的,我意识到了,这就是我删除评论的原因。
-
使用a native DOM event怎么样?在小提琴中,只需将图像拖放到 textarea 并检查放置的位置和内容。 (似乎 jQuery 没有传递
e.dataTransfer对象,因此是原生处理。) -
@Teemu 在这种情况下,它会在文本中插入
src标签的内容。当src的内容为URL时,可以适用于以后的解析。但是,当src内部是 base64 时,它会在那里插入所有内容。此外,如果图像很大(1 MB 或更多),那么当您尝试这样做时,Chrome 会崩溃。这就是我从mousemove处理程序中return false的原因。 -
目前我唯一的解决方案是将所有图像加载到服务器,然后使用
src中的链接来拖放图像。之后解析 textarea 的内容并用正确的标签替换。
标签: javascript jquery html textarea dom-events