Первая проблема, с которой вы можете столкнуться, это то, что вы загрузили фоновый скрипт во всплывающее окно.Даже если ваш фоновый скрипт объявлен в файле манифеста, у вас могут возникнуть некоторые проблемы;поскольку хром будет рассматривать его как часть popup.html
.
Это означает, что:
Нет связи между вашими popup.js
и background.js
(загружено во всплывающем окне).
Возможно, произошла ошибка, препятствующая запуску javascript из контекстного контекстного меню.Это связано с тем, что background.js при правильном использовании имеет доступ к большему количеству chrome APIs
, чем у всплывающего окна.Если используется во всплывающем контексте, и эти API вызываются, будет выдано исключение.Когда исключение генерируется и не перехватывается, сценарий останавливается, что не позволяет вам выполнять какие-либо дополнительные действия.Background.js не должен загружаться в popup.html, за исключением того, что у вас есть файл background.js, который не является фоновой страницей.
Что вы можете сделать, чтобы определить, так ли этощелкните правой кнопкой мыши на всплывающей странице и нажмите «Проверить».Перейдите на вкладку консоли и прочитайте все ошибки, которые могли произойти.Если ошибки не произошло, я бы порекомендовал вам удалить скрипт background.js из вашего popup.html.
Кроме того, фоновый скрипт не нужно загружать ни на одну html-страницу.Он автоматически запускается при запуске браузера даже до того, как пользователь введет веб-адрес.
Если ничего из вышеперечисленного не относится к вам,
ошибки обычно имеют трассировку стека, откуда произошла ошибка.Нажмите на все, что говорит chrome://extensions...
.Это должно привести вас туда, где именно в вашем коде возникают проблемы.
И если это не поможет, проверьте это:
popup.js
chrome.runtime.sendMessage({saveState: true, state: {---"state data goes in here---"}});
Вы можете отправить весь html таким образом, как я считаю.
background.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
if(request.saveState){
chrome.storage.local.set(request.state, function(){ sendResponse(true)});
}
});
Проще говоря, каждый раз, когда в пользовательский интерфейс всплывающих окон вносятся изменения,
(например, пользователь щелкнул по тексту редактирования для элемента в расширении списка задач, и он превратился в текстовое поле ввода),
вы отправляете {view: "edit", item: "no 2", addButton: "hidden"}
в качестве объекта состояния на фон, который затем сохраняетв хранилище.
Когда откроется всплывающее окно, все, что вам нужно, это попросить память о состоянии и отобразить ваш интерфейс на основе данных.
chrome.storage.local.get('state', function(result){
if(result.state){
//This is a function you will write
render(result.state);
}
else{
//do nothing
}
});
Обратите внимание, что вы также используетеchrome.runtime.connect
, который зарезервирован для более долгоживущих соединений.В этом нет ничего плохого, но если вам нужно только сохранить состояние beforeunload
, отправка однократных сообщений на данный момент может быть проще для отладки.