Как ссылаться на popup.html DOM из background.js в расширении chrome? - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь сохранить копию моего всплывающего HTML-кода, когда всплывающее окно закрывается.Затем перезагрузите его, когда всплывающее окно запускается снова.background.js прослушивает отключение порта от popup.js.Но когда я пытаюсь получить popup.html, я думаю, что получаю background.html (хотя я никогда не настраивал это).

background.js

chrome.runtime.onConnect.addListener(function (externalPort) {
    externalPort.onDisconnect.addListener(function () {
        let page = document.getElementsByTagName('html')[0].innerHTML;
        console.log(page);
        chrome.storage.local.set({"page": page});
    })
});

что регистрируется

<head></head><body>
<script src="jquery-3.3.1.min.js"></script>
<script src="popup.js"></script>
<script src="background.js"></script>
</body>

Когда я получаю innerHTML из popup.js, я получаю правильный HTML, но я нене знаю, как правильно ссылаться на него из background.js.

Редактировать: popup.html

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Treasure Roller</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="style.css" />
    <script src="jquery-3.3.1.min.js"></script>
    <script src="popup.js"></script>
</head>

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Первая проблема, с которой вы можете столкнуться, это то, что вы загрузили фоновый скрипт во всплывающее окно.Даже если ваш фоновый скрипт объявлен в файле манифеста, у вас могут возникнуть некоторые проблемы;поскольку хром будет рассматривать его как часть popup.html.

Это означает, что:

  1. Нет связи между вашими popup.js и background.js (загружено во всплывающем окне).

  2. Возможно, произошла ошибка, препятствующая запуску 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, отправка однократных сообщений на данный момент может быть проще для отладки.

0 голосов
/ 06 декабря 2018

Если вы хотите обработать HTML всплывающего окна, когда оно закрыто, вы можете попробовать что-то вроде следующего:

Создайте обработчик window.onbeforeunload на всплывающей странице, в обработчике событий прочитайте HTML,Вы можете обработать html в слушателе или отправить его как сообщение на фоновую страницу (используя chrome.runtime.sendMessage) из слушателя

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