在contenteditable div上检测并替换光标前的单词

时间:2018-06-11 17:25:41

标签: javascript html html5 contenteditable

如何在c:\program files\pa.txt exists in list_1 c:\program files\pex2.txt exists in list_1 div中检测光标前的单词并将其替换为其他内容?http://rextester.com/QBQDO38144但不适用于此可信任的div:

contenteditable
document.getElementById('a').addEventListener('keydown', e => {
  if (e.which == 9) {
    e.preventDefault();
    let endingIndex = e.target.selectionStart;     // does not work for contenteditable
    let startingIndex = endingIndex && endingIndex - 1;
    let value = e.target.innerHTML;
    let regex = /[ ]/;

    while(startingIndex){
      if(regex.test(value[startingIndex])){
        ++startingIndex;
        break;
      }
      --startingIndex;
    }
    console.log('word before cursor: ' + value.substring(startingIndex, endingIndex));
  }
  
});

2 个答案:

答案 0 :(得分:1)

这是因为selectionStart仅适用于HTMLInputElement类型的Objsects。 也许您想查看此gist或直接使用Range界面。

答案 1 :(得分:1)

使用AntonGuz提供的gist答案,这适用于满意的divtextarea



function getPos(elt) {
    if (elt.isContentEditable) {  // for contenteditable
        elt.focus();
        let _range = document.getSelection().getRangeAt(0);
        let range = _range.cloneRange();
        range.selectNodeContents(elt);
        range.setEnd(_range.endContainer, _range.endOffset)
        return range.toString().length;
    } else {  // for texterea/input element
        return elt.selectionStart;
    }
}

function setPos(elt, pos) {
    if (elt.isContentEditable) {  // for contenteditable
        elt.target.focus();
        document.getSelection().collapse(elt.target, pos);
    } else {  // for texterea/input element
        elt.target.setSelectionRange(pos, pos);
    }
}

function insertText(content) {
    document.execCommand('insertText', false, content) 
}

document.addEventListener("keydown", function(e) {
    if (e.target.tagName.toLowerCase() === 'textarea' || e.target.isContentEditable)
    {        
        if (e.keyCode == 9) {
            e.preventDefault();
            console.log(getPos(e.target));
            
            let endingIndex = getPos(e.target);
            let startingIndex = endingIndex && endingIndex - 1;
            let value = e.target.isContentEditable ? e.target.innerHTML : e.target.value;
            let regex = /[ ]/;

            while (startingIndex) {
                if (regex.test(value[startingIndex])) {
                    ++startingIndex;
                    break;
                }
                --startingIndex;
            }
            console.log('word before cursor: ' + value.substring(startingIndex, endingIndex));
        }
    }
});

<div contenteditable>Please click here and hit TAB, the word before cursor should be replaced by something else.</div>

<textarea></textarea>
&#13;
&#13;
&#13;