Заставить окно браузера мигать на панели задач


106

Как заставить браузер пользователя мигать / мигать / выделяться на панели задач с помощью JavaScript? Например, если я делаю запрос AJAX каждые 10 секунд, чтобы узнать, есть ли у пользователя какие-либо новые сообщения на сервере, я хочу, чтобы пользователь сразу узнал об этом, даже если он в это время использует другое приложение.

Изменить: эти пользователи действительно хотят отвлекаться, когда приходит новое сообщение.


7
странно, почта Yahoo делает это, интересно, как это
Ayyash

Ответы:


86

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

newExcitingAlerts = (function () {
    var oldTitle = document.title;
    var msg = "New!";
    var timeoutId;
    var blink = function() { document.title = document.title == msg ? ' ' : msg; };
    var clear = function() {
        clearInterval(timeoutId);
        document.title = oldTitle;
        window.onmousemove = null;
        timeoutId = null;
    };
    return function () {
        if (!timeoutId) {
            timeoutId = setInterval(blink, 1000);
            window.onmousemove = clear;
        }
    };
}());

Обновление : вы можете использовать уведомления HTML5 .


1
Я не мог заставить это работать, как описано в IE 8. Заголовок постоянно мигал. Вместо использования onmousemove мне пришлось использовать onfocus и onblur, чтобы отслеживать, когда окно было в фокусе или нет, и останавливать мигание в функции onfocus. Поэтому, когда страница загружается, я регистрирую функции onfocus и onblur, которые переключают логическую «сфокусированную» переменную. У меня есть еще одно логическое значение, чтобы отслеживать, когда началось мигание. В onfocus, если моргание началось, прекращаю.
Peter M

4
Это не работает в Chrome ... Я не думаю, что Chrome понимает, что пустая строка - это что-то. Если я использую дефис в качестве «пустого» сообщения, все работает нормально.
Джон Бубриски

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

2
В Windows 7 изменение заголовка не мигает / не мигает на панели задач
Чанд

1
Как передать этому аргументы (сообщение)?
shinzou

54

Я сделал плагин jQuery для того, чтобы сообщения уведомлений мигали в строке заголовка браузера. Вы можете указать различные параметры, такие как интервал мигания, продолжительность, если мигание должно прекратиться, когда окно / вкладка сфокусируется и т. Д. Плагин работает в Firefox, Chrome, Safari, IE6, IE7 и IE8.

Вот пример того, как его использовать:

$.titleAlert("New mail!", {
    requireBlur:true,
    stopOnFocus:true,
    interval:600
});

Если вы не используете jQuery, вы все равно можете посмотреть исходный код (есть несколько причудливых ошибок и крайних случаев, которые вам нужно исправить при мигании заголовка, если вы хотите полностью поддерживать все основные браузеры).


6

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

Если вы уверены, что хотите сделать это таким образом, используйте окно предупреждения javascript. Это то, что Google Calendar делает для напоминаний о мероприятиях, и они, вероятно, задумались над этим.

Веб-страница действительно не лучшее средство для оповещений о необходимости. Если вы разрабатываете что-то вроде «ZOMG, серверы не работают!» оповещения, автоматические электронные письма или SMS-сообщения нужным людям могут помочь.


11
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под его сообщением.
secretformula

2
@secretformula действительно ли нужно выкапывать посты 5-летней давности и отмечать их как некачественные?
Taifun

2
@Taifun, он появился в очереди VLQF, так что да, это так. Мета тоже это обсуждала
secretformula

@secretformula, это действительно дает очень хороший ответ на вопрос: используйте JavaScript alert.
Сэм

неверно или нет, мне это не кажется ответом, но история показывает, что 2 модератора уже отклонили флаг NAA, поэтому я придерживаюсь здесь консенсуса.
Жан-Франсуа Фабр

6

Предположительно, вы можете сделать это в Windows с рычанием для Windows javascript API:

http://ajaxian.com/archives/growls-for-windows-and-a-web-notification-api

Тем не менее, вашим пользователям придется установить рычание.

В конце концов это станет частью механизма Google в виде NotificationAPI:

http://code.google.com/p/gears/wiki/NotificationAPI

Поэтому я бы порекомендовал пока использовать подход рычания, возвращаясь к обновлениям заголовков окон, если это возможно, и уже занимаясь разработкой попыток использовать API уведомлений Gears, когда он в конечном итоге станет доступным.


5
                var oldTitle = document.title;
                var msg = "New Popup!";
                var timeoutId = false;

                var blink = function() {
                    document.title = document.title == msg ? oldTitle : msg;//Modify Title in case a popup

                    if(document.hasFocus())//Stop blinking and restore the Application Title
                    {
                        document.title = oldTitle;
                        clearInterval(timeoutId);
                    }                       
                };

                if (!timeoutId) {
                    timeoutId = setInterval(blink, 500);//Initiate the Blink Call
                };//Blink logic 

3

Единственный способ, которым я могу это сделать, - это сделать что-то вроде предупреждения («у вас есть новое сообщение») при получении сообщения. Панель задач будет мигать, если окно свернуто, но также откроется диалоговое окно, которое может вам не понадобиться.


1
Несоответствие между текущими браузерами - каждый ведет себя по-разному, и ни один из них не заставляет мигать значок панели задач (протестировано Win8 - IE10, Chrome, Firefox)
danwellman

3

Почему бы не воспользоваться подходом, который использует GMail, и не показывать количество сообщений в заголовке страницы?

Иногда пользователи не хотят отвлекаться, когда приходит новое сообщение.


2

Вы можете попробовать window.focus () - но это может раздражать, если экран переключается


1

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

document.title = "[user] hello world";

1

AFAIK, нет хорошего способа сделать это последовательно. Я писал веб-клиент IM только для IE. В итоге мы использовали window.focus (), который работает большую часть времени. Иногда это действительно приводит к тому, что окно крадет фокус у приложения переднего плана, что может сильно раздражать.


0

Эти пользователи хотят отвлекаться, когда приходит новое сообщение.

Похоже, вы пишете приложение для внутреннего проекта компании.

Возможно, вы захотите написать небольшое приложение для Windows в .net, которое добавляет значок уведомления, а затем может создавать необычные всплывающие окна, всплывающие окна или что-то еще, когда они получают новые сообщения.

Это не слишком сложно, и я уверен, что если вы спросите ТАК: «Как мне показать значок в трее» и «как мне сделать всплывающие уведомления», вы получите отличные ответы :-)

Для записи, я почти уверен, что (кроме использования диалогового окна с предупреждением / приглашением) вы не можете прошить панель задач в JS, поскольку это сильно зависит от Windows, а JS действительно так не работает. Вы можете использовать некоторые элементы управления ActiveX для Windows, специфичные для IE, но тогда вы навязываете IE своим бедным пользователям. Не делай этого :-(


0
function blinkTab() {
        const browserTitle = document.title;
        let timeoutId;
        let message = 'My New Title';

        const stopBlinking = () => {
            document.title = browserTitle;
            clearInterval(timeoutId);
        };

        const startBlinking = () => {
            document.title = document.title  === message ? browserTitle : message;
        };

        function registerEvents() {
            window.addEventListener("focus", function(event) { 
                stopBlinking();
            });

            window.addEventListener("blur", function(event) {
                const timeoutId = setInterval(startBlinking, 500);
            });
        };

        registerEvents();
    };


    blinkTab();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.