Какое событие вкладки срабатывает в видимой вкладке? - PullRequest
0 голосов
/ 16 марта 2020

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

До сих пор я использую комбинацию

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
    if (changeInfo.url) run(tab);
});

chrome.tabs.onActivated.addListener(info => {
    chrome.tabs.get(info.tabId, run);
});

Эта комбинация не соответствует моим потребностям, потому что onUpdated срабатывает, даже если открыта вкладка фона.

Как настроить комбинацию событий для запуска событий только на вкладке, видимой для пользователя?

Весь фон. js:

var currentDomain = "";
var currentHost = "";
var currentFullpath = "";
var currentUrl = "";
var currentFolder = "";
var badgeText = "";
var currentProtocol ="";
const processingTabId = {};

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
    chrome.windows.get(tab.windowId, (window)=> {
        if (window.focused && changeInfo.url) run(tab);
    })
});


chrome.tabs.onActivated.addListener(info => {
    chrome.tabs.get(info.tabId, run);
});

function run(tab) {
    if (processingTabId[tab.id]) return;
    processingTabId[tab.id] = true;

    let newUrl = new URL(tab.pendingUrl || tab.url)
    currentHost = newUrl.host;
    currentUrl = tab.url;
    currentProtocol = newUrl.protocol;

    currentFullpath = currentUrl.substring(0, currentUrl.lastIndexOf("/"));
    currentFolder = currentUrl.split("/");
    parsed = psl.parse(currentHost);
    currentDomain = parsed.domain;

    chrome.storage.sync.get('savedApi', ({
        savedApi
    }) => {

        if (savedApi == undefined){
            savedApi = "de";
        }

/*  console.log(savedApi); */

        var xhr = new XMLHttpRequest();
        var protocol = "https://";
        var middle = ".myservice.com/seo/__loadModule/domain/"
        var end = "/mobile/1/_action/_data_visindex_normal/";

        xhr.open("GET", protocol + savedApi + middle + currentDomain + end, true);

        xhr.responseType = 'document';

        xhr.onreadystatechange = function() {
console.log(xhr);
            if (this.readyState == 4 && xhr.status !== 500) {

                function getElementByXpath(path) {
                    return xhr.response.evaluate(path, xhr.response, null, XPathResult.STRING_TYPE, null).stringValue;
                }

                badgeText = getElementByXpath("normalize-space(//div[@class='data']/span[@class='value']/text())");
                chrome.browserAction.setBadgeText({
                    text: String(badgeText)
                });



                chrome.browserAction.setBadgeBackgroundColor({
                    color: '#1d2554'
                });

                if (badgeText == "") {
                    chrome.browserAction.setTitle({
                        title: "Sistrix login required!"
                    });

                } else {
                    chrome.browserAction.setTitle({
                        title: "Data of " + currentDomain + " is " + String(badgeText)
                    });

                }

            }
            delete processingTabId[tab.id];
        }

if (currentDomain && currentProtocol.indexOf("http") ===0) {
xhr.send();
        }

    })
}

1 Ответ

1 голос
/ 17 марта 2020

Если вы хотите отфильтровать событие onUpdated из фоновых вкладок, вы можете запросить информацию об окне, к которому принадлежит обновленная вкладка, методом windows.get. Возвращает Window объект, содержащий всю информацию о запрошенном окне, в т.ч. focused недвижимость, которую вы ищете. Запрошенный идентификатор окна может быть получен через tab аргумент onUpdated обратного вызова.

Поэтому код должен выглядеть следующим образом:

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
    chrome.windows.get(tab.windowId, (window)=> {
        if (window.focused && changeInfo.url) run(tab);
    })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...