Чи можна зосередитись на <div>, використовуючи функцію JavaScript focus ()?


227

Чи можна зосередитись на <div>використанні focus()функції JavaScript ?

У мене є <div>тег

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

Я намагаюся зосередитись на сказаному вище <div>:

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

Але це не працює. Може хтось щось підказав ....?


3
Що ви хочете статися, коли ви «фокусуєтесь» на ньому? Divs не приймають введення, тож ви хочете прошивати рамку або просвічувати фонову підсвітку тощо?
Майкл Шиммінс

@Michael, так, мені потрібно, щоб <div> привернути увагу користувачів ...
OM The Eternity,


1
@MichaelShimmins та будь-хто інший, <div> елементи можуть приймати введення, якщо для вас встановлено значення true. (Причина, чому я запитав)
MattOlivos

1
@MichaelShimmins divs може приймати дані, якщо вони переповнюються та показують смугу прокрутки. Якщо divфокус a із смугою прокрутки, клавіші зі стрілками прокручують його вміст (замість вмісту інших елементів, таких як body).
Rory O'Kane

Відповіді:


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

Це буде прокручувати до елемента, про який йде мова, по суті "фокусуючи" його.


2
@Casey Chu: Його добре працює, тобто, але не в firefox, чи маєте ви ідею?
Хазеб Ахтар

Він не працює в деяких версіях Chrome ... Однак рішення @vinoths це робить
Charliemops

1
Це працює, але ... з Angular у вас виникнуть проблеми !!
Карлос Вердес

@CarlosVerdes; Чи є рішення для Angular?
Mac Vicious

3
не відповідаючи на питання "фокус", це не повинно бути правильною відповіддю. у моєму випадку я хочу зосередитись на розділі "contentEditable", і ваш трюк не допоможе.
arnaudambro

453

Так - це можливо. Для цього вам потрібно призначити табіндекс ...

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

У tabindex 0 буде розміщено тег "у порядку природного вкладки сторінки". Більше число надасть йому певного порядку пріоритету, де 1 буде першим, 2 другим тощо.

Ви також можете надати табіндекс -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>

Очевидно, прикро мати елемент, на якому можна фокусуватись за сценарієм, на який ви не можете зосередитись іншим способом введення (особливо якщо користувач має лише клавіатуру або подібне обмеження). Існує також ціла купа стандартних елементів, які за замовчуванням орієнтуються і містять семантичну інформацію, щоб допомогти користувачам. Використовуйте ці знання розумно.


6
@Michael Shimmins. Це дозволяє елементу бути орієнтованим (нестандартним способом!) За допомогою focus().
страгер

2
@Olical - я майже впевнений, що саме це може сказати в останньому рядку. Повідомте мене, якщо ви вважаєте, що існує проблема, яка потребує редагування.
Фентон

2
Якщо це було не зрозуміло, додавання tabindexдо елемента зробить його фокусируемим, що дозволяє focus()і blur()методам, і тоді ви можете запустити фокус так:document.getElementById('tries').focus();
pilau

4
Привіт @SteveOwen - це, здається, все ще працює у Firefox v42. Я додав фрагмент до цієї відповіді, щоб ви могли запустити його і протестувати.
Фентон

9
@SteveOwen window.location.hash = ...- це зробити це. фокус не означає "привести до перегляду", це просто означає буквально розмістити фокус на цьому елементі.
Фентон

76

document.getElementById('tries').scrollIntoView()працює. Це працює краще, ніж у window.location.hash випадку фіксованого позиціонування.


2
Зауважте, що це рішення не працюватиме в IE, Opera або Safari.
AlecRust

1
Я просто спробував це в Chrome 65, і це не працює. Дієвий накладення прокручується до перегляду, але фокус все ще знаходиться у фоновому розділі. Єдиний я впевнений спосіб, коли я знаю, - це розміщувати елемент табуляції (використовуючи tabindexатрибут) у накладному диві та використовувати focus()замість цього елемента.
thoan

@ om-the-eternity вже заявив, що він хоче, щоб div привернув увагу користувача, тому те, що йому потрібно, - це не насправді фокусуватись (навіть коли це не правильно робити) діва, а вивести його на екран , це вирішує це
Омар Васкес

Якщо я це роблю в Chrome, він продовжує прокручуватися до ще зосередженого поля введення. Особливо, якщо сторінка ще не завантажена.
Роджер Крюгер

37

Можна використовувати табіндекс

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

Значення tabindex може спричинити цікаву поведінку.

  • Якщо присвоєно значення "-1", елемент не може бути вкладений до вкладки, але фокус може бути наданий елементу програмно (використовуючи element.focus ()).
  • Якщо задано значення 0, елемент може бути сфокусований за допомогою клавіатури і потрапляє в потік документа вкладки. Значення, що перевищують 0, створюють рівень пріоритетності, а 1 є найважливішим.

1
Нічого, дякую крутому фокусу. Дякую! Я б не зрозумів цього інакше.
AVProgrammer

Життєзбереження, дякую. В Edge можна без цього фокусу зосередитись, але не в Chrome. Прийнята відповідь чудова, але я не хочу додаткової участі в URL-адресі.
Кал

врятуй життя. Працює чудово з хромом та
фаєрфоксами

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

Для мене це працює лише в Chromium / Chrome 46, в поєднанні з$('#inner').focus();
TNT

2

Я хотів запропонувати щось на кшталт Майкла Шимміна, але без жорсткого кодування таких речей, як елемент, або CSS, який застосовується до нього.

Я використовую лише jQuery для класу add / delete, якщо ви не хочете використовувати jquery, вам просто потрібна заміна на add / removeClass

--Javascript

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 секунди, а потім видаліть його знову.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.