Редактировать: Это решение было реализовано, когда проблема была впервые обнаружена , в EmulateTab . См. getFocusedElement () .
Нашел решение сам, после перерыва в кодировании - но это не очень чистое решение. Это в основном то же решение , которое было предложено @ Neil , когда я впервые писал этот пост.
Попробуйте обновленную версию jsFiddle с фокус-слушателями и логикой try-catch в Firefox. Он объединяет :focus
, document.activeElement
и слушателей фокуса уровня документа, которые отслеживают последний «известный» сфокусированный элемент.
Функция поиска сфокусированного элемента
// Comined function to get the focused element trying as long as possible.
// Extra work done trying to avoid problems with security features around
// <input type="file" /> in Firefox (tested using 10.0.1).
function getFocused() {
// Try the well-known, recommended method first.
var $focused = $(':focus');
if ($focused.size() === 0) {
try {
// Fall back to a fast method that might fail.
// Known to fail for Firefox (tested using 10.0.1) with
// Permission denied to access property 'nodeType'.
$focused = $(document.activeElement)
}
catch (error1) {
warnToConsole("Could not use document.activeElement", document.activeElement, error1);
if (lastFocusedElement !== null) {
try {
// As a last resort, use the last known focused element.
// Has not been tested enough to be sure it works as expected.
$focused = $(lastFocusedElement);
} catch (error3) {
warnToConsole("Could not use lastFocusedElement ", lastFocusedElement, error3);
}
}
}
}
return $focused;
}
Фокус слушателей
// Keep a reference to the last focused element, use as a last resort.
var lastFocusedElement = null;
function focusInElement(event) {
lastFocusedElement = event.target;
}
function focusOutElement(event) {
lastFocusedElement = null;
}
// Start listeners.
$(function() {
// Start listeners that keep track of the last focused element.
$(document).on("focusin", focusInElement);
$(document).on("focusout", focusOutElement);
});
Мне не очень нравится это решение, поскольку оно далеко не такое чистое, как одна строка $(':focus')
. Другие ответы приветствуются!