JavaScript:获取contenteditable div中的光标位置

3

我对JavaScript还是很新的,希望有人能帮我解决以下问题:

主要是针对IE 8的解决方案 - 如果可以涵盖其他浏览器/版本就更好了。我有一个只包含一个可编辑div的页面,它是动态创建的,包含文本和HTML标签。在页面中,我想添加一个按钮,将某些文本插入到此div的光标位置。

目前,我有以下代码,只要选择div中的文本就可以正常工作,但如果只将光标定位到div中而没有选择任何内容,则会在div外部插入我的文本。

如何让它始终将我的文本添加到光标位置,就像现在在选择位置一样?(我甚至不需要它来替换选择,因为它只需要在光标位置。此外,这仅适用于一个特定的div。)

我的代码:

<html>
<head>
<script type="text/javascript">
    function test()
    {
        var input = "TEST";
        document.selection.createRange().pasteHTML(input);
    }
</script>

</head>
<body>
    <div id="myDiv" contenteditable>This is a test text.</div><br />
    <button type="button" onclick="test()">Test</button>
</body>
</html>

感谢你对此的任何帮助,Tim。
1个回答

7
您的问题是,在IE中,<button>元素会在click事件触发时夺取焦点并破坏选择。您可以使<button>不可选择,这将防止它能够获得焦点。在IE中,使用unselectable属性来实现此功能:
<button type="button" unselectable="on" onclick="test()">Test</button>

演示:http://jsbin.com/aqAYUwu/5

另一种较差的替代方法是使用mousedown事件并阻止默认操作:

<button type="button" unselectable="on"
    onmousedown="test(); return false">Test</button>

您可以在此处找到一个跨浏览器的函数,以在contenteditable元素的当前光标位置插入HTML:https://dev59.com/CGw15IYBdhLWcg3wT6H2#6691294 最后一点说明: contenteditable不是布尔属性,因此严格来说您应该给它赋一个值(例如<div contenteditable="true">),尽管在我尝试的所有浏览器中,<div contenteditable>都可以工作.

谢谢您。尽管它似乎仍然失去焦点并将文本插入我的 div 上方(但在我选择文本部分之前仍能正常工作),但这些评论和链接非常有帮助。也许有一种方法可以强制它插入到特定的 div 中,以避免这种情况吗? - user2571510
1
@user2571510:JSBin链接对你不起作用吗?在我的IE 7中它工作正常。 - Tim Down
谢谢,Tim。你说得对,关于按钮获取焦点的问题。我的问题在于,所涉及的按钮位于Bootbox对话框内(类似于提示框),该按钮只有一个类而没有ID,因此我不知道如何将unselectable属性添加到它上面。 - user2571510
@user2571510:你可以通过类名获取它并添加“unselectable”属性。由于你已经将这个问题标记为jQuery,你可以使用类似于$("button.someClass").attr("unselectable", "on");的东西。 - Tim Down
"unselectable" 挽救了我的生命。 - Daria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接