Как добавить переменную в расширение xhr.open outta Chrome? - PullRequest
0 голосов
/ 26 января 2020

Я пишу расширение Chrome, которое должно при загрузке каждого нового домена в браузере получать специальный удаленный URL, добавлять к нему текущий домен (как с window.location.hostname), получать специальные метри c из целевую страницу, созданную таким образом (с XMLHttpRequest и XPath), и показывать этот показатель c как BadgeText.

У меня почти все работает, но только со стати c URL Если вместо "+window.location.hostname+" я жестко закодирую любое доменное имя, все работает так, как ожидалось - я получаю число как BadgeText. Но как я могу получить эту работу с доменом, загруженным в данный момент в браузере?

Это мой background.js:

chrome.tabs.onUpdated.addListener(function (tabid, changeInfo, tab) {
    chrome.tabs.query({ 'active': true, 'currentWindow': true }, function (tabs) {
        let newUrl = new URL(tabs[0].url);
        currentDomain = newUrl.hostname;
        console.log(currentDomain);
    });
});

var xhr = new XMLHttpRequest();

xhr.open("GET", "url part 1" + window.location.hostname + "url part 2", true);

xhr.responseType = 'document';

xhr.send();

xhr.onreadystatechange = function () {
    console.log("XHR callback readyState = " + this.readyState);
    if (this.readyState == 4) {

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

        console.log(getElementByXpath("//div[@class='data-mini']/span/span[@class='value']/text()"));

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

        console.log(String(badgeText));
    }
}

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

То, что остается , это получить

currentDomain

в

xhr.open("GET", "https://app.sistrix.com/app_visindex/__loadModule/lang/de/domain/"+currentDomain+"/source/de/ref/app_controller_efcdc3b3cab713326d8830ac95b499e454ae4e46053a5cc6/_action/_result/_cache//_loadbox/empty/_ajax/1/_module-expire/217287/_controller", true);

Основная цель:

  • при посещении любого другого домена URL в xhr.open изменяется с текущим доменом,
  • XHRHttpRequest получает новый номер из HTML элемента, определенного с XPath,
  • номер отображается как BadgeText.

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Правильный и рабочий код:

chrome.tabs.onUpdated.addListener(function(tabid, changeInfo, tab){
    chrome.tabs.query({'active' : true, 'currentWindow': true}, function(tabs){
        let newUrl = new URL(tabs[0].url);
        var currentDomain = newUrl.hostname;
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "url part 1"+currentDomain+"url part 2", true);
        xhr.responseType='document';
        xhr.send();
        xhr.onreadystatechange = function() {
          if (this.readyState == 4) {

        function getElementByXpath(path) {
          return xhr.response.evaluate(path, xhr.response, null, XPathResult.STRING_TYPE, null).stringValue;
        }
            var badgeText = getElementByXpath("//div[@class='data-mini']/span/span[@class='value']/text()");
          chrome.browserAction.setBadgeText({text: String(badgeText)});
          chrome.browserAction.setBadgeBackgroundColor({ color: '#1d2554' });
          }
        }
    });
});
0 голосов
/ 30 января 2020

Если я правильно понял ваш вопрос, вы хотите получить информацию о странице + это текущее имя хоста при переключении вкладок.

Итак, {pageInfo, currentHost}.

Эту информацию вы хотите передать в фоновый режим и сделать XHR с нужным хостом ...

Вот как мне решить эту проблему:

В вашем content.js:

// Gets needed data from the content when the tab changes (i.e on window focus).
// For example I will take the content of first paragraph and the hostname:

window.onfocus = function () {
  const firstParagraphText = document.getElementsByTagName('p')[0].innerText;
  const hostName = window.location.host;

  this.sendDataToBackground({ paragraph: firstParagraphText, host: hostName });
}


function sendDataToBackground(data) {
  chrome.runtime.sendMessage(chrome.runtime.id, data);
}

Затем в вашем background.js вы должны получить информацию, отправленную по содержимому:

chrome.runtime.onMessage.addListener(function (request, sender) {
  console.log('First paragraph = ', request.paragraph);
  console.log('Host = ', request.host);

  // DO XHR WITH NEW HOST...
});

Это работает для меня, если вы sh я могу создать Publi c репо с одним рабочим примером ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...