JavaScript focus () 함수를 사용하여 <div>에 집중할 수 있습니까?


227

<div>JavaScript focus()기능 사용 에 집중할 수 있습니까?

나는이 <div>태그를

<div id="tries">You have 3 tries left</div>

나는 <div>다음을 사용 하여 위의 내용에 집중하려고합니다 .

document.getElementById('tries').focus();

그러나 작동하지 않습니다. 누군가가 뭔가를 제안 할 수 있습니까 ....?


3
초점을 맞출 때 어떤 일이 일어나기를 원하십니까? 다이브는 입력을 허용하지 않으므로 테두리를 플래시하거나 배경 하이라이트 등을 플래시 하시겠습니까?
Michael Shimmins

@Michael, 그렇습니다. 사용자의 관심을 끌기 위해서는 <div>가 필요합니다 ...
OM The Eternity


1
@MichaelShimmins 및 다른 사용자는 contenteditable을 true로 설정 한 경우 <div> 요소가 입력을 승인 할 수 있습니다. (내가 조회 한 이유)
MattOlivos

1
@MichaelShimmins div는 오버플로하고 스크롤 막대를 표시하면 입력을 받아 들일 수 있습니다. 경우 div와 스크롤 바가 집중하고, 화살표 키 (대신 등 다른 원소의 콘텐츠 내용을 스크롤한다 body).
Rory O'Kane

답변:


101
window.location.hash = '#tries';

이것은 해당 요소로 스크롤하여 본질적으로 "초점"을 맞 춥니 다.


2
@Casey Chu : 파이어 폭스에서는 작동하지 않지만 아이디어가 있습니까?
Haseeb Akhtar

일부 Chrome 버전에서는 작동하지 않습니다 ... 그러나 @vinoths 솔루션이 작동합니다
Charliemops

1
이것은 작동하지만 ... Angular에서는 문제가 있습니다!!
Carlos Verdes 2019

@CarlosVerdes; Angular에 대한 솔루션이 있습니까?
Mac Vicious

3
'초점'질문에 대답하지 않으면 정답이 아니어야합니다. 제 경우에는 'contentEditable'div에 집중하고 싶습니다. 트릭이 도움이되지 않습니다.
arnaudambro

453

예-가능합니다. 그렇게하려면 tabindex를 할당해야합니다 ...

<div tabindex="0">Hello World</div>

tabindex가 0이면 "페이지의 자연 탭 순서로"태그가 배치됩니다. 숫자가 높을수록 특정 우선 순위가 부여됩니다. 여기서 1은 첫 번째, 2 초 등이됩니다.

tabindex에 -1을 부여하면 div는 사용자가 아닌 스크립트로만 초점을 맞출 수 있습니다.

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>

분명히, 다른 입력 방법으로는 초점을 맞출 수없는 스크립트로 초점을 맞출 수있는 요소를 갖는 것은 부끄러운 일입니다 (특히 사용자가 키보드 만 있거나 유사하게 제한되어있는 경우). 기본적으로 초점을 맞출 수 있고 의미있는 정보가 구워 져 사용자를 지원 하는 표준 요소가 많이 있습니다. 이 지식을 현명하게 사용하십시오.


6
@Michael Shimmins, 이것은 (비표준 방식으로) 요소에 초점을 맞출 수있게합니다 focus().
Strager

2
@Olical-마지막 줄에서 정확히 대답 할 수 있다고 확신합니다. 수정이 필요한 문제가 있다고 생각되면 알려주십시오.
Fenton

2
명확하지 않은 경우 tabindex요소에 추가 하면 초점을 맞출 수 있게되어 focus()and 및 blur()메소드를 사용할 수 있으며 다음과 같이 초점을 트리거 할 수 있습니다.document.getElementById('tries').focus();
pilau

4
안녕 @SteveOwen-그것은 여전히 ​​Firefox v42에서 작동하는 것 같습니다. 이 답변에 스 니펫을 추가하여 실행하고 테스트 할 수 있습니다.
Fenton

9
@SteveOwen을 사용하는 window.location.hash = ...것이 방법입니다. 포커스는 "관람"을 의미하는 것이 아니라 문자 그대로 해당 요소에 포커스를 두는 것을 의미합니다.
Fenton

76

document.getElementById('tries').scrollIntoView()공장. window.location.hash 위치를 고정했을 때보 다 더 효과적 입니다.


2
이 솔루션은 IE, Opera 또는 Safari에서 작동하지 않습니다.
AlecRust

1
방금 Chrome 65에서 이것을 시도했지만 작동하지 않습니다. 오버레이 div가 스크롤되어 보이지만 포커스는 여전히 백그라운드 div에 있습니다. 내가 아는 유일한 확실한 방법 tabindex은 오버레이 div에 탭 가능한 요소 ( 속성 사용) focus()를 가지고 대신 해당 요소를 사용 하는 것입니다.
thdoan

@ om-the-eternity는 이미 div가 사용자의 관심을 끌기를 원한다고 말했기 때문에 실제로 필요한 것은 (작업이 정확하지 않은 경우에도) div에 집중하지 않고 화면으로 가져 오는 것입니다. , 이것은 이것을 해결합니다
Omar Vazquez

Chrome 에서이 작업을 수행하면 여전히 초점이 맞은 입력 필드로 다시 스크롤됩니다. 특히 페이지로드가 아직 완료되지 않은 경우.
Roger Krueger

37

tabindex를 사용할 수 있습니다

<div tabindex="-1"  id="tries"></div>

tabindex 값을 사용하면 재미있는 동작을 수행 할 수 있습니다.

  • "-1"의 값을 지정하면 요소를 탭할 수 없지만 프로그래밍 방식으로 요소에 포커스를 줄 수 있습니다 (element.focus () 사용).
  • 값이 0 인 경우 키보드를 통해 요소에 초점을 맞추고 문서의 탭 흐름에 해당합니다. 0보다 큰 값은 1이 가장 중요한 우선 순위 레벨을 작성합니다.

1
와우, 멋진 트릭. 감사합니다! 나는 그렇지 않으면 이것을 알아 내지 못했을 것입니다.
AVProgrammer

생명의 은인, 감사합니다. Edge에서는 div에 초점을 맞출 수 있지만이 트릭 없이는 Chrome에 초점을 맞출 수 없습니다. 허용되는 답변은 훌륭하지만 URL에 추가 부분을 원하지 않습니다.
Cal

크롬과 파이어 폭스와 잘 작동
Susampath

14
<div id="inner" tabindex="0">
    this div can now have focus and receive keyboard events
</div>

이 기능은 Chromium / Chrome 46에서만 작동$('#inner').focus();
TNT

2

Michael Shimmin과 같은 것을 제안하고 싶지만 요소 또는 CSS에 적용된 CSS와 같은 하드 코딩은 없습니다.

jQuery를 추가 / 제거 클래스로만 사용하고 있습니다 .jquery를 사용하지 않으려면 add / removeClass를 대체해야합니다.

-자바 스크립트

function highlight(el, durationMs) { 
  el = $(el);
  el.addClass('highlighted');
  setTimeout(function() {
    el.removeClass('highlighted')
  }, durationMs || 1000);
}

highlight(document.getElementById('tries'));

--CSS

#tries {
    border: 1px solid gray;
}

#tries.highlighted {
    border: 3px solid red;
}

1

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>


0

테두리를 플래시하려면 다음을 수행하십시오.

function focusTries() {
    document.getElementById('tries').style.border = 'solid 1px #ff0000;'
    setTimeout ( clearBorder(), 1000 );
}

function clearBorder() {
    document.getElementById('tries').style.border = '';
}

테두리가 1 초 동안 빨간색으로 바뀌고 다시 제거됩니다.

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