- PVSM.RU - https://www.pvsm.ru -

Общение между окнами одного браузера средствами cookie

Статья будет очень короткой, но описывает неплохой способ обмена данными между окнами в одном браузере.

Способ поможет нам среагировать на событие, которое произошло в другом окне. Например, как это делает VK — когда в одной вкладке у нас играет музыка, а в другой мы открываем видео или включаем другой трек.


Решение кросс-браузерное, сейчас к сожалению нет возможности проверить его на телефоне/планшете, но думаю, что всё должно работать.

Итак, решение простое и достаточно изящное — через cookie.

Я использовал jQuery и плагин jquery.cookie, но это всё можно реализовать и нативными средствами самого js без обёртки.

Итак, у нас есть «слушалка» изменений cookie:

var lastState = 0;

$(document).ready(function()
{
    cookieTimer();
});

function cookieTimer()
{
    var t = $.cookie('state');
    if(t != lastState)
    {
        lastState = t;
        $('#stateLog').append('<div>New state: ' + t + '</div>');
    }
    window.setTimeout(cookieTimer, 500);
}

Мы раз в пол секунды проверяем данные в куке «state» и, если они изменились — реагируем на событие, в данном случае мы просто выводим данные на экран. А также, записываем текущее состояние в переменную lastState.

Вторым скриптом мы будем менять данные:

<button onclick="$.cookie('state', new Date().getTime());">Set new state</button>

Устанавливаем текущий timestamp в куку state.

Также, мы можем установить что-либо в куку state_, например «audio.stop», где timestamp — текущий timestamp, который мы установили в куку state, чтобы остальные окна знали как реагировать на наше событие.

Демо на jsfiddle: слушалка [1] (открываем) и устанавливалка [2] (открываем и нажимаем на кнопку, затем смотрим в предыдущее окно).

Демо 2 в 1 [3]

Автор: Vidog

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/25812

Ссылки в тексте:

[1] слушалка: http://jsfiddle.net/LBHaQ/

[2] устанавливалка: http://jsfiddle.net/AZ2WP/

[3] Демо 2 в 1: http://jsfiddle.net/LBHaQ/2/embedded/result/

[4] Источник: http://habrahabr.ru/post/167265/