Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Идея как бы livereload в браузере (https://javascript.ru/forum/css-html/78153-ideya-kak-livereload-v-brauzere.html)

MC-XOBAHCK 02.08.2019 21:45

Идея как бы livereload в браузере
 
У меня два монитора. В обоих мониторах открыт браузер Google Chrome.
В первом - админка сайта, редактирование записи.
Во втором - фронт сайта, где открыта редактируемая в первом мониторе (в админке) запись.

Идея - при сохранении записи в админке, чтобы обновлялась страница во втором открытом браузере. Сделать что то типа livereload'а, чтобы страница сама обновлялась.

Если не ошибаюсь, такое можно реализовать, но есть сомнения. Не будет ли помехой то что страница находится во втором экземпляре браузера?

Подскажите, такое же реально реализовать или я ошибаюсь?

j0hnik 03.08.2019 02:14

browser Sync используй, отлично работает, не только на втором мониторе, на всех устройствах в одной сети будут обновляться.
https://youtu.be/9qbdCruqpys?t=5108
вот тут видео гайд даже есть (что и зачем)

MC-XOBAHCK 03.08.2019 11:36

j0hnik, спасибо за совет, но я знаю что такое browser Sync, это не подходит.

Есть сайт. Он работает в сети, то есть не локально, а находится на php-хостинге.
Хочу чтобы при редактировании статьи в админке (при сохранении) - во втором окне браузера Chrome обновлялась страница сайта с этой редактируемой статьёй.

Начал писать расширение для Chrome, но у меня на это уйдёт много времени.
Я последний раз в конце зимы писал расширение для хрома, потом вообще на два месяца выпал из кодирования, так как у меня потух мой старый комп. Ждал пока новый комп из китая приедет. Повезло что мыло вспомнил и смог восстановить аккаунт здесь на форуме.

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

j0hnik 03.08.2019 16:53

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

Aetae 03.08.2019 18:19

Нормально общаются - главное чтоб асинхронно. Можно через SharedWorker, можно через событие 'storage'... Подключаешь скрипт для авторизованного админа и погнал.

MC-XOBAHCK 03.08.2019 18:31

Цитата:

Сообщение от j0hnik (Сообщение 511158)
напишите простейший скрип который будет спрашивать дату изменения, добавьте временно, потом удалите.

Сохранение статьи происходит через ajax. Событие что статья сохранена отлавливаю через мутатор. Тут всё норм.

Далее отправляю сообщение в фоновый скрипт (background.js):
let urlFrontPage = 'https://example.com/category/article';

chrome.runtime.sendMessage({
    url: urlFrontPage,
    updateFrontPage: true    // идентификатор для слушателя в файле background.js
});



И теперь вроде бы осталось самое простое, в файле background.js ставлю слушатель:
chrome.runtime.onMessage.addListener(
    function (request, sender) {

        if (request.updateFrontPage) {

            /**
             * Получить id вкладки у которой урл == request.url
             */
            chrome.tabs.query({url: request.url}, function (tabs) {
                
            });

            
            /**
             * Обновить вкладку
             */
            chrome.tabs.update( tabId ); // ???
        }

    }
);


Но не могу понять из документации https://developer.chrome.com/extensi...s#method-query как получить id вкладки, которую нужно обновить. Возможно ещё нужно и id окна в котором вкладка находится получить.

Смотрю в метод обновляющий вкладку https://developer.chrome.com/extensi...#method-update вроде бы достаточно только id вкладки.

В общем тыкаюсь пока как id вкладки получить, чтобы этот айдишник в update запихать.

Aetae 03.08.2019 18:51

chrome.runtime.onMessage.addListener(
    function (request, sender) {

        if (request.updateFrontPage) {

            /**
             * Получить id вкладки у которой урл == request.url
             */
            chrome.tabs.query({url: request.url}, function (tabs) {
                 /**
                 * Обновить вкладку
                 */
                tabs.forEach(({id}) => chrome.tabs.update(id))
            });
           
        }

    }
);
Но универсальный скрипт для админа логичней.

MC-XOBAHCK 03.08.2019 19:07

Aetae,
так ошибку выдаёт. Ругается на строчку:
tabs.forEach(({id}) => chrome.tabs.update(id))


Вот что пишет:
Цитата:

Error handling response: TypeError: Error in invocation of tabs.update(optional integer tabId, object updateProperties, optional function callback): No matching signature.
Я вот эти параметры:
chrome.tabs.query({url: request.url}, function (tabs) {

написал от балды. Не факт что это правильно. Сижу разбираюсь с этим chrome.tabs.query. Ищу в гугле может на какой пример понятный наткнусь.

MC-XOBAHCK 03.08.2019 20:35

Странно.
Делаю так:
chrome.runtime.onMessage.addListener(
    function (request, sender) {

        if (request.updateFrontPage) {

            chrome.tabs.query({url: request.url}, function (tabs) {

                // tabs.forEach(({id}) => chrome.tabs.update(id));

                tabs.forEach( tab => console.log(tab) );

            });
        }

    }
);


В консоле для фоновой страницы выводит:
active: true
audible: false
autoDiscardable: true
discarded: false
favIconUrl: "https://example.com/favicon.ico"
height: 939
highlighted: true
id: 2149
incognito: false
index: 0
mutedInfo: {muted: false}
pinned: false
selected: true
status: "complete"
title: "Название статьи"
url: "https://example.com/category/article"
width: 1680
windowId: 162


Параметры правильные - от той страницы которую нужно обновить.

Делаю так:
chrome.runtime.onMessage.addListener(
    function (request, sender) {
        if (request.updateFrontPage) {

            chrome.tabs.query({url: request.url}, function (tabs) {

                tabs.forEach(tab => chrome.tabs.update( tab.id, {} ));

            });

        }
    }
);


Вообще ничего не происходит.

А если в update передавать только один параметр:
tabs.forEach(tab => chrome.tabs.update( tab.id ));

то выдаёт ошибку
Цитата:

Error handling response: TypeError: Error in invocation of tabs.update(optional integer tabId, object updateProperties, optional function callback): No matching signature.

MC-XOBAHCK 03.08.2019 20:48

Когда консолю вот так:
tabs.forEach( tab => console.log(tab) );

если открыто 2-3 вкладки с одной и той же страницей которая должна обновиться, то в консоль выводит всё правильно, 2-3 объекта с разными айдишниками.

Вот как их заставить обновляться?


Часовой пояс GMT +3, время: 23:55.