【问题标题】:Drop image into contenteditable in Chrome to the cursor将图像拖放到 Chrome 中的 contenteditable 到光标处
【发布时间】:2012-05-26 02:59:04
【问题描述】:

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

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

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

感谢 HTML5,您可以捕捉 drop 事件,并用它捕捉图像。但是,如果我停止浏览器的默认行为,我会卡在不知道用户想要删除它的位置。

您能提出解决方法吗?

【问题讨论】:

    标签: javascript google-chrome drag-and-drop contenteditable


    【解决方案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()

    参考资料:

    【讨论】:

    • 哦,非常感谢你,我真的被困住了!对于其他人来说,在 Chrome 中它是 document.caretRangeFromPoint(x, y)range.setStart(pos.startContainer, pos.startOffset)
    • @zupa:啊,对。那是 WebKit 自己专有的方法;我以为他们现在也实施了基于标准的标准,但我可能错了。无论如何,很高兴能提供帮助。
    • 别担心,你指出了我正确的方向,这就是我所需要的,真的!
    • 代码在 IE11 发布之前一直有效。我在 IE 11 中的 range.moveToPoint() 中收到“未指定错误”。document.caretRangeFromPoint 和 document.caretPositionFromPoint 在 IE11 中均不可用。有什么建议吗?谢谢。
    • @clam:Grr。在 IE 9 和 10 在消除兼容性问题方面取得进展之后,IE 11 似乎引入了新的问题。我会调查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2012-02-22
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多