当前位置: 首页 > 面试题库 >

内容可编辑,在文本末尾设置插入符号(跨浏览器)

白翰海
2023-03-14
问题内容

Chrome中 输出:

<div id="content" contenteditable="true" style="border:1px solid #000;width:500px;height:40px;">
    hey
    <div>what's up?</div>
<div>
<button id="insert_caret"></button>

我相信在 FF中 它将看起来像这样:

hey
<br />
what's up?

并在 IE中

hey
<p>what's up?</p>

不幸的是,没有一种很好的方法可以使每个浏览器都插入一个<br />而不是div标签或p标签,或者至少我在网上找不到任何东西。

无论如何,我现在想做的是,当我按下 按钮时 ,我希望将插入符号设置在文本的末尾,因此它应该看起来像这样:

hey
what's up?|

有什么办法可以使其在 所有浏览器中 正常工作?

例:

$(document).ready(function()
{
    $('#insert_caret').click(function()
    {
        var ele = $('#content');
        var length = ele.html().length;

        ele.focus();

        //set caret -> end pos
     }
 }

问题答案:

以下功能将在所有主流浏览器中实现:

function placeCaretAtEnd(el) {

    el.focus();

    if (typeof window.getSelection != "undefined"

            && typeof document.createRange != "undefined") {

        var range = document.createRange();

        range.selectNodeContents(el);

        range.collapse(false);

        var sel = window.getSelection();

        sel.removeAllRanges();

        sel.addRange(range);

    } else if (typeof document.body.createTextRange != "undefined") {

        var textRange = document.body.createTextRange();

        textRange.moveToElementText(el);

        textRange.collapse(false);

        textRange.select();

    }

}



placeCaretAtEnd( document.querySelector('p') );


p{ padding:.5em; border:1px solid black; }


<p contentEditable>foo bar </p>

在开始时将插入符几乎相同:只需要更改传递给的调用中的布尔值即可collapse()。这是一个示例,该示例创建用于将插入号放在开头和结尾的函数:

function createCaretPlacer(atStart) {
    return function(el) {
        el.focus();
        if (typeof window.getSelection != "undefined"
                && typeof document.createRange != "undefined") {
            var range = document.createRange();
            range.selectNodeContents(el);
            range.collapse(atStart);
            var sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
        } else if (typeof document.body.createTextRange != "undefined") {
            var textRange = document.body.createTextRange();
            textRange.moveToElementText(el);
            textRange.collapse(atStart);
            textRange.select();
        }
    };
}

var placeCaretAtStart = createCaretPlacer(true);
var placeCaretAtEnd = createCaretPlacer(false);


 类似资料:
  • 问题内容: 我有一个contenteditable div,需要在插入符号的位置插入文本, 可以通过IE在IE中轻松完成此操作 在Firefox / Chrome中有类似的实现方式吗? 谢谢! 问题答案: 以下功能将在插入符号位置插入文本,并删除现有选择。它适用于所有主流桌面浏览器: 更新 基于注释,下面是一些用于保存和还原选择的代码。在显示上下文菜单之前,应该将返回值存储在一个变量中,然后在隐藏

  • Ruby我已经开始在我的Ruby代码中插入不可编辑的文本,我觉得这很烦人。例如,这个简单的rSpec表达式: ...变成了这样: 另一个例子是: ...变成了这样: 如何关闭此功能?

  • 作为我的应用程序的一部分,我有一个简单的屏幕来输入文本。当焦点在EditText中时,它永远不会接收制表符。 我按下虚拟键盘上的tab键,但行为是键盘消失了。 这是我的布局: 有问题的控件是最后一个EditText,因为它是多行的,带有滚动。 我需要提供这一点,以便用户可以做一些(非常)基本的格式化。 有什么想法吗?

  • 问题内容: 我需要将插入符号移动到节点的末端,例如在Gmail注释小部件上。 我在StackOverflow上阅读了线程,但是这些解决方案基于使用输入,并且不适用于元素。 问题答案: 还有另一个问题。 如果的解决方案工作DIV不包含其他元素multilined。 例如,如果一个div包含其他div,而这些其他div里面包含其他内容,则可能会出现一些问题。 为了解决这些问题,我安排了以下解决方案,它

  • vue项目中使用了富文本编辑器quill v1.3.7,然后写了自定上传相关业务代码,由于需要支持大文件上传,所以自定义里面做了分片上传逻辑,分配上传完成后,最后调用接口返回文件地址等信息,拿到信息后,需要插入到quill富文本编辑器中,这个测试下来没什么问题,但是当插入大文件时,通过 如上代码插入视频却总是报错,通过调试发现that.editor.getSelection()返回null,但是上

  • 在IntelliJ中,我们可以使用Alt Shift Insert在每行的同一位置进行多行编辑。当每行的长度不同时,我们可以在每行的末尾进行多行编辑吗?使用场景是在每行末尾编辑分号。 谢谢。