Ответ 1
После прохождения кода, который вы предоставили, кажется, что в коде есть тривиальные промахи, которые привели к сбою функциональности.
Я буду указывать на ошибки, которые вы сделали здесь:
-
В Popup.js переменная isExtensionOn имеет функциональную область
disableButton()
и, следовательно, не может быть доступна внутриdocument.addEventListener('DOMContentLoaded', function() { })
.Значение isExtensionOn внутри этой функции прослушивателя будет
undefined
, что не является ожидаемым в вашей системе.Чтобы исправить это, вам просто нужно определить переменную isExtensionOn на уровне выше (например, глобальном уровне), чтобы он был доступен как для
function disableButton() { })
и для прослушивателя событийDOMContentLoaded
. -
В Popup.js функциональный блок
chrome.extension.sendMessage({cmd: "getOnOffState"}, function (response) { })
содержит disableButton, который, как я вижу, нигде не определен в функциональной области прослушивателя событийDOMContentLoaded
. И вы выполняете задание на него, что приведет к ошибкам в консоли любого браузера, который будет выглядеть так:Uncaught ReferenceError: disableButton is not defined
Чтобы устранить эту проблему, вам необходимо определить disableButton в пределах области прослушивателя событий
DOMContentLoaded
. -
В Popup.js внутри прослушивателя событий
DOMContentLoaded
вы определили переменную singleButton какvar singleButton = document.getElementById("singleButton");
, но я вижу, что в файле Popup.html, который вы предоставили, нет элемента, кромеid
singleButton.Это вернет вам значение
null
, опять же это то, чего вы не ожидаете иметь в своей системе.Чтобы устранить эту проблему, вам необходимо исправить указанный
id
, напримерdocument.getElementById("disableButton");
в рамках прослушивателя событийDOMContentLoaded
.
ПРИМЕЧАНИЕ. Я упоминаю некоторые соглашения, которые вы можете использовать для улучшения методов кодирования.
- Именование всех html файлов необходимо начинать с нижних регистров.
- Используйте
===
вместо==
для строгого сравнения. Подробнее см. Здесь.- Используйте правильные углубления, чтобы не пропустить никаких брекетов или совершить непреднамеренные ошибки. (Вы пропустили
})
в блоке кода, где вы определили прослушиватель событий дляDOMContentLoaded
)
Поэтому, чтобы подвести итог, я пишу весь код всех файлов, которые вы упомянули здесь, с соответствующими исправлениями:
popup.html:
<button class="button button1" id="disableButton" style="display:none">Error</button>
<br id="br1" style="display:none">
<br id="br2" style="display:none">
Popup.js:
var isExtensionOn = true;
function disableButton() {
var disableButton = document.getElementById("disableButton");
if (disableButton.innerHTML === "Disable") {
isExtensionOn = false;
} else if (disableButton.innerHTML === "Enable") {
isExtensionOn = true;
} else {
alert("Error");
}
}
document.addEventListener('DOMContentLoaded', function () {
var disableButton = document.getElementById("disableButton");
var br1 = document.getElementById("br1");
var br2 = document.getElementById("br2");
//Send message to event.js (background script) telling it to disable the extension.
chrome.extension.sendMessage({cmd: "setOnOffState", data: {value: isExtensionOn}});
chrome.extension.sendMessage({cmd: "getOnOffState"}, function (response) {
if (response !== undefined) {
if (response) {
disableButton.innerHTML = "Disable";
disableButton.className = "button button3";
disableButton.style.display = "";
br1.style.display = "";
br2.style.display = "";
}
else {
disableButton.innerHTML = "Enable";
disableButton.className = "button button1";
disableButton.style.display = "";
br1.style.display = "";
br2.style.display = "";
}
}
});
});
Background.js:
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
if (request.cmd === "setOnOffState") {
isExtensionOn = request.data.value;
}
if (request.cmd === "getOnOffState") {
sendResponse(isExtensionOn);
}
});
Это должно работать согласно вашему требованию. Пожалуйста, пройдите ответ и сообщите мне, если у вас возникнут другие проблемы в этом отношении.