Подтвердить что ты не робот

JQuery Фокус не работает на Firefox

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

и .trigger() тема

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

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

Ответ 3

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

$(document).ready(function() {
setTimeout(function() { $('#myid').focus(); }, 100);
});

Ответ 4

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

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

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

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

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

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