javascript:将插入符号移到元素的末尾(带有contenteditable的div)

时间:2018-10-16 16:06:52

标签: javascript

我具有此功能,可将内容可编辑的div聚焦并在文本的末尾移动插入符号,但是它没有按预期工作。

单击“将插入符号移动到末尾”按钮,插入符号位置为1,而不是div#foo长度。但是,如果您单击“我是字符串”的“ g”字符,则插入标记的位置为12

function moveCaretToEnd(nativeElement) {
        nativeElement.focus();
        if (window.getSelection) {
          if (typeof window.getSelection !== 'undefined' && typeof document.createRange !== 'undefined') {
            const range = document.createRange();
            range.selectNodeContents(nativeElement.firstChild);
            range.collapse(false);
            const sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
          }
        }
        updateCaretPos(window.getSelection().anchorOffset);
}

function updateCaretPos(pos){
   document.getElementById('caretpos').innerHTML = pos;
}
<div id="foo" contenteditable="true" onclick="updateCaretPos(window.getSelection().anchorOffset)" style="border: 1px solid grey">i'm a string</div>
<p>Caret position <div id="caretpos"></div></p>
<button onclick="moveCaretToEnd(document.getElementById('foo'))">Move caret to end</button>

2 个答案:

答案 0 :(得分:2)

您正在尝试将按钮本身作为插入符号的显示元素,我建议您按照以下步骤操作:

function moveCaretToEnd(nativeElement) {
        // If nothing passed, choose an element by default
        nativeElement = nativeElement || document.getElementById('foo');
        nativeElement.focus();
        if (window.getSelection) {
          if (typeof window.getSelection !== 'undefined' && typeof document.createRange !== 'undefined') {
            const range = document.createRange();
            range.selectNodeContents(nativeElement);
            range.collapse(false);
            const sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
          }
        }
        updateCaretPos();
}

function updateCaretPos(){
   document.getElementById('caretpos').innerHTML = window.getSelection().anchorOffset;
}



moveCaretToEnd(document.getElementById('foo'));

在HTML方面,我在按钮上添加了type="button",因此它不会提交:

<div id="foo" contenteditable="true" onclick="updateCaretPos()">click me</div>
<p>Caret position <div id="caretpos"></div></p>
<button type="button" onclick="moveCaretToEnd()">Move caret to end</button>

答案 1 :(得分:1)

您将“ this”传递给函数,但是“ this”将是“ button”,而不是div。

尝试改用此html:

CONVERT_TZ(CURRENT_DATE(), 'UTC', 'Asia/Shanghai') 

修改

要选择textNode,可以尝试:

<button onclick="moveCaretToEnd(document.getElementById('foo'))">Move caret to end</button>
相关问题