$ .focus ()가 작동하지 않습니다


154

jQuery focus()문서마지막 예제 상태

$('#id').focus()

입력에 초점을 맞 춥니 다 (활성화). 이 작업을 수행 할 수없는 것 같습니다.

이 사이트의 콘솔에서도 검색 창을 사용하려고합니다.

$('input[name="q"]').focus()

나는 아무것도 얻지 못했습니다. 어떤 아이디어?


2
코드를 보여줄 수 있습니까?
Adil

: 그것은 나를 위해 잘 작동하기 때문에 우리는 더 알고해야합니다 jsfiddle.net/G7hwR/1가 바로 오른쪽 패널의 아무 곳이나 클릭하고 ... 초점을 맞추고
롭 G를

그래도이 페이지에 중점을 두어야합니까? 내가 제공 한 스 니펫?
Sam Selikoff

포함 된 내용에 따라 다릅니다. 내부에 없으면 페이지가 렌더링되기 전에 실행될 가능성이 있습니다.
Rob G

검색에서 온 사람들을 위해 : 브라우저에 내장 된 개발자 도구는 기능을 방해 할 수 있습니다 focus(). 더 많은 정보
aexl

답변:


392

실제로이 사이트에 중점을 둔 예제는 콘솔에 중점을 두지 않는 한 제대로 작동합니다. 작동하지 않는 이유는 개발자 콘솔에서 포커스를 훔치지 않기 때문입니다. 콘솔에서 다음 코드를 실행 한 다음 브라우저 창에서 빠르게 클릭하면 검색 상자에 초점이 맞춰집니다.

setTimeout(function() { $('input[name="q"]').focus() }, 3000);

다른 하나는 과거에 문제를 일으킨 것은 사건의 순서입니다. DOM에 첨부되지 않은 요소에 대해서는 focus ()를 호출 할 수 없습니다. 집중하려는 요소가 이미 DOM에 첨부되어 있습니까?


1
큰! 그것이 두 문제 모두에 도움이 되었습니까? 그렇다면 정답으로 표시 할 수 있습니까? 나는 그것을 높이 평가할 것이다 : D
Justin Warkentin

4
$ ( 'input [name = "q"]'). focus (); 만 사용할 때 개발자 도구를 사용하지 마십시오
Amitābha

12
와우, 몇 달 동안이 문제로 고생하고 있었지만 개발자 콘솔이 열려 있기 때문에 발생했습니다. 항상 그렇습니다. 감사합니다!
Alex Turpin

20
"DOM에 첨부되지 않은 요소에 대해서는 focus ()를 호출 할 수 없습니다." 또한 숨겨진 요소에서는 호출 할 수없는 것 같습니다.
tandrewnichols

1
setTimeout작업 순서 문제를 해결하기 위해 사용하면 유지 관리에있어 큰 고통이됩니다. 버그가 나타나면 디버깅하기가 정말 어렵습니다. 요소를 DOM에 삽입 할 때마다이를 호출해야합니다 .focus().
Kevin Beal

55

인터넷의 다른 곳에서 해결책을 찾았습니다 ...

$('#id').focus();

작동하지 않았다.

$('#id').get(0).focus();

일했다.


4
이 페이지에서 가장 인기있는 솔루션이 효과가 없었을 때 효과가 있었기 때문에이 솔루션을 상향 조정했습니다. ;-)
chriv 2016 년

두 번째 옵션은 dom 요소를 잡고 jquery 버전 대신 일반 자바 스크립트 버전을 사용하는 것 같습니다.
danielson317

7
페이지에 id가 "id"인 요소가 여러 개있을 수 있습니까? 이 경우 DOM은 깨지지 않지만 여러 요소에 포커스를 할당 할 수 없습니다
DerpyNerd

지연 시간이 0 인 window.setTimeout 으로이 작업을 수행해야한다는 것을 알았습니다. 감사. 내가 시도한 모든 것은 부트 스트랩 모달에서 실패했습니다.
웨이드 해 틀러 September

23

여기서 답변 중 일부는 setTimeout대상 요소에 초점을 맞추는 프로세스를 지연시키는 데 사용 하는 것이 좋습니다 . 그들 중 하나는 대상이 모달 대화 상자 안에 있다고 언급합니다. setTimeout사용 된 곳의 특정 세부 사항을 모르면 솔루션 의 정확성에 대해 더 이상 언급 할 수 없습니다 . 그러나 나는 내가했던 것처럼이 스레드에 빠진 사람들을 돕기 위해 여기에 답변을 제공해야한다고 생각했습니다.

문제의 간단한 사실은 아직 보이지 않는 요소에 집중할 수 없다는 것입니다 . 이 문제점이 발생 하면 초점을 맞추려고 할 때 대상이 실제로 표시되는지 확인하십시오 . 내 경우에는이 라인을 따라 뭔가를하고있었습니다.

$('#elementid').animate({left:0,duration:'slow'});
$('#elementid').focus();

이것은 작동하지 않았다. 나는 단지 내가 $를 실행시에 무슨 일이 있었는지 깨달았다 ( '# elementId로부터'). 초점 ()`콘솔에서 했던 일을. 타겟 위의 코드에서 차이는 애니메이션이 완료 되지 않았기 때문에 타겟이 실제로 보일지 확실하지 않습니다 . 그리고 단서가있다

$('#elementid').animate({left:0,duration:'slow',complete:focusFunction});

function focusFunction(){$('#elementid').focus();}

예상대로 작동합니다. 나도 처음에는 setTimeout솔루션을 넣었고 너무 효과가있었습니다. 그러나, 임의로 선택된 타임 아웃은 호스트 장치가 대상 요소가 보이는지 확인하는 프로세스가 얼마나 느리게 진행되는지에 따라 솔루션을 조만간 중단 할 수밖에 없습니다.


나에게 관련된 힌트는 "대상이 실제로 보이는지 확인하는 것"이었다. 조건부 렌더링 요소에 초점을 맞출 때 관련이 있습니다.
찰리 조각가

또는 초점을 맞출 요소가있을 때 초점이 visibility:hidden맞지 않습니다.
bakrall

`당신은 아직 보이지 않는 요소에 집중할 수 없습니다`-나는 당신을 사랑합니다. 100ms 타임 아웃을 추가하면 숨겨진 검색 창에 초점을 맞출 수 있습니다. 감사!
LuBre

시간 종료에주의하십시오. 개발 머신에서 작동하는 것은 다른 머신에서는 잘 작동하지 않을 수 있습니다.
DroidOS

15

부트 스트랩 + 모달을 사용하면 다음과 같이 작동합니다.

  $(myModal).modal('toggle');
  $(myModal).on('shown.bs.modal', function() {
    $('#modalSearchBox').focus()
  });

8

다른 사람 이이 질문을 우연히 발견하고 같은 상황을 겪을 경우를 대비하여 다른 요소를 클릭 한 후 초점을 설정하려고했지만 초점이 작동하지 않는 것 같습니다. 방금 필요한 것이 밝혀졌습니다. e.preventDefault();여기에 예가 있습니다.

$('#recipients ul li').mousedown(function(e) {
    // add recipient to list
    ...
    // focus back onto the input
    $('#message_recipient_input').focus();
    // prevent the focus from leaving
    e.preventDefault();
});

이것은 도움이되었다 :

mousedown 이벤트 핸들러에서 HTMLElement.focus ()를 호출하는 경우 HTMLElement를 벗어나지 않도록 포커스를 유지하려면 event.preventDefault ()를 호출해야합니다. 출처 : https://developer.mozilla.org/en/docs/Web/API/HTMLElement/focus


2
유일한 작품! 트리거는 팝업 div입니다. 클릭하면 div를 숨기고 텍스트 상자에 값을 넣습니다 (초점을 맞출 필요는 없음). 로 preventDefault없이 텍스트 상자는 항상 무엇을 -__- 상관없이 초점을 맞추고
rlatief

4

나는 이것이 오래되었다는 것을 알고 있지만 오늘 그것을 보았습니다. 대답 중 어느 것도 나를 위해 효과가 없었으며, 내가 찾은 것은 setTimeout이었습니다. setTimeout이 작동하여 모달의 입력에 초점을 맞추기를 원했습니다. 도움이 되었기를 바랍니다!


나도! 그리고 타임 아웃의 길이는 실제로 차이를 만들었습니다. 바보 같은 IE.
eaglei22

1
그러나 모바일 장치에서는 작동하지 않습니다. 모바일 브라우저 내부에서는 setTimeout 무엇인지 경우 모든 것을 대부분의 무시된다
Kosmonaft

1
일반적으로 사용 setTimeout하는 것은 나쁜 해결책입니다. 사용자 컴퓨터에서 실행 시간을 보장 할 수 없으므로 시간 종속적 인 항목은 매우 약합니다.
나단

3

나는 또한이 문제가 있었다. 필자의 경우 효과적 인 해결책은 HTML 요소에서 tabindex 속성을 사용하는 것이 었습니다.

나는 사용하고 있었다 ng-repeat목록 내의 일부 li 요소를 하고 있었고 .focus ()를 사용하여 첫 번째 li에 초점을 맞출 수 없었으므로 루프 동안 각 li에 tabindex 속성을 추가했습니다.

그래서 지금 <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

+1은 0부터 시작하는 인덱스입니다. 또한 .focus () 함수를 호출하기 전에 요소가 DOM에 있는지 확인하십시오.

이게 도움이 되길 바란다.


2

"$ (element) .show ()"를 사용했기 때문에 작동하지 않는 문제가있는 경우 다음 방법으로 해결했습니다.

 var textbox = $("#otherOption");
 textbox.show("fast", function () {
    textbox[0].focus();
  });

따라서 타이머가 필요하지 않으며 show 메소드가 완료된 후에 실행됩니다.


이것은 다른 전환에 적용 slideDown(), fadeIn()
알바로 곤잘레스

2

focus () 전에 지연을 추가하십시오. 200ms면 충분

function focusAndCursor(selector){
  var input = $(selector);
  setTimeout(function() {
    // this focus on last character if input isn't empty
    tmp = input.val(); input.focus().val("").blur().focus().val(tmp);
  }, 200);
}

0

이 문제가 지금 막 다시 발생했고, 믿거 나 말거나, 개발자 도구를 닫기 만하면됩니다. 분명히 콘솔 탭은 페이지 내용보다 우선 순위가 높습니다.


0

요소와 그 부모가 보이는지 확인하십시오. 숨겨진 요소에는 초점을 맞출 수 없습니다



-1

필자의 경우 탭 인덱스를 지정해야했습니다 ( -1스크립트를 통해서만 초점을 맞출 수있는 경우)

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