jQuery ustawia pozycję kursora w obszarze tekstowym

Jak ustawić pozycję kursora w polu tekstowym za pomocą jQuery? Mam pole tekstowe z zawartością i chcę, aby kursor użytkowników był ustawiony w określonym przesunięciu, gdy skupiają się na polu. Kod powinien wyglądać mniej więcej tak:

$('#input').focus(function() {
  $(this).setCursorPosition(4);
});

Jak wyglądałaby implementacja funkcji setCursorPosition? Jeśli masz pole tekstowe z zawartością abcdefg, wywołanie to spowoduje, że kursor zostanie umieszczony w następujący sposób: abcd**| * * efg.

Java ma podobna funkcja, setCaretPosition. Czy istnieje podobna metoda dla javascript?

Aktualizacja: zmodyfikowałem kod CMS do pracy z jQuery w następujący sposób:

new function($) {
  $.fn.setCursorPosition = function(pos) {
    if (this.setSelectionRange) {
      this.setSelectionRange(pos, pos);
    } else if (this.createTextRange) {
      var range = this.createTextRange();
      range.collapse(true);
      if(pos < 0) {
        pos = $(this).val().length + pos;
      }
      range.moveEnd('character', pos);
      range.moveStart('character', pos);
      range.select();
    }
  }
}(jQuery);
Author: Soul_man, 0000-00-00

1 answers

Mam dwie funkcje:

function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

function setCaretToPos (input, pos) {
  setSelectionRange(input, pos, pos);
}

Następnie możesz użyć setCaretToPos w następujący sposób:

setCaretToPos(document.getElementById("YOURINPUT"), 4);

Przykład na żywo z textarea i input, pokazujący użycie z jQuery:

function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  } else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

function setCaretToPos(input, pos) {
  setSelectionRange(input, pos, pos);
}

$("#set-textarea").click(function() {
  setCaretToPos($("#the-textarea")[0], 10)
});
$("#set-input").click(function() {
  setCaretToPos($("#the-input")[0], 10);
});
<textarea id="the-textarea" cols="40" rows="4">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</textarea>
<br><input type="button" id="set-textarea" value="Set in textarea">
<br><input id="the-input" type="text" size="40" value="Lorem ipsum dolor sit amet, consectetur adipiscing elit">
<br><input type="button" id="set-input" value="Set in input">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

Od 2016 roku testowane i działające na Chrome, Firefox, IE11, a nawet IE8 (zobacz ten ostatni tutaj ; urywki stosu nie obsługują IE8).

 244
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54