【问题标题】:How to get selected text/caret position of an input that doesn't have focus?如何获取没有焦点的输入的选定文本/插入符号位置?
【发布时间】:2011-03-01 01:47:35
【问题描述】:

如果该字段没有有焦点,是否可以(可靠地)在输入文本框中获取所选文本/插入符号的位置?

如果没有,获取和保留这些数据的最佳方式是什么?

基本上,当用户单击按钮时,我想在插入符号位置插入一些文本。但是,一旦用户单击该按钮,该字段就会失去焦点,我也会失去插入符号的位置。

【问题讨论】:

    标签: javascript jquery focus position caret


    【解决方案1】:

    以下脚本将保持插入符号的位置,然后单击按钮将在存储的位置插入文本:

    Javascript:

    <script type="text/javascript">
    //Gets the position of the cursor
    function getCaret(el) { 
      if (el.selectionStart) { 
        return el.selectionStart; 
      } else if (document.selection) { 
        el.focus(); 
    
        var r = document.selection.createRange(); 
        if (r == null) { 
          return 0; 
        } 
    
        var re = el.createTextRange(), 
            rc = re.duplicate(); 
        re.moveToBookmark(r.getBookmark()); 
        rc.setEndPoint('EndToStart', re); 
    
        return rc.text.length; 
      }  
      return 0; 
    }
    
    function InsertText() {
        var textarea = document.getElementById('txtArea');
        var currentPos = getCaret(textarea);
        var strLeft = textarea.value.substring(0,currentPos);
        var strMiddle = "-- Hello World --";
        var strRight = textarea.value.substring(currentPos,textarea.value.length);
        textarea.value = strLeft + strMiddle + strRight;
    }
    </script>
    

    HTML:

    <textarea id="txtArea" >Lorem ipsum dolor sit amet, consectetur adipiscing elit.</textarea>
    <button onclick="InsertText();">Insert Text</button>
    

    如果您想在变量 onblur 中保留插入符号的位置,可以修改脚本。

    【讨论】:

    • 我花了一段时间才让它工作,但它似乎在 FF 和 IE jsfiddle.net/EDWw8 中工作
    • 也适用于 Chrome9 和 IE9。好工作。既然你还没有接受答案,那你还有什么想做的吗?
    • 我们不要急躁。 Alex 的解决方案也完全可行,而且看起来更健壮。一旦我实施它并决定哪一个对我更有效,我会接受它。
    • 这是一个很大的帮助。我需要修补 Rangyinputs 中 IE9 没有拾取光标位置的问题。现在我需要弄清楚如何向他们提交补丁。
    • 这个答案仍未被接受。已经两年了。什么给了?
    【解决方案2】:

    使用以下 2 个函数来保存和恢复文本选择。

    function saveSelection() {
        if (window.getSelection) {
            sel = window.getSelection();
            if (sel.getRangeAt && sel.rangeCount) {
                return sel.getRangeAt(0);
            }
        } else if (document.selection && document.selection.createRange) {
            return document.selection.createRange();
        }
        return null;
    }
    
    function restoreSelection(range) {
        if (range) {
            if (window.getSelection) {
                sel = window.getSelection();
                sel.removeAllRanges();
                sel.addRange(range);
            } else if (document.selection && range.select) {
                range.select();
            }
        }
    }
    

    检查工作示例http://jsfiddle.net/LhQda/

    TEXTAREA 中输入内容,然后在TEXTAERA 之外单击以丢失选择,然后单击焦点按钮以恢复选择并再次获得焦点。

    【讨论】:

    • 您意识到您的代码完全没有任何作用,并且在 IE 中无法运行,对吧? saveSelection 返回 选择,您没有将其存储在变量或任何东西中,restoreSelectionrange 作为参数,您没有传递任何内容。您的示例适用于 FF,因为 FF 默认情况下不会丢失插入符号位置。 IE(也许还有其他浏览器)可以。
    • 我没有意识到这一点。在你的问题中,你说你想get selected text/caret position of an input that doesn't have focus?。该代码为您提供焦点和选定的文本。
    • 我真的不想/不需要聚焦元素,这很容易做到,我只需要位置,这也很容易获得。问题是当元素失焦时,在某些浏览器中无法检索位置。不过,我认为,在尝试获得职位之前简单地关注该领域可能会解决问题,但我不知道这是否是一个可靠的解决方案。如果页面上有多个输入,我看不出你的 window.getSelection 会有什么用处,假设它抓取了什么......最后选择的文本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2011-06-23
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多