Кросс-браузер: обнаружение размытия на окне

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

Firefox - проблемный браузер здесь.

Общий подход с использованием jQuery:

window.onblur = function() { 
   console.log('blur'); 
}
//Or the jQuery equivalent:
jQuery(window).blur(function(){
    console.log('blur');
});

Это работает в Chrome, IE и Opera, но Firefox не обнаруживает событие.

Существует ли правильный кросс-браузерный способ обнаружения события размытия окна? Или, по-другому, есть ли способ обнаружить событие размытия окна с помощью браузера Firefox?


Связанные вопросы и исследования:

6 ответов

Я попробовал оба:

document.addEventListener('blur', function(){console.log('blur')});

а также

window.addEventListener('blur', function(){console.log('blur')});

и они оба работали в моей версии FF (33.1).

Вот jsfiddle: http://jsfiddle.net/hzdd06eh/

Щелкните внутри окна "Выполнить", а затем щелкните за пределами него, чтобы вызвать эффект.

document.hasFocus ( MDN) - это реализация, которая может решить проблему с Firefox, но в Opera она не поддерживается. Таким образом, комбинированный подход может решить проблему, с которой вы сталкиваетесь.

Функция ниже иллюстрирует, как вы можете использовать этот метод:

function getDocumentFocus() {
    return document.hasFocus();
}

Поскольку ваш вопрос недостаточно ясен в отношении приложения (временное, паб / подсистема, управляемая событиями и т. Д.), Вы можете использовать вышеописанную функцию несколькими способами.

Например, проверка по времени может быть аналогична проверке, выполненной на этой скрипке ( JSFiddle).

Похоже, что jQuery больше не поддерживает эти тесты для FireFox:

Я ищу лучший способ поддержки событий размытия в Firefox, но пока я не найду лучший подход, это более актуальный статус по сравнению с первоначально принятым ответом.

Вы можете использовать метод размытия jQuery для окна, например так:

$(document).ready(function() {
  $(window).blur(function() {
    // Put your blur logic here
    alert("blur!");
  });
});

Это работает в Firefox, IE, Chrome и Opera.

Я пытался использовать функцию DOM addEventListener

window.addEventListener('blur', function(){console.log('blur')});
window.addEventListener('click', function(event){console.log(event.clientX)});

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

Вот альтернативное решение для вашего вопроса, но оно использует API видимости страницы, а решение совместимо с браузерами.

(function() {
    var hidden = "hidden";

    // Standards:
    if (hidden in document)
        document.addEventListener("visibilitychange", onchange);
    else if ((hidden = "mozHidden") in document)
        document.addEventListener("mozvisibilitychange", onchange);
    else if ((hidden = "webkitHidden") in document)
        document.addEventListener("webkitvisibilitychange", onchange);
    else if ((hidden = "msHidden") in document)
        document.addEventListener("msvisibilitychange", onchange);
    // IE 9 and lower:
    else if ("onfocusin" in document)
        document.onfocusin = document.onfocusout = onchange;
    // All others:
    else
        window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;

    function onchange(evt) {
        var v = "visible",
            h = "hidden",
            evtMap = {
                focus: v,
                focusin: v,
                pageshow: v,
                blur: h,
                focusout: h,
                pagehide: h
            };

        evt = evt || window.event;
        if (evt.type in evtMap) {
            console.log(evtMap[evt.type]);
        } else {

            console.log(this[hidden] ? "hidden" : "visible");
        }
    }

    // set the initial state (but only if browser supports the Page Visibility API)
    if (document[hidden] !== undefined)
        onchange({
            type: document[hidden] ? "blur" : "focus"
        });
})();
Другие вопросы по тегам