$ .focus () не працює


155

Останній приклад JQuery в focus()документації станів

$('#id').focus()

повинен зробити вхід орієнтованим (активним). Мені здається, це не працює.

Навіть у консолі на цьому веб-сайті я пробую це для вікна пошуку

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

і я нічого не отримую. Будь-які ідеї?


2
Чи можете ви показати нам свій код?
— Аділь

Треба буде знати більше, тому що для мене це чудово працює: jsfiddle.net/G7hwR/1 просто натисніть будь-де на правій панелі, і вона фокусується ...
— Rob G

Чи не повинен фокус на цій сторінці працювати? Фрагмент, який я надав?
— Сем Селікофф

Це залежить від того, що воно міститься; якщо це не всередині нічого, воно, ймовірно, буде запущено до того, як сторінка навіть відобразиться ...
— Роб G

Для тих, хто приходить сюди з пошуку: вбудований у браузер інструменти для розробників може заважати focus()функціональності. Більше інформації
— aexl

Відповіді:


392

Насправді той приклад, який ви дали для зосередження уваги на цьому сайті, працює чудово, доки ви не зосереджені на консолі. Причина, яка не працює, полягає просто в тому, що вона не краде фокус з консолі розробника. Якщо ви запустите наступний код у своїй консолі, а потім швидко натисніть у вікні браузера, ви побачите, що він фокусує поле пошуку:

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

Що стосується вашого іншого, то одне, що доставляло мені неприємності в минулому, - це порядок подій. Ви не можете викликати фокус () на елементі, який не був приєднаний до DOM. Елемент, на який ви намагаєтеся зосередитись, уже приєднаний до DOM?


1
Чудово! Чи допомогло це вам у вирішенні обох проблем? Якщо так, чи можете ви позначити це правильною відповіддю? Я дуже вдячний: D
— Джастін Варкентін

4
не використовуйте інструменти для розробників, коли використовуєте лише $ ('input [name = "q"]'). focus (); або не працюєте
— Amitābha

12
Нічого собі, я багато місяців боровся з цим і вимикаюсь, я лише побачив, що це спричинено тим, що консоль розробника відкрита. Моя завжди є. Дякую!
— Алекс Турпін

20
+1 для "Ви не можете викликати фокус () на елемент, який не був приєднаний до DOM." Крім того, здається, ви не можете назвати це на прихованих елементах.
— tandrewnichols

1
Використання setTimeoutдля вирішення порядку операційних завдань робить величезний біль в патуті, який потрібно підтримувати. Якщо виявляється помилка, це важко налагодити. Де б ви не вставляли елемент у DOM, він повинен зателефонувати .focus()туди.
— Кевін Біл

55

Знайшли рішення в іншому місці в мережі ...

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

не працює.

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

зробили роботу.


4
Я підтримав це рішення просто тому, що він працював на мене, коли більш популярного рішення на цій сторінці не було. ;-)
— chriv

Другий варіант просто схоже на захоплення елемента dom та використання звичайної версії javascript замість версії jquery.
— danielson317

7
Можливо, на вашій сторінці є кілька елементів з id "id"? У цьому випадку DOM не порушиться, але ви також не можете призначити фокус на декількох елементах
— DerpyNerd

Я виявив, що мені потрібно це зробити з window.setTimeout із затримкою 0, і тоді все добре. Дякую. Все інше, що я спробував, не вдалося в режимі завантаження.
— Вейд Хатлер

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

`ти не можеш зосередитись на елементі, який ще не видно` - я тебе люблю. Просто додавши час очікування в 100 м, я міг викликати фокус на моєму прихованому полі пошуку. Дякую!
— LuBre

Остерігайтеся тайм-аутів. Те, що працює на вашій розроблювальній машині, може не працювати на іншій.
— DroidOS

15

якщо ви використовуєте bootstrap + modal, це працювало для мене:

  $(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();
});

Це допомогло:

Якщо ви зателефонували до HTMLElement.focus () від обробника подій у mousedown, ви повинні зателефонувати event.preventDefault (), щоб фокус не залишав HTMLElement. Джерело: https://developer.mozilla.org/en/docs/Web/API/HTMLElement/focus


2
Єдиний працює! Тригер - це спливаюче меню, натискання приховує дів та вводить якесь значення у текстове поле (не те, на що потрібно зосереджуватись). Без prevenDefault, це текстове поле завжди зосереджене незалежно від того, на що -__-
— rlatief

4

Я усвідомлюю, що це старе, але натрапив на це сьогодні. Жодна з відповідей не працювала для мене, те, що я виявив, що працювало, було встановлено TimeTimeout. Я хотів, щоб моя увага була розміщена на вхідному файлі модального модуля, використовуючи setTimeout. Сподіваюся, це допомагає!


Я також! І тривалість тайм-ауту дійсно змінила значення. Дурний IE.
— eaglei22

1
Але це не працює на мобільних пристроях. Мобільні браузери ігнорують у більшості випадків все, що є всередині setTimeout
— Kosmonaft

1
Як правило, використання setTimeout- це погане рішення. Ви не можете гарантувати час виконання на машині користувача, тому матеріали, залежні від часу, надзвичайно крихкі.
— Натан

3

У мене теж була ця проблема. Рішення, яке працювало в моєму випадку, було використання властивості tabindex для елемента HTML.

Я використовував ng-repeatдля деяких елементів li всередині списку, і мені не вдалося привести фокус до першого li за допомогою .focus (), тому я просто додав атрибут tabindex до кожного li під час циклу.

так що тепер <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

Цей +1 індекс починається з 0. Також переконайтеся, що елемент присутній у DOM перед тим, як викликати функцію .focus ()

Я сподіваюся, що це допомагає.


2

Для тих, у кого проблема не працює, оскільки ви використовували "$ (елемент) .show ()". Я вирішив це наступним чином:

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

Тож вам не потрібен таймер, він буде виконуватися після завершення показу способу.


Це відноситься і до будь-якого іншого переходу: slideDown(), fadeIn()і т.д.
— Альваро Гонсалеса

2

Додайте затримку перед фокусуванням (). 200 мс достатньо

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

У моєму випадку мені довелося вказати індекс вкладки ( -1якщо фокусуватись лише через скрипт)

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