jQuery Focus не работает в Firefox - PullRequest
23 голосов
/ 13 августа 2011

Я тестировал заново для этого другого вопроса , когда заметил нечто очень странное. FF4 / 5 не удалось запустить событие focus jQuery. Другой вопрос , который можно считать дубликатом, был закрыт и принят без реального ответа.

Для самого вопроса я попробовал следующий простой фрагмент кода:

$('#target').focusout(function() {
    $(this).focus();
});

Хорошо работает в Chrome и IE, но не работает в FF. Вот jsFiddle для ленивых среди нас.

Может кто-нибудь объяснить это поведение? Или это известная ошибка?

Ответы [ 4 ]

48 голосов
/ 13 августа 2011

Думаю, я сталкивался с этим раньше, и, если я правильно помню, это казалось какой-то проблемой повторного входа.У меня сложилось впечатление, что, поскольку FF уже находится в процессе перехода фокуса, он не позволит вам инициировать другой переход фокуса.Я считаю, что мой обходной путь был что-то вроде

$('#target').focusout(function() {
    setTimeout(function() {
        $(this).focus();
    }, 0);
});
3 голосов
/ 13 августа 2011

Руководство говорит, что aboult .focus() call

Этот метод является ярлыком для .trigger ('focus')

и из .trigger() темы

Несмотря на то, что .trigger () имитирует активацию события, в комплекте с синтезированным объектом события, он не полностью воспроизводит естественное событие.

Итак, насколько я понимаю, вызов $(this).focus(); должен вызвать событие OnFocus (если оно есть у объекта), но не гарантируется фактическая установка / изменение сфокусированного объекта.

0 голосов
/ 07 января 2017

Фокус теперь работает в последнем Firefox без необходимости использования функции setTimeout.

Если вы также хотите выбрать поле ввода, вам придется использовать функцию .select (), хотяas document.execCommand ('SelectAll');Похоже, не работает на Firefox.

Таким образом, предварительно сфокусировав, а затем выделив поле ввода, вы можете скопировать его или сделать с ним все, что захотите.

В моем случае использования мне потребовалось скопировать URL-адрес из поля ввода, есликто-то нажал на кнопку копирования:

$(".copyURL").click(function(){ 
    $(this).prev().focus().select();
    document.execCommand("Copy",false,null);
});

Я надеюсь, что это может помочь всем, кто ищет эту проблему!

0 голосов
/ 29 июня 2015

Это сработало для меня в Firefox 38. Мне нужно было проверить разные задержки мс. Благодаря комментарию @camaleo.

$(document).ready(function() {
setTimeout(function() { $('#myid').focus(); }, 100);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...