亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在可內容元素(Div)中設置插入符號(游標)位置?

如何在可內容元素(Div)中設置插入符號(游標)位置?

白衣非少年 2019-06-19 11:09:08
如何在可內容元素(Div)中設置插入符號(游標)位置?我以這個簡單的HTML為例:<div id="editable" contenteditable="true">   text text text<br>   text text text<br>   text text text<br></div><button id="button">focus</button>我想要簡單的事情-當我點擊按鈕時,我想把插入符號(光標)放在可編輯的div中的特定位置。從網上搜索,我有這個JS附在按鈕點擊,但它不工作(FF,Chrome):var range = document.createRange();var myDiv = document.getElementById("editable");range.setStart(myDiv, 5);range.setEnd(myDiv, 5);是否可以像這樣手動設置插入符號的位置?
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

您在可內容光標定位上找到的大多數答案都相當簡單,因為它們只滿足普通文本的輸入。一旦在容器中使用html元素,輸入的文本就會被分割成節點,并在樹結構中自由分布。

為了設置光標位置,我有一個函數,它循環在所提供節點內的所有子文本節點,并設置一個范圍,從初始節點的開始到字符數性格:

function createRange(node, chars, range) {
    if (!range) {
        range = document.createRange()
        range.selectNode(node);
        range.setStart(node, 0);
    }

    if (chars.count === 0) {
        range.setEnd(node, chars.count);
    } else if (node && chars.count >0) {
        if (node.nodeType === Node.TEXT_NODE) {
            if (node.textContent.length < chars.count) {
                chars.count -= node.textContent.length;
            } else {
                range.setEnd(node, chars.count);
                chars.count = 0;
            }
        } else {
           for (var lp = 0; lp < node.childNodes.length; lp++) {
                range = createRange(node.childNodes[lp], chars, range);

                if (chars.count === 0) {
                    break;
                }
            }
        }
    } 

    return range;};

然后用這個函數調用例程:

function setCurrentCursorPosition(chars) {
    if (chars >= 0) {
        var selection = window.getSelection();

        range = createRange(document.getElementById("test").parentNode, { count: chars });

        if (range) {
            range.collapse(false);
            selection.removeAllRanges();
            selection.addRange(range);
        }
    }};

折疊(False)將光標設置為范圍的末尾。我用Chrome、IE、Mozilla和Opera的最新版本測試了它,它們都很好。

PS。如果有人感興趣,我將使用以下代碼獲得當前光標位置:

function isChildOf(node, parentId) {
    while (node !== null) {
        if (node.id === parentId) {
            return true;
        }
        node = node.parentNode;
    }

    return false;};function getCurrentCursorPosition(parentId) {
    var selection = window.getSelection(),
        charCount = -1,
        node;

    if (selection.focusNode) {
        if (isChildOf(selection.focusNode, parentId)) {
            node = selection.focusNode; 
            charCount = selection.focusOffset;

            while (node) {
                if (node.id === parentId) {
                    break;
                }

                if (node.previousSibling) {
                    node = node.previousSibling;
                    charCount += node.textContent.length;
                } else {
                     node = node.parentNode;
                     if (node === null) {
                         break
                     }
                }
           }
      }
   }

    return charCount;};

代碼執行與set函數相反的操作-它獲取當前的window.getSelections().ocusNode和ocusOffset,并向后計數所遇到的所有文本字符,直到它到達具有容器ID id的父節點為止。isChilOf函數只是在運行之前檢查所述節點是否實際上是所提供的節點的子節點。父母.

這些代碼應該在不改變的情況下直接工作,但是我剛剛從我開發的jQuery插件中獲取了它,所以我已經黑掉了幾個這是-如果有什么不管用的話,請告訴我!


查看完整回答
反對 回復 2019-06-19
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

如果不想使用jQuery,可以嘗試以下方法:

public setCaretPosition() {
    const editableDiv = document.getElementById('contenteditablediv');
    const lastLine = this.input.nativeElement.innerHTML.replace(/.*?(<br>)/g, '');
    const selection = window.getSelection();
    selection.collapse(editableDiv.childNodes[editableDiv.childNodes.length - 1], lastLine.length);}

editableDiv您的可編輯元素,請不要忘記設置id為了它。那你就得把你的innerHTML切斷所有剎車線。然后用下一個參數來設置崩潰。


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 647 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號