входное значение синхронизации хранилища chrome

#javascript #google-chrome-extension

Вопрос:

Я пытаюсь получить входное значение в моем main.js (сценарий контента) но я изо всех сил пытаюсь как-то его доработать. Мне удалось сохранить значение с помощью подхода windows.onload, как вы можете видеть ниже в моем popup.js . Но я не могу перенести его в сценарий содержимого. Я хочу использовать это значение в качестве переменной «userInput» в моем сценарии содержимого.

popup.js:

 function registerButtonAction(tabId, button, action) {
    // clicking button will send a message to
    // content script in the same tab as the popup
    button.addEventListener('click', () => chrome.tabs.sendMessage(tabId, { [action]: true }));
}

function setupButtons(tabId) {
    // add click actions to each 3 buttons
    registerButtonAction(tabId, document.getElementById('start-btn'), 'startSearch');
    registerButtonAction(tabId, document.getElementById('deals-btn'), 'startDeals');
    registerButtonAction(tabId, document.getElementById('stop-btn'), 'stopSearch');
}

function injectStartSearchScript() {
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        // Injects JavaScript code into a page
        // chrome.tabs.executeScript(tabs[0].id, { file: 'main.js' });

        // add click handlers for buttons
        setupButtons(tabs[0].id);
    });
}

injectStartSearchScript();

window.onload = function () {
    document.getElementById('save-btn').onclick = function () {
        let valueInput = document.getElementById('deal-ipt').value;

        chrome.storage.sync.set({ 'maxBidDeal': valueInput }, function () {
            alert('Saved!');
        });
    };
};

 

manifest.json:

 {
    "manifest_version": 2,
    "name": "test app",
    "description": "test desc",
    "version": "1.0",
    "browser_action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },
    "permissions": ["tabs", "<all_urls>", "storage"],
    "content_scripts": [
        {
            "matches": ["<all_urls>"],
            "js": ["main.js"]
        }
    ],
    "content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'"
}

 

main.js:

 // highlight deals
async function deals() {
    // let userInputBidPrice = prompt('Set max Bid Price to show deals:');
    chrome.storage.sync.get('MaxBidDeal', function (data) {
        let userinput = data.MaxBigDeal;
        deals(userinput);
    });

    let cardCurrentBidValuesString = document.querySelectorAll('.auction > .auctionValue:nth-child(2) > .currency-coins.value');
    let cardStartBidValueString = document.querySelectorAll('.auction > .auctionStartPrice.auctionValue > .currency-coins.value');
    let cardBg = document.querySelectorAll('.rowContent.has-tap-callback');

    for (let i = 0; i < cardCurrentBidValuesString.length; i  ) {
        cardsCurrentBidPrice = cardCurrentBidValuesString[i].textContent.toString().split(',').join('');
        cardsStartBidPrice = cardStartBidValueString[i].textContent.toString().split(',').join('');

        if (cardsCurrentBidPrice === '---') {
            cardsCurrentBidPrice = 0;
        }
        if (cardsStartBidPrice === '---') {
            cardsStartBidPrice = 0;
        }

        parsedCardsCurrentBidPrice = parseInt(cardsCurrentBidPrice);
        parsedCardsStartBidPrice = parseInt(cardsStartBidPrice);

        if (parsedCardsCurrentBidPrice < parseInt(userinput) amp;amp; parsedCardsStartBidPrice < parseInt(userinput)) {
            cardBg[i].style['background-color'] = '#0311c3';
        }
    }
}



chrome.runtime.onMessage.addListener((message) => {
    // choose action based on received message:
    if (message.startSearch) {
        startSearch();
    } else if (message.startDeals) {
        deals();
    }
});

// sanity check: content has loaded in the tab
console.log('content loaded');

 

Поэтому я уверен, что мне нужно как-то использовать chrome.storage.get, но я не могу точно понять.

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

1. Что плохого в использовании примеров в документации ?

2. Я не получаю значение, сохраненное в полезную переменную в моем сценарии содержимого. Я не понимаю, как я должен реализовать .get, чтобы я мог получить к нему доступ в функции в моем сценарии содержимого.

3. Оно асинхронное, поэтому вам нужно использовать значение внутри обратного вызова.

4. Я отредактировал main. JS с тем, что я пробовал, но это не работает. Я не могу получить доступ к этой переменной userinput в моем дальнейшем коде подобным образом.

5.1) Замените типографские кавычки обычными кавычками : "maxBidDeal" . 2) Используйте userinput внутри обратного вызова сразу после его назначения.

Ответ №1:

Ваш код вызывается deals рекурсивно вечно без фактической передачи значения, потому что вы не объявили параметр, а затем пытаетесь использовать userinput его за пределами области видимости переменной.

Вы можете обещать chrome.storage и использовать await следующим образом:

 async function deals() {
  // Note that chrome.storage is already promisified in ManifestV3 since Chrome 95 
  let { MaxBidDeal } = await new Promise(resolve =>
    chrome.storage.sync.get('MaxBidDeal', resolve));

  // use MaxBidDeal right here
  console.log('MaxBidDeal', MaxBidDeal);
}
 

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

1. если я скопирую вставленный код ur в свой сценарий содержимого, я получу это: Uncaught (in promise) TypeError: Error in invocation of storage.get(optional [string|array|object] keys, function callback): No matching signature.

2. Ах, извините, вы используете ManifestV2, см. Обновленный ответ.

3. не могу сказать достаточно СПАСИБО …. это работает 🙂 спасибо за ваше терпение! Я просто изучаю JS и пытаюсь учиться с помощью проекта расширения Chrome, и это доставило мне столько головной боли…