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.