jquery 입력 초점에 모두 선택


326

이 코드를 사용하여 사용자가 필드에 초점을 맞출 때 필드의 모든 텍스트를 선택하려고합니다. 무슨 일이 일어 났는지, 그것은 1 초 동안 모두를 선택한 다음 선택되지 않고 입력 커서는 내가 클릭 한 곳에 남아 있습니다 ...

$("input[type=text]").focus(function() {
   $(this).select();
});

모든 것이 선택된 상태로 유지되기를 원합니다.


FF에서 어떤 브라우저로 작동합니까?
R0MANARMY

8
Chrome = 이것으로 실패
wowo_999

1
Chrome을 사용하고 있었지만 .click ()이 문제를 해결합니다 :)
Tim

4
참고 : 여기에 허용 된 답변은 문제의 절반 만 해결합니다. 선택이 작동하지만 후속 클릭으로 선택을 취소하기가 어렵습니다. 더 나은 해결책은 여기에서 찾을 수 있습니다 : stackoverflow.com/questions/3380458/...
SDC를

답변:


480

click대신에 사용해보십시오 focus. 마우스 및 주요 이벤트 모두에서 작동하는 것 같습니다 (적어도 Chrome / Mac에서는).

jQuery <버전 1.7 :

$("input[type='text']").click(function () {
   $(this).select();
});

jQuery 버전 1.7 이상 :

$("input[type='text']").on("click", function () {
   $(this).select();
});

여기 데모가 있습니다


62
문제는 더 이상 마우스로 텍스트의 일부를 선택할 수 없으며 클릭이 발생하면 전체 텍스트가 선택된다는 것입니다.
Helin Wang

6
나에게 실용적인 해결책이 아닙니다. 이것은 Wang에 의해 설명 된 문제를 만듭니다.
Marquez

1
Nianpeng의 솔루션은 마우스 텍스트 선택에도 적용됩니다.
Philibert Perusse

4
@AwQiruiGuo $ .fn.on ( 'click', ..)은 메모리를 덜 사용하고 동적으로 추가 된 자식 요소에 사용할 수 있습니다.
Ricky Boyce

7
탭할 때 필드 초점을 맞추는 데는 작동하지 않습니다.
Colin Breame

65

나는 이것이 일어나는 일이라고 생각합니다.

focus()
   UI tasks related to pre-focus
   callbacks
       select()
   UI tasks related to focus (which unselect again)

해결 방법은 select ()를 비동기 적으로 호출하여 focus () 후에 완전히 실행되도록 할 수 있습니다.

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});

3
$ ( "input [type = text]"). focus (function () {var save_this = $ (this); window.setTimeout (function () {save_this.select ();}, 100);});
etienne

@etienne : 아, 좋은 점 : this이러한 범위 에서는 처리 가 약간 예상치 못한 것입니다. 코드를 업데이트하겠습니다.
Piskvor는 건물을 떠났습니다

3
타임 아웃 값 0도 괜찮아 보이고 "focusin ()"함수도이 메서드와 함께 작동합니다.
Tanguy

4
예, 기간을 설정할 필요조차 없습니다. 현재 호출 스택의 끝에서 시간 초과가 실행되므로 0이 정상적으로 작동합니다. 즉, 포커스 및 클릭 이벤트가 모두 발생하면 기능이 실행됩니다.
Joshua Bambrick

1
시간 초과 0은 'click'이벤트가 이후 프레임에서 실행되어 상자를 다시 선택 취소하는 문제가있는 것 같습니다. 타임 아웃 10이 꽤 잘 작동하는 것 같습니다. 눈에 띄는 지연은 없지만 0보다 안정적입니다.
philh

57

이것이 더 나은 해결책이라고 생각합니다. 단순히 클릭 이벤트를 선택하는 것과 달리 마우스로 텍스트를 선택 / 편집하는 것을 막을 수는 없습니다. IE8을 포함한 주요 렌더링 엔진과 함께 작동합니다.

$('input').on('focus', function (e) {
    $(this)
        .one('mouseup', function () {
            $(this).select();
            return false;
        })
        .select();
});

http://jsfiddle.net/25Mab/9/


4
이것은 기존 필드에서만 작동합니다. 여기에 새 입력 필드에 바인딩하기위한 업데이트가 있습니다. jsfiddle.net
adriaan

때때로 클릭없이 초점을 맞출 수 있으며,이를 통해 잘 처리됩니다. 그 때문에, 나에게이 깨끗한 대답은 -의 setTimeout보다 훨씬 더 ... 일부 매달려 이벤트 리스너 각 입력에 초점이 맞춰 시간이 아닌 클릭하여이있을 수있다하더라도
ilovett

이를 통해 숫자 입력 내에서 두 번 클릭하여 마우스로 텍스트의 다른 부분을 선택할 수 없습니다. 두 번째를 제거하면 효과가있는 select()것 같습니다.
dperish

추가로 더 나은$('input[autofocus]').select();
다니엘 Bleisteiner

38

여기에 괜찮은 답변이 있으며 @ user2072367이 내가 가장 좋아하는 곳이지만 클릭이 아닌 탭을 통해 초점을 맞출 때 예기치 않은 결과가 발생합니다. (예기치 않은 결과 : 탭을 통해 초점을 맞춘 후 텍스트를 정상적으로 선택하려면 한 번 더 클릭해야합니다)

이 바이올린 은 작은 버그를 수정하고 중복 DOM 선택을 피하기 위해 변수에 $ (this)를 추가로 저장합니다. 확인 해봐! (:

IE> 8에서 테스트

$('input').on('focus', function() {
    var $this = $(this)
        .one('mouseup.mouseupSelect', function() {
            $this.select();
            return false;
        })
        .one('mousedown', function() {
            // compensate for untriggered 'mouseup' caused by focus via tab
            $this.off('mouseup.mouseupSelect');
        })
        .select();
});

2
+1 귀하와 @ user2072367의 솔루션은이 전체 스레드에서 가장 깨끗하며 더 빨리 최고를 얻을 수있는 방법이 있었기를 바랍니다.
KyleMit

1
사용자가 모든 텍스트를 직접 선택하려고해도 작동합니다.
Vitani

나에게 이것은 Windows 8.1의 ie11에서 작동하지 않습니다. 그것은 10 윈도우 7과 윈도우에 IE11에서 작업을 수행
라스 토마스 Bredland

1
@LarsThomasBredland 방금 8.1 + ie11 승리를 시도했지만 예상대로 작동합니다. 당신을 위해 "작동하지 않는"것은 무엇입니까?
animatedgif

아무것도 선택하지 않습니다. (나는 다른 win8에서 테스트 그리고이 작업을 수행 - 같은 운영 체제 레벨, 즉 버전)
라스 토마스 Bredland을

21

주의 깊게 검토 한 후이 스레드 내에서 훨씬 깨끗한 솔루션으로 제안합니다.

$("input").focus(function(){
    $(this).on("click.a keyup.a", function(e){      
        $(this).off("click.a keyup.a").select();
    });
});

jsFiddle의 데모

문제 :

다음은 약간의 설명입니다.

먼저, 마우스를 움직이거나 필드를 탭할 때 이벤트 순서를 살펴 보겠습니다.
다음과 같이 모든 관련 이벤트를 기록 할 수 있습니다.

$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });

포커스 이벤트

참고 : 이벤트 파이프 라인에서 나중에 발생 하는 click대신 이 솔루션을 사용하도록 변경 mouseup했으며 @Jocie의 의견에 따라 firefox에서 일부 문제를 일으키는 것으로 보입니다.

일부 브라우저는 mouseup또는 click이벤트 중에 커서를 배치하려고 합니다. 캐럿을 한 위치에서 시작하고 위로 드래그하여 일부 텍스트를 강조 할 수 있기 때문에 이치에 맞습니다. 실제로 마우스를 들어 올릴 때까지 캐럿 위치를 지정할 수 없습니다. 따라서 처리 focus하는 함수가 너무 일찍 응답하여 페이징되어 브라우저가 위치를 재정의하도록합니다.

그러나 문제는 우리가 실제로 초점 이벤트를 처리하고 싶다는 것입니다. 누군가가 현장에 처음 들어 왔을 때 알려줍니다. 그 후에는 사용자 선택 동작을 계속 무시하고 싶지 않습니다.

해결책:

대신, focus이벤트 처리기 내에서 시작 하려는 click(클릭 인) 및 keyup(탭 인) 이벤트 에 대한 리스너를 빠르게 연결할 수 있습니다 .

참고 : 탭 이벤트의 키 업은 실제로 이전 입력 필드가 아닌 새 입력 필드에서 발생합니다

한 번만 이벤트를 시작하려고합니다. 사용할 수는 .one("click keyup)있지만 각 이벤트 유형에 대해 이벤트 핸들러를 한 번 호출합니다 . 대신 mouseup 또는 keyup을 누르는 즉시 함수를 호출합니다. 가장 먼저 할 일은 둘 다 처리기를 제거하는 것입니다. 그렇게하면 탭이나 마우스로 입력했는지 여부는 중요하지 않습니다. 함수는 정확히 한 번만 실행되어야합니다.

참고 : 대부분의 브라우저는 탭 이벤트 중에 자연스럽게 모든 텍스트를 선택하지만 animatedgif가 지적한 것처럼keyup 이벤트 를 처리하려고합니다 . 그렇지 않으면 이벤트 를 처리 mouseup할 때마다 이벤트가 계속 남아 있습니다. 선택을 처리하자마자 리스너에서

이제 전화 할 수 있습니다 select() 브라우저가 선택한 후에 있으므로 기본 동작을 무시합니다.

마지막으로, 추가적인 보호 를 위해 and 네임 스페이스이벤트 네임 스페이스 를 추가 하여 메소드가 다른 리스너를 제거하지 않도록 할 수 있습니다.mouseupkeyup.off()


IE 10 이상, FF 28 이상 및 Chrome 35 이상에서 테스트


또는 호출once함수로 jQuery를 확장하려는 경우 이벤트 수에 대해 정확히 한 번만 발생합니다 .

$.fn.once = function (events, callback) {
    return this.each(function () {
        var myCallback = function (e) {
            callback.call(this, e);
            $(this).off(events, myCallback);
        };
        $(this).on(events, myCallback);
    });
};

그런 다음 코드를 다음과 같이 더 단순화 할 수 있습니다.

$("input").focus(function(){
    $(this).once("click keyup", function(e){      
        $(this).select();
    });
});

바이올린 데모


Windows의 Firefox 31에서 코드는 두 개의 텍스트 상자 사이를 클릭 할 때마다 클릭 할 때마다 텍스트를 선택합니다.
Vitani

1
@Jocie, 왜 대체되는지 잘 모르겠지만 FF가 click이벤트보다 텍스트 선택을 처리하는 것처럼 보입니다 mouseup. 브라우저를 재정의 할 가능성을 최대한 높이기 위해 가능한 한 늦게 선택의 끝을 처리하고 싶기 때문에 mouseup 대신 click을 사용하여 트릭을 수행해야합니다. FF, Chrome 및 IE에서 테스트되었습니다.
KyleMit

1
감사합니다! 마침내 모든 브라우저에서 실제로 작동하는 솔루션!
Vincent

1
예! 이것은 나에게도 효과가 있었다! 감사합니다. 이것은 공식적인 답변이어야합니다
Fandango68

1
@RiZKiT one는 " 이벤트 유형별로 요소 마다 한 번씩 실행되는 핸들러입니다. 실행 한 이벤트 는 자동으로 해제되지만 다른 이벤트는 계속 유지 off되며 어쨌든 처리됩니다. 질문 : 여러 이벤트에 대해 정확히 한 번만 발생하는 기능
KyleMit

13

이것은 작업을 수행하고 더 이상 마우스로 텍스트의 일부를 선택할 수없는 문제를 피합니다.

$("input[type=text]").click(function() {
    if(!$(this).hasClass("selected")) {
        $(this).select();
        $(this).addClass("selected");
    }
});
$("input[type=text]").blur(function() {
    if($(this).hasClass("selected")) {
        $(this).removeClass("selected");
    }
});

1
마우스로 텍스트의 일부를 선택하는 기능을 유지하는 것이 중요합니다. 나는이와 A1 사용하고
Philibert에 Perusse

2
너무 많은 일이 벌어지면 user2072367의 포커스 /
George

@George user2072367은 꽤 좋지만 심각한 결함이 있습니다. 내 솔루션을 확인하십시오 (:
animatedgif

6

이 버전은 iOS에서 작동하며 Windows 크롬에서 표준 드래그하여 선택을 수정합니다.

var srcEvent = null;

$("input[type=text],input[type=number]")

    .mousedown(function (event) {
        srcEvent = event;
    })

    .mouseup(function (event) {
        var delta = Math.abs(event.clientX - srcEvent.clientX) 
                  + Math.abs(event.clientY - srcEvent.clientY);

        var threshold = 2;
        if (delta <= threshold) {
                   try {
                        // ios likes this but windows-chrome does not on number fields
                        $(this)[0].selectionStart = 0;
                        $(this)[0].selectionEnd = 1000;
                    } catch (e) {
                        // windows-chrome likes this
                        $(this).select();
                    }
        }
    });

http://jsfiddle.net/Zx2sc/2/


브라우저를 달래기 위해 못생긴 try / catch를 추가하도록 편집
anihilnine

5

이러한 솔루션의 대부분의 문제점은 입력 필드 내에서 커서 위치를 변경할 때 올바르게 작동하지 않는다는 것입니다.

onmouseup이벤트 후 해고 분야 내에서 커서의 위치 변경 onfocus(적어도 크롬과 FF 내를). 무조건 폐기하면 mouseup사용자는 마우스로 커서 위치를 변경할 수 없습니다.

function selectOnFocus(input) {
    input.each(function (index, elem) {
        var jelem = $(elem);
        var ignoreNextMouseUp = false;

        jelem.mousedown(function () {
            if (document.activeElement !== elem) {
                ignoreNextMouseUp = true;
            }
        });
        jelem.mouseup(function (ev) {
            if (ignoreNextMouseUp) {
                ev.preventDefault();
                ignoreNextMouseUp = false;
            }
        });
        jelem.focus(function () {
            jelem.select();
        });
    });
}
selectOnFocus($("#myInputElement"));

mouseup필드에 현재 포커스가없는 경우 코드는 기본적으로 기본 동작을 방지합니다 . 다음과 같은 경우에 작동합니다.

  • 필드에 포커스가 없을 때 클릭
  • 필드에 포커스가있을 때 클릭
  • 현장으로 태핑

Chrome 31, FF 26 및 IE 11에서 이것을 테스트했습니다.


이것은 클릭 이벤트에 완벽하게 작동하지만 탭을 사용하여 다음 입력 필드로 이동하면 내용이 나중에 선택되고 선택 해제되는 것을 볼 수 있습니다.
ToX 82

4

이 글타래를 읽는 멋진 해결책을 찾았습니다.

$(function(){

    jQuery.selectText('input:text');
    jQuery.selectText('input:password');

});

jQuery.extend( {
    selectText: function(s) { 
        $(s).live('focus',function() {
            var self = $(this);
            setTimeout(function() {self.select();}, 0);
        });
    }
});

... 이것은 본질적 으로 Piskvor와 같은 대답 입니다.
Oliver

'input [type = email]'과 같은 다른 모든 HTML5 텍스트 유형을 잊지 마십시오.
jamiebarrow

3

나는 2016 년 말에 왔으며이 코드는 최신 버전의 jquery (이 경우 jquery-2.1.3.js)에서만 작동합니다.

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}

2

FF 16.0.2 및 jquery 1.8.3을 사용하면 답변의 모든 코드가 작동하지 않았습니다.
나는 이와 같은 코드를 사용하고 작동합니다.

$("input[type=text]").focus().select();

4
사용자가 필드에 초점을 맞출 때 입력 상자의 내용을 선택하는 방법 인 질문에 대답하지 않습니다 . 사용자 입력없이 즉시 코드에 초점을 맞추고 코드를 선택합니다.
saluce

@saluce 나는 당신이 무슨 뜻인지 이해하지 못합니까? 질문자가 원하는 것은 필드를 선택할 때 모든 현재 텍스트가 선택됩니다. 그리고 내 코드는 그렇게해야합니다. 나는이 답변을 쓸 때로 내 프로젝트에도 사용합니다.
GusDeCooL

1
이 코드는 실행될 때 모든 것에 초점을 맞추고 선택하지만 코드 자체 는 텍스트 상자 클릭과 같은 사용자 생성 이벤트 와 관련이 없습니다 . 예를 들어, $("input[type=text]").on('click', function () { $(this).focus.select(); })사용자가 상자를 클릭하면 실행되므로 사용자가 상자를 클릭하면 포커스가 발생하고 선택이 발생합니다. 이벤트 핸들러가 없으면 코드는 질문에 대답하지 않으므로 downvote 및 comment입니다. 기본적으로 "현재 텍스트가 모두 선택되어"있지만 "필드를 선택할 때"부분은 없습니다.
saluce

1
이 :)에 그랬던 것처럼 충분히 재미있게 (이 정확하지 비록 그가 무엇을 요구) @GusDeCooL 나는 같은 결과에 원
로비 에버 릴에게

2
var timeOutSelect;
$("input[type=text]").focus(function() { 
        var save_this = $(this);
        clearTimeout(timeOutSelect);
        timeOutSelect = window.setTimeout (function(){ 
                save_this.select(); 
        }, 100);
});

두 입력간에 빠르게 전환 할 경우 보안을 강화하려면 clearTimeout을 사용하십시오. clearTimeout 이전 시간 초과를 정리하십시오 ...


자세한 내용으로 편집하십시오. 검색 가능한 콘텐츠가 포함되어 있지 않으며 누군가 "이 작업을 시도해야하는 이유"를 설명하지 않기 때문에 코드 전용 및 "이것을 시도하십시오"답변은 권장되지 않습니다. 우리는 지식의 원천이되기 위해 노력합니다.
브라이언 톰셋-汤 莱恩

2

기본 JavaScript와 잘 작동합니다 select().

$("input[type=text]").focus(function(event) {
   event.currentTarget.select();
});

또는 일반적으로 :

$("input[type=text]")[0].select()

1

또는 <input onclick="select()">Works를 완벽하게 사용할 수 있습니다 .


아뇨. 그것은 전체를 선택하는 데 효과적입니다. 그러나 텍스트의 일부를 수동으로 선택하면 시도 할 수 없습니다.
Sujay Phadke


0
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>

현재 상황에 대한 설명이 없기 때문에 품질이 낮은 답변으로 표시 될 수 있습니다.
tumultous_rooster

당신의 말이 $.ready맞지 않습니다. attr문서가 준비 될 때까지 지연되도록 함수를 전달해야합니다 . 즉시 수행하고 요소 컬렉션을에 전달합니다 $.ready.
doug65536

또한 특히 'onclick'을 피하십시오. 사용하십시오 addEventListener.
doug65536

0

나는 항상 requestAnimationFrame()내부 이벤트 후 메커니즘을 뛰어 넘으며 Firefox에서 완벽하게 작동합니다. Chrome에서 테스트하지 않았습니다.

$("input[type=text]").on('focus', function() {
    requestAnimationFrame(() => $(this).select());
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.