【问题标题】:How to select text area instead of text?如何选择文本区域而不是文本?
【发布时间】:2018-01-29 12:39:51
【问题描述】:

我必须在 textarea 中为所选文本指定位置。 这里我有一个文本示例(段落)。但我需要文本区域。我面临一些问题。(文本节点为空)。

JavaScript:

    function findClickedWord(parentElt, x, y) {
    if (parentElt.nodeName !== '#text') {
        console.log('didn\'t click on text node');
        return null;
    }
    var range = document.createRange();
    var words = parentElt.textContent.split(' ');
    var start = 0;
    var end = 0;
    for (var i = 0; i < words.length; i++) {
        var word = words[i];
        end = start+word.length;
        range.setStart(parentElt, start);
        range.setEnd(parentElt, end);
        // not getBoundingClientRect as word could wrap
        var rects = range.getClientRects();
        var clickedRect = isClickInRects(rects);
        if (clickedRect) {
            return [word, start, clickedRect];
        }
        start = end + 1;
    }

    function isClickInRects(rects) {
        for (var i = 0; i < rects.length; ++i) {
            var r = rects[i]
            if (r.left<x && r.right>x && r.top<y && r.bottom>y) {            
                return r;
            }
        }
        return false;
    }
    return null;
}
function onClick(e) {
    var elt = document.getElementById('info');
    var clicked = findClickedWord(e.target.childNodes[0], e.clientX, e.clientY);
    elt.innerHTML = 'Nothing Clicked';
    if (clicked) {
        var word = clicked[0];
        var start = clicked[1];
        var r = clicked[2];
        elt.innerHTML = 'Clicked: ('+r.top+','+r.left+') word:'+word+' at offset '+start; 
    }
}

document.addEventListener('click', onClick);

这是我的plunker

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:
    function ShowSelectionInsideTextarea(e){
      var textComponent = document.getElementById('mytextarea');
    
      var selectedText;
      // IE version
      if (document.selection != undefined){
        textComponent.focus();
        var sel = document.selection.createRange();
        selectedText = sel.text;
      }
      // Mozilla version
      else if (textComponent.selectionStart != undefined){
        var startPos = textComponent.selectionStart;
        var endPos = textComponent.selectionEnd;
        selectedText = textComponent.value.substring(startPos, endPos)
      }
        alert("You selected: " + selectedText+", "+e.clientX+", "+e.clientY);
    }
    

    请检查这个 - plunkr 我已经创建了。

    【讨论】:

    • 我可以在文本区域中的选定文本下方放置一个 div 吗?可以吗?
    • 您已经有了文本选择的 x、y 位置。因此,与其发出警报,不如将该 msg 放在一个 div 中,并将该 div 与该 x、y 位置的绝对位置放在一起。
    【解决方案2】:

    如果您需要大面积编辑文本,请将&lt;div&gt; 编辑为&lt;div contenteditable="true"&gt;

    或者

    function findClickedWord(parentElt, target) {
        if (parentElt.nodeName !== target.nodeName) {
            console.log('didn\'t click on text node');
            return null;
        }
        
        var startPos = parentElt.selectionStart,
            endPos = parentElt.selectionEnd,
            isSelected = startPos != endPos ? true : false,
            startStr = parentElt.value.substring(0, startPos),
            endStr = parentElt.value.substring(endPos),
            startWrdIndex = startStr.lastIndexOf(' ') + 1,
            endWrdIndex = endStr.indexOf(' ') + startStr.length + (endPos - startPos),
            selectedText = parentElt.value.substring(startWrdIndex, endWrdIndex);
            
            return {
              text : selectedText,
              start : startWrdIndex,
              end : endWrdIndex,
              selected : isSelected,
            };
    }
    function onClick(e) {
        var elt = document.getElementById('info');
        var textarea = document.getElementById('txt');
        var action = findClickedWord(e.target, textarea);
        elt.innerHTML = 'Nothing Clicked.';
        if (action) {
            elt.innerHTML = (action ? 'Selected' : 'Clicked') + '(' + action.start + ',' + action.end + ') words:"' + action.text + '"'; 
        }
    }
    
    document.addEventListener('click', onClick);
    <div class="parent">
        <textarea id="txt" class="child">Bacon ipsum dolor amet meatball bresaola t-bone tri-tip brisket. Jowl pig picanha cupim landjaeger, frankfurter spare ribs chicken. Porchetta jowl pancetta drumstick shankle cow spare ribs jerky tail kevin biltong capicola brisket venison bresaola. Flank sirloin jowl andouille meatball venison salami ground round rump boudin turkey capicola t-bone. Sirloin filet mignon tenderloin beef, biltong doner bresaola brisket shoulder pork loin shankle turducken shank cow. Bacon ball tip sirloin ham.
        </textarea>
        <div id="info">Click somewhere in the paragraph above</div>
    </div>

    【讨论】:

    • @M Jr 是否可以在所选文本下方放置一个div
    • 你可以找到它here。 :)
    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 2018-11-04
    • 2012-05-11
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多