将图像拖放到 Chrome 中的 contenteditable 到光标处

IT技术 javascript google-chrome drag-and-drop contenteditable
2021-02-26 04:56:46

在 Firefox 中,如果我将图像从桌面拖到 contenteditable 字段中,它将作为 base64 嵌入到突出显示的光标位置。

JSFiddle:http : //jsfiddle.net/zupa/YrwsS/

现在在 Chrome 中,图像由浏览器打开(页面加载,在同一个小提琴中尝试)。

多亏了 HTML5,您可以捕捉 drop 事件,并用它捕捉图像。但是如果我停止浏览器的默认行为,我就会陷入不知道用户想把它放在哪里的困境。

你能提出一个解决方法吗?

1个回答

如果您可以获得放置位置的坐标(我认为必须是可能的),您可以按如下方式进行(未经测试)。我假设您已经将放置位置相对于视口的坐标作为变量xy并将放置的图像作为变量img

演示:http : //jsfiddle.net/KZqNj/

代码:

var range;

// Try the standards-based way first
if (document.caretPositionFromPoint) {
    var pos = document.caretPositionFromPoint(x, y);
    range = document.createRange();
    range.setStart(pos.offsetNode, pos.offset);
    range.collapse();
    range.insertNode(img);
}
// Next, the WebKit way
else if (document.caretRangeFromPoint) {
    range = document.caretRangeFromPoint(x, y);
    range.insertNode(img);
}
// Finally, the IE way
else if (document.body.createTextRange) {
    range = document.body.createTextRange();
    range.moveToPoint(x, y);
    var spanId = "temp_" + ("" + Math.random()).slice(2);
    range.pasteHTML('<span id="' + spanId + '">&nbsp;</span>');
    var span = document.getElementById(spanId);
    span.parentNode.replaceChild(img, span);
}

这将适用于最新的 WebKit、Opera 和 Mozilla 浏览器,尽管只有 Firefox 实现了document.caretPositionFromPoint().

参考:

该代码在 IE11 发布之前一直有效。我在 IE 11 中的 range.moveToPoint() 中收到“未指定的错误”。 document.caretRangeFromPoint 和 document.caretPositionFromPoint 在 IE11 中均不可用。有什么建议吗?谢谢。
2021-05-10 04:56:46
@clam:Grr。在 IE 9 和 10 在消除兼容性问题方面取得进展之后,IE 11 似乎又引入了新的问题。我会调查一下。
2021-05-13 04:56:46
@zupa:啊,对了。那是 WebKit 自己的专有方法;我以为他们现在也实施了基于标准的方法,但我可能错了。无论如何,很高兴提供帮助。
2021-05-16 04:56:46
哦,非常感谢你,我真的被困住了!对于其他人,在Chrome中是相当 document.caretRangeFromPoint(x, y)range.setStart(pos.startContainer, pos.startOffset)
2021-05-20 04:56:46
不用担心,您为我指明了正确的方向,这就是我所需要的,真的!
2021-05-21 04:56:46