有没有办法阻止内容可编辑的插入符号出现在 IE 10 中的元素上?

Posted

技术标签:

【中文标题】有没有办法阻止内容可编辑的插入符号出现在 IE 10 中的元素上?【英文标题】:Is there a way to stop a contenteditable's caret from appearing over elements in IE10? 【发布时间】:2013-03-25 21:21:34 【问题描述】:

IE10 中似乎存在一个错误,如果我将一个元素放在另一个具有contenteditable 属性的元素上,编辑器的插入符号会覆盖所有内容。

您可以在下面的图片和jsFiddle 中看到这种行为。

我已经使用了大量的 CSS 属性,但无法找到解决方案。它在其他浏览器中按预期工作。

我需要这个的原因是因为我正在设计一个 WYSWIYG 编辑器 (TinyMCE fork) 体验,其中工具栏在需要时向下滑动 在文本上。这个错误使插入符号出现在工具栏的顶部。

我想到的唯一解决方案是模糊编辑器的焦点,并在工具栏消失时重新聚焦。但是,这会在工具栏被激活时阻止用户输入,并且还会导致跨浏览器的行为不一致。

是否有解决此错误的方法?

【问题讨论】:

如果不想编辑,可以将焦点设置在页面其他位置的一些input @EL 我希望允许用户继续编辑。也许我可以为 IE10 禁用它。 @alex 作为记录,这也将发生在普通的input 上;不需要contenteditable 属性。话虽如此,我几个月前就看到了这个,也没有找到解决方案。 这发生在 IE 中(可能回到 5.5),而不仅仅是 IE 10。它甚至是一个 bug 都是有争议的。 大声笑...这太不可思议了。我刚刚在Win7上安装了IE10,试图打开你的小提琴并且它崩溃了。完全地。 “Internet Explorer 已停止工作”。然后我在想,我知道Mercury 编辑器,它在 contenteditable 字段上有一个历史选项卡。所以我对自己说:“让我们看看他们是怎么做到的!”。答:他们没有。 “抱歉,您当前的浏览器不支持 Mercury Editor。”说真的:在遗漏了 3 个在 chrome MS 上工作的 IE 版本之后,我不可能再让我失望了…… 【参考方案1】:

在 IE 中无法将插入符号与另一个元素重叠。这个问题被问了很多次:

Link 1 Link 2

...

但是您可以在获取插入符号位置后模糊文本区域(请参阅:Caret position in textarea, in characters from the start),然后显示您的工具栏。隐藏工具栏后,您可以再次聚焦文本区域,设置插入符号位置:

function setCaretPosition(elemId, caretPos) 
    var elem = document.getElementById(elemId);

    if(elem != null) 
        if(elem.createTextRange) 
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        
        else 
            if(elem.selectionStart) 
                elem.focus();
                elem.setSelectionRange(caretPos, caretPos);
            
            else
                elem.focus();
        
    

见:Set keyboard caret position in html textbox

【讨论】:

很惊讶我找不到重复的问题,我花了几个小时寻找。感谢您的回答。模糊焦点的问题是工具栏有粗体、斜体等所有选项。当我模糊文本区域时,用户的选择丢失了(至少 TinyMCE 检测到它的方式)。 最好给某人 500+ 代表,即使这并不能特别解决我的问题。 谢谢!如果您找到方法/解决方法,我很想知道。【参考方案2】:

-ms-user-select: none 添加到 contenteditable 元素。设置焦点将不会显示光标 - 猜测浏览器怪癖。一旦你点击左/右或输入另一个字符,光标可能会重新出现。

【讨论】:

【参考方案3】:

您可以使用 javascript 和 CSS模拟插入符号并对其进行自定义。 通过适当的自定义,您可以针对此错误构建实用的解决方法。

这是一篇关于如何做到这一点的有趣文章: http://www.dynamicdrive.com/forums/showthread.php?17450-Emulating-a-terminal-like-caret-with-javascript-and-css

这是一个演示: http://shachi.prophp.org/demo.html

此外,还有一个 jQuery Terminal Emulator 插件,您可以根据自己的特定需求进行分叉和定制: http://terminal.jcubic.pl/#demo

【讨论】:

我不相信这会很好地与contenteditable'd 元素一起使用。 如果你一直按Del,第一个不起作用(插入符号删除错误的字符并消失在左边),第二个不适用于美国国际(引号+空格打印只是空间)。无论如何,这是一种解决方法,而不是解决方案。 它在某种程度上是 hacky,但可以在一个小实验中进行测试以确保它运行良好。如果它能够为您的 IE 用户提供完美的体验,也许值得这样做。 jQuery 插件似乎没有Del 的问题。 Del 在另一个方面很好,所以它的核心也需要改进!【参考方案4】:

显而易见的解决方法是降低 contenteditable div 的高度,并将工具栏显示在可编辑区域上方而不是在其顶部。

【讨论】:

不过这样会破坏效果。

以上是关于有没有办法阻止内容可编辑的插入符号出现在 IE 10 中的元素上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 2 中获取内容可编辑的“div”的插入符号位置?

如何获取包含图像的内容可编辑 div 的插入符号位置

通过 javascript 在 contenteditable div 上获取插入符号坐标。

为啥在word里面插入endnote文献,去格式成为可编辑状态,变成乱码?怎么使得格式不变?

网页活动内容被阻止,点击允许依然出现

如何使用 jQuery 在 contenteditable div 中移动插入符号?