У меня есть расширение Chrome, которое очищает некоторые значения с веб-страницы на основе некоторых селекторов запросов, предоставляемых через вызов API.
Соответствующая часть файла manifest.json:
"background": {
"scripts": ["js/background.js"],
"persistent": false
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["js/jquery.min.js"]
}
],
"permissions": [
"<all_urls>",
"storage",
"activeTab"
]
}
JS / background.js:
Идея заключается в том, что если пользователь ввел значение atsmap на своей странице параметров, мы должны выполнить вызов API.
chrome.storage.sync.get(['atsmap'], function(result) {
if (result.atsmap) {
var url = "https://myurl.com/AtsMapping.aspx?AtsCode=" +
encodeURIComponent(result.atsmap)
fetch(url).then(r => r.text()).then(text => {
console.log(text);
response = JSON.stringify(text);
chrome.storage.sync.set({"fieldmapping": response}, function() {
console.log('Fieldmapping is set to ' + response);
});
})
}
return true;
});
Эта часть работает нормально, вот консоль с фоновой страницы:
В popup.js (который находится внизу popup.html) я вызываю скрипт inject.js после загрузки DOM:
// DOM Ready
$(() => {
'use strict';
chrome.tabs.executeScript({file: 'js/inject.js'}, () => {
// We don't need to inject code everwhere
// for example on chrome:// URIs so we just
// catch the error and log it as a warning.
if (chrome.runtime.lastError) {
console.warn(chrome.runtime.lastError.message);
}
});
// injected code will send an event with the parsed data
chrome.runtime.onMessage.addListener(handleInjectResults);
});
И, наконец, в js / inject.js я получаю значение отображения поля из хранилища и пытаюсь его использовать:
(function () {
'use strict';
let fieldmap;
let message;
console.log("test");
chrome.storage.sync.get(['atsmap'], function(result) {
if (result.atsmap) {
chrome.storage.sync.get(['fieldmapping'], function(result) {
console.log('Value currently is ' + result.fieldmapping);
fieldmap = JSON.parse(result.fieldmapping);
console.log(fieldmap);
// <key> : { // ID of input on popup.js
// selector: <selector> // DOM selector of value in page
// value: <value> // value to use in popup.js
// }
if(fieldmap.AtsMapping[4].atsMapNotes == 'John Smith (2)') {
message = {
txtLName: {
selector: fieldmap.AtsMapping[6].lastName,
value: null
},
Когда я перехожу на демонстрационную страницу, которую я настроил для очистки, затем щелкаю по значку моего расширения, вместо того, чтобы очищать страницу для значений формы, я получаю в консоли следующее:
Я не понимаю, как в строке 32 inject.js я могу console.log(fieldmap);
и получить то, что кажется правильным ответом, и все же в строке 39 inject.js та же карта полей не определена.
Любые предложения будут полезны, так как я полностью потерялся здесь.