Как стать автором
Обновить

Комментарии 24

Все вкладки имеют лишь 2 состояния — Master и Slave

Сразу вспомнился срачь Replace «master/slave» terminology with «primary/replica»
Некоторое время назад (может и сейчас), VK использовал LocalStorage для коммуникации между вкладками. Он постоянно перезаписывал хранилище, чтобы другие вкладки могли прочитать. Из-за этого как только я заходит на VK (даже если всего одна вкладка), мой жёсткий диск начинал тихонько трещать, не прекращая, что очень сильно раздражало. Писал в техподдержку, сказали ничего сделать не могут. Покопался в JS коде и нашёл как отключить постоянную работу с LS, приходилось каждый раз писать команду в консоли. Хорошо хоть VK мне редко нужен был. Так и жил, пока не купил SSD.
Так написали бы юзерскрипт!
Я попытался, но почему-то не работало. Не стал разбираться.
Поделитесь командой для консоли?
Извините, уже не помню. Она была в истории команд браузера.
Эта тема меня заинтересовала.

Написал пару небольших юзерскриптов. Один подменяет localStorage, но не теряет данные, другой — удаляет его с помощью
Object.defineProperty(window, 'localStorage', { 'value': undefined });
До сих пор использует и мне жалко свой SSD. Каждую секунду перезапись queue_connection_events_queue.
Пока слишком грязно и быстро — пустой объект

curNotifier = {}


Смотреть нужно notitfier.js.
Правильнее конечно использовать метод destory

Notifier.destroy()


А для расширения (хрома например) если быстро — создаем тег script и там уже выполняем.
Добрый день.
А про алгоритм выбора мастера не понятно.
Я так понял мастер это всегда видимая вкладка, так?
А что если уйти от этого, чтоб мастером была одна из открытых и при ее закрытии снова искался мастер?
Что если мастер должен делать какие то сложные и долгие операции, и лишнее переопределение мастера за собой потянет задержку в работе и лишнюю нагрузку?
    » если мастер должен делать какие то сложные и долгие операции
По-моему, это противоречит философии мастера.
:)
Ну вот, например, подключение по веб сокету.
Стал мастером подключился, стал слейвом отключился.
Или, например, использование webRtc в мастере.
Когда я писал js api для комет сервера тоже искал мастер вкладку, в моей реализации как раз мастер держал websockets соединение. Но вовсе не обязательно что бы соединение держала именно видимая вкладка. По этому мастером в моём случаи была первая открытая вкладка, а если её закрывали то та из вкладок которая первой обнаруживала закрытие мастер вкладки.
Если интересно я могу раскрыть эту тему подробно с примерами но в рамках отдельной статьи.
У меня уже есть похожая реализация, примерно так как вы описали.
Да, конечно, было бы интересно посмотреть раскрытие этой темы, заодно сравнить со своей реализацией.
Есть риск того, что браузер как-то обделит неактивную вкладку, да и это немного не та задача, которую решает моя библиотека.
Неплохо, но на каких браузерах вы тестировали корректную работу вашей библиотеки? Например IE сейчас ведет себя некорректно в некоторых случаях. Метод window.addEventListener тоже не кроссбраузерный. Как себя поведет ваша библиотека, если localStorage по каким-то причинам не работает?
Я не проверял её во всех возможных окружениях. Это что-то вроде минималистичной реализации, которая полагается на все существующие API.
Как я понял из исходников, оно работает не только со storage. Честно говоря решение показалось мне слегка перегруженным, хотя конечно это дело вкуса. Видно что работы проделано немало и ещё сделана поддержка cross-origin resource sharing. Можете вы или StreetStrider привести примеры использования биндинга «once» в рабочих условиях? Что-то я до этого даже и не додумался.
Например, у нас есть нотификация, которая прилетает во все вкладки. Мы можем её принудительно закрыть в одной из вкладок, и она должна закрываться во всех. Тогда при конструировании нотификации можно повесить одноразовый обработчик на событие типа «нотификацию закрыли».

once хорош тем, что высвобождая функцию он высвобождает все её объекты scope, то бишь, высвобождает замыкания (если в самом замыкании нет ссылки на эту функцию, хе-хе) и всё, что в них было.
Да, у вас получилось очень широкое обилие возможностей. Честно говоря немного странный у вас стиль кода, но труда вы вложили довольно много, это видно сразу. Хотя некоторые элементы показались мне лишними, к примеру зачем мне для простой задачи коммуникации знать сколько у меня открыто вкладок, или событие при закрытии вкладки — оно реализуется в моем случае примерно так: duel.addEvent('beforeunload', function ()… Тут по сути vanilla js, а duel.addEvent — лишь кросс-браузерная обертка над window.addEventListener.
Если к примеру потребуется, чтобы остальные вкладки узнали о том, что одна из вкладок закрылась — их можно оповестить и даже с WindowID, который, опять таки, в простой задаче не требуется:

duel.addEvent('beforeunload', function () {
    someChannel.broadcast('one_of_tabs_are_closed', duel.getWindowID());
});

someChannel.on('one_of_tabs_are_closed', function (tabID) {
    console.log('on of tabs are closed:', tabID);
});
Немного ошибся: duel.addEvent(window, 'beforeunload'
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации