Можно ли прошить окно браузера с помощью Javascript?

Как и многие программы, высвечивают свое окно на панели задач/док-панели, чтобы предупредить пользователя о необходимости переключиться на программу,

Можно ли прошить окно Браузера с помощью Javascript? (Скрипты только для FireFox также приветствуются)

Это полезно для веб-чата/форума/программного обеспечения на основе сообщества, где происходит много действий в реальном времени.


person Robin Rodricks    schedule 28.01.2009    source источник
comment
Человек ... Я, должно быть, слепой ... Я перечитал вопрос 4 раза и все еще читал его без использования Javascript и был действительно сбит с толку ответами javascript.   -  person Davy8    schedule 06.08.2009


Ответы (5)


@Hexagon Theory: зачем вообще переписывать весь элемент заголовка только для того, чтобы изменить значение одного элемента в заголовке? Ваше решение ужасно неэффективно на нескольких уровнях.

<html>
<head>
<link rel="icon" href="on.png" type="image/png" id="changeMe" />
<script type="text/javascript" src="flash.js"></script>
</head>
<body>
</body>
</html>

flash.js:

function Flasher(speed) {
  var elem = document.getElementById('changeMe');

  this.timer = setTimeout(function() {
    elem.href = elem.href ==  'on.png' ? 'off.png' : 'on.png';
  }, speed);

  this.stop = function() { clearTimeout(this.timer); }
}

/* sample usage
 *
 * var flasher = new Flasher(1000);
 * flasher.stop();
 */

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

person fearphage    schedule 23.04.2009

На данный момент кажется, что только появление всплывающего диалогового окна с предупреждением помогает... это кажется мне слишком навязчивым, особенно с учетом того, для чего вы пытаетесь его использовать. Однако вместо того, чтобы заставлять его мигать, вы можете изменить document.title, чтобы привлечь внимание пользователя, либо добавив какой-либо сигнал (например, строку «NEW!») к имени сайта, а затем используя интервал, чтобы постоянно менять его на "", что создаст приятную иллюзию "мигания".

Пример голых костей:

<html>
<head>
<title>Chat System</title>
<script>
var timer, old_t = document.title, blink_amount = 5, cur_b = 0;
function notify()
 {
cur_b = 0;
timer = setInterval(function()
 {
if (cur_b < blink_amount * 2)
 {
cur_b++;
document.title = (document.title.indexOf('NEW! ') != -1) ? old_t : 'NEW! ' + old_t;
 }
else
 {
clearInterval(timer);
 }
 }, 600);
 }

notify();

// From here, it's just a matter of calling the
// notify() function whenever you detect a new message.
</script>
</head>
<body>
</body>
</html>
person Hexagon Theory    schedule 28.01.2009
comment
Проблема в том, что в системах, где на панели задач нет текстовых меток (например, OS X, Win7 и многие графические интерфейсы Linux), вы ничего не увидите. - person Steven Robbins; 28.01.2009
comment
Изменение dcument.title — лучшее, что я видел, все остальные слишком навязчивы. (Чат, встроенный в Gmail, делает это, так что у вас есть очень живой пример для решения). - person Nivas; 28.01.2009
comment
@Steve: В этих случаях вы все равно не можете мигать значком. В OSX допустимым поведением является отскок значка дока (или наложение на него значка), но я не вижу никакого способа сделать это с помощью javascript. (Fluid SSB каким-то образом делает это - я вижу количество непрочитанных сообщений Gmail на значке дока) - person Nivas; 28.01.2009

Эй, еще одно интересное решение этого вопроса пришло мне в голову только что. Почему бы не по-настоящему привлечь внимание пользователя, заставив значок мигать в его браузере? Например, вы можете создать два значка (on.png и off.png в моем примере ниже) и многократно менять их местами, чтобы привлечь внимание пользователя. Ниже приведена базовая реализация; имейте в виду, что вам потребуется ссылаться на этот сценарий удаленно или поместить его в тело страницы, поскольку он использует метод, который многократно заменяет содержимое тега <head> . Однако попробуйте; Мне больше нравится его простота.

страница.html:

<html>
<head>
<link rel="icon" href="on.png" type="image/png" />
<script type="text/javascript" src="flash.js"></script>
</head>
<body>
</body>
</html>

flash.js:

var timer, speed = 175;
function flash()
 {
head_html = document.getElementsByTagName('head')[0].innerHTML;
if (head_html.indexOf('href="on.png"') != -1)
document.getElementsByTagName('head')[0].innerHTML = head_html.replace('on.png', 'off.png');
else
document.getElementsByTagName('head')[0].innerHTML = head_html.replace('off.png', 'on.png');
timer = setTimeout('flash()', speed);
 }

function kill_flash() {clearTimeout(timer);}

flash();
person Hexagon Theory    schedule 08.02.2009
comment
Довольно интересно, но я говорил о перепрошивке кнопки панели задач браузера, а не только вкладки. И большинство браузеров отображают значок своего приложения на панели задач, а не на странице. - person Robin Rodricks; 25.04.2009

Я только что обнаружил window.getAttention() для Firefox, но он работает только при аддон называет это.

  • Windows, мигает кнопка окна на панели задач
  • Linux, некоторые оконные менеджеры подсвечивают кнопку на панели задач, другие сразу фокусируют окно
  • Macintosh, мигает значок в правом верхнем углу рабочего стола
person Robin Rodricks    schedule 05.08.2009

Window.Focus() должен делать это в Windows, но не уверен на других платформах. Вы можете обнаружить, что это выводит окно на передний план, если оно свернуто, что очень раздражает :)

person Steven Robbins    schedule 28.01.2009
comment
Window.Focus не является функцией, и window.focus() ничего не делает (Windows XP/FF3). - person I.devries; 28.01.2009
comment
window.focus() фокусирует окно браузера и выводит его на передний план. Но это не работает, если в окне открыто несколько вкладок. - person Shashwat; 21.09.2012