jQuery를 사용하여 마우스 포커스를 설정하고 커서를 입력 끝으로 이동


95

이 질문은 몇 가지 다른 형식으로 요청되었지만 내 시나리오에서 작동하는 답을 얻을 수 없습니다.

사용자가 위 / 아래 화살표를 눌렀을 때 jQuery를 사용하여 명령 기록을 구현하고 있습니다. 위쪽 화살표를 눌렀을 때 입력 값을 이전 명령으로 바꾸고 입력 필드에 포커스를 설정하지만 커서는 항상 입력 문자열의 끝에 위치하도록합니다.

내 코드는 다음과 같습니다.

$(document).keydown(function(e) {
  var key   = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
  var input = self.shell.find('input.current:last');

  switch(key) {
    case 38: // up
      lastQuery = self.queries[self.historyCounter-1];
      self.historyCounter--;
      input.val(lastQuery).focus();
// and it continues on from there

포커스 후 커서를 '입력'끝에 강제로 배치하려면 어떻게해야합니까?

답변:


145

초점을 맞춘 후 값을 지우고 작업을 재설정하는 것 같습니다.

input.focus();
var tmpStr = input.val();
input.val('');
input.val(tmpStr);

4
이것은 크로스 브라우저에서 작동하는 유일한 솔루션입니다. 당신에게 명성!
Meshaal

2
이것은 FF 및 크롬에서는 잘 작동하지만 IE에서는 작동하지 않습니다. 누구든지 IE에서이 문제를 해결하는 방법을 알고 있습니까?
존 스미스

1
다음과 같이 통화를 연결할 수도 있습니다.var temp = input.focus().val(); input.val('').val(temp);
harpo

20
이것은 더 간단해질 수 있습니다.input.focus().val(input.val());
Fateh Khalsa 2014 년

2
contenteditable어떤 이유로 요소 와 함께 작동하지 않는 것 같습니다 . 아마도 하나가 .html()대신 사용해야 하므로.val()
jg2703

55

조금 이상하고 어리석은 것처럼 보이지만 이것은 나를 위해 일하고 있습니다.

input.val(lastQuery);
input.focus().val(input.val());

이제 설정을 복제했는지 확실하지 않습니다. 나는 요소 라고 가정 input하고 <input>있습니다.

값을 (자체로) 재설정하면 커서가 입력의 끝에 놓이는 것 같습니다. Firefox 3 및 MSIE7에서 테스트되었습니다.


1
예, 입력은 <input> 요소입니다. 나는 이것을 시도하고 FF3 또는 Safari 4에서 작동하지 않았습니다
jerodsanto

이것에 대한 업데이트가 있습니까? 나를 위해 일했습니다. 질문을 업데이트하거나 해결책을 찾은 경우 답변을 추가하십시오.
artlung

FF15에서 이것은 커서를 입력 필드의 시작으로 설정합니다. 그 외에는 잘 작동합니다. FF에 대한 솔루션도 있습니까?
JochenJung

@JochenJung 2009 년 이후로 이것을 보지 않았습니다. FF3 및 jQuery와 함께 작동했습니다. 현재 jQuery 및 FF15를 사용하는 솔루션이 떠오르면이 게시물을 자유롭게 편집하십시오.
artlung

45

도움이 되었기를 바랍니다.

var fieldInput = $('#fieldName');
var fldLength= fieldInput.val().length;
fieldInput.focus();
fieldInput[0].setSelectionRange(fldLength, fldLength);

4
잘 작동합니다. 특히 모델 뷰 바인딩이있을 때 값을 재설정하는 것보다 더 나은 솔루션이라고 생각합니다.
morten.c

2
정답입니다. 정답을 맞추지 않고 원하는 것을 정확하게 설정합니다.
Dan Barron

14

Chris Coyier에는 완벽하게 잘 작동하는 미니 jQuery 플러그인이 있습니다. http://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/

지원되는 경우 setSelectionRange를 사용하고 , 그렇지 않으면 확실한 대체 기능이 있습니다.

jQuery.fn.putCursorAtEnd = function() {
  return this.each(function() {
    $(this).focus()
    // If this function exists...
    if (this.setSelectionRange) {
      // ... then use it (Doesn't work in IE)
      // Double the length because Opera is inconsistent about whether a carriage return is one character or two. Sigh.
      var len = $(this).val().length * 2;
      this.setSelectionRange(len, len);
    } else {
      // ... otherwise replace the contents with itself
      // (Doesn't work in Google Chrome)
      $(this).val($(this).val());
    }
    // Scroll to the bottom, in case we're in a tall textarea
    // (Necessary for Firefox and Google Chrome)
    this.scrollTop = 999999;
  });
};

그런 다음 다음을 수행 할 수 있습니다.

input.putCursorAtEnd();

놀랍게도, 내가 찾은 유일한 해결책은 안정적으로 작동하는 것 같습니다.
AdamJones


8

2 artlung 의 답변 : 내 코드 (IE7, IE8; Jquery v1.6)에서만 두 번째 줄에서 작동합니다.

var input = $('#some_elem');
input.focus().val(input.val());

추가 : 입력 요소가 JQuery를 사용하여 DOM에 추가 된 경우 IE에서 포커스가 설정되지 않습니다. 나는 약간의 트릭을 사용했습니다.

input.blur().focus().val(input.val());

1
이런 종류의 저에게는 효과가 있었지만 다음과 같이해야했습니다. var input = $ ( "# inputID"); tmp = input.val (); input.focus (). val ( ""). blur (). focus (). val (tmp);
will824

@ will824 귀하의 의견 솔루션이 저에게 효과적이었습니다. 나는 그것을 답변으로 게시하고 있습니다.
Aamir Shahzad

8

Ref : @ will824 코멘트,이 솔루션은 호환성 문제없이 저에게 효과적이었습니다. 나머지 솔루션은 IE9에서 실패했습니다.

var input = $("#inputID");
var tmp = input.val();
input.focus().val("").blur().focus().val(tmp);

테스트를 거쳐 다음에서 작동하는 것으로 확인되었습니다.

Firefox 33
Chrome 34
Safari 5.1.7
IE 9

6

나는이 대답이 늦게 오는 것을 알고 있지만 사람들이 대답을 찾지 못한 것을 볼 수 있습니다. return false이벤트를 처리하는 메서드 에서 위쪽 키가 커서를 처음에 놓는 것을 방지합니다 . 그러면 커서 이동으로 이어지는 이벤트 체인이 중지됩니다. 아래 OP에서 수정 된 코드를 붙여 넣습니다.

$(document).keydown(function(e) {
  var key   = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
  var input = self.shell.find('input.current:last');

  switch(key) {
    case 38: // up
      lastQuery = self.queries[self.historyCounter-1];
      self.historyCounter--;
      input.val(lastQuery).focus();
      // HERE IS THE FIX:
      return false; 
// and it continues on from there

1
두 번째 줄을 다음 var key = e.charCode || e.keyCode || 0;
과 같이

6

아래 코드를 사용하고 잘 작동합니다.

function to_end(el) {
            var len = el.value.length || 0;
            if (len) {
                if ('setSelectionRange' in el) el.setSelectionRange(len, len);
                else if ('createTextRange' in el) {// for IE
                    var range = el.createTextRange();
                    range.moveStart('character', len);
                    range.select();
                }
            }
        }

6

브라우저마다 다릅니다.

이것은 ff에서 작동합니다.

    var t =$("#INPUT");
    var l=$("#INPUT").val().length;
    $(t).focus();

    var r = $("#INPUT").get(0).createTextRange();
    r.moveStart("character", l); 
    r.moveEnd("character", l);      
    r.select();

자세한 내용은 SitePoint , AspAlliance의이 기사에 있습니다 .


4

다른 사람이 말했듯이 clear and fill이 나를 위해 일했습니다.

    var elem = $('#input_field');
    var val = elem.val();
    elem.focus().val('').val(val);

3

먼저 값을 설정하십시오. 그런 다음 초점을 설정하십시오. 초점을 맞출 때 초점 시점에 존재하는 값을 사용하므로 먼저 값을 설정해야합니다.

이 논리 <input>는를 클릭 한 값으로 채우는 응용 프로그램과 함께 작동합니다 <button>. val()먼저 설정됩니다. 그때focus()

$('button').on('click','',function(){
    var value = $(this).attr('value');
    $('input[name=item1]').val(value);
    $('input[name=item1]').focus();
});

U 대신 두의 그것은 더 간단 하나의 라인을 만들 수 있습니다 :$('input[name=item1]').val(value).focus();
inMILD

2

나는 몇몇 사람들이 위에서 제안한 것과 같은 것을 발견했습니다. 당신이 경우 focus()먼저 다음을 누르면 val()입력에, 커서는 파이어 폭스, 크롬과 IE의 입력 값의 끝에 위치 얻을 것이다. 를 val()입력 필드에 먼저 밀어 넣으면 Firefox와 Chrome이 커서를 끝에 배치하지만 IE는 focus().

$('element_identifier').focus().val('some_value') 

트릭을해야합니다 (어쨌든 항상 나를 위해).


2

처음에는 선택한 텍스트 상자 개체에 포커스를 설정하고 다음에는 값을 설정해야합니다.

$('#inputID').focus();
$('#inputID').val('someValue')

1
나는 이것을 시도했지만 작동하지 않습니다. 편집 가능한 div 콘텐츠를 true로 설정해도 작동합니까?
Rupam Datta 2013 년

1
    function focusCampo(id){
        var inputField = document.getElementById(id);
        if (inputField != null && inputField.value.length != 0){
            if (inputField.createTextRange){
                var FieldRange = inputField.createTextRange();
                FieldRange.moveStart('character',inputField.value.length);
                FieldRange.collapse();
                FieldRange.select();
            }else if (inputField.selectionStart || inputField.selectionStart == '0') {
                var elemLen = inputField.value.length;
                inputField.selectionStart = elemLen;
                inputField.selectionEnd = elemLen;
                inputField.focus();
            }
        }else{
            inputField.focus();
        }
    }

$('#urlCompany').focus(focusCampo('urlCompany'));

모든 즉 브라우저에서 작동합니다 ..


1

다음은 값을 재지 정하지 않는 하나의 라이너입니다.

$("#inp").focus()[0].setSelectionRange(99999, 99999);

0
function CurFocus()
{
    $('.txtEmail').focus(); 
}

function pageLoad()
{
   setTimeout(CurFocus(),3000);
}

window.onload = pageLoad;

0

Scorpion9의 답변이 작동합니다. 더 명확하게하기 위해 아래 코드를 참조하십시오.

<script src="~/js/jquery.js"></script> 
<script type="text/javascript">
    $(function () {
        var input = $("#SomeId");
        input.focus();
        var tmpStr = input.val();
        input.val('');
        input.val(tmpStr);
    });
</script>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.