Сообщение от панели devtools скрипту содержимого при открытии devtools в отдельном окне

#javascript #jquery #google-chrome-extension

#javascript #jquery #google-chrome-расширение

Вопрос:

Я пишу расширение Chrome, и мне нужно отправить сообщение из панели devtools, которую я создал, в сценарий содержимого. Я уже сделал это:

devtools.js

 $(function () {
    inputField.trigger('focus')
    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
        chrome.tabs.sendMessage(tabs[0].id, {content: 'content'})
        chrome.runtime.onMessage.addListener(function (message) {
            if (!jQuery.isEmptyObject(message.pageHTML)) {
                pageHTML = message.pageHTML
            }
        })
    })

})
  

content.js

 chrome.runtime.sendMessage(extensionID, {pageHTML: $('html').html()});
  

Но это работает только тогда, когда devtools прикреплен к любой стороне вкладки, например, справа.
Когда я открываю devtools как отдельное окно, скрипт теряет связь со скриптом содержимого, и у меня возникает ошибка:

Ответ на обработку ошибок: TypeError: не удается прочитать свойство ‘id’ неопределенного

Итак, как мне это исправить?

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

1. Используйте chrome.devtools.inspectedWindow.eval с useContentScriptContext: true помощью для прямого вызова некоторой глобальной функции в вашем скрипте содержимого.

Ответ №1:

Вы можете получить идентификатор проверяемого окна с помощью chrome.devtools.inspectedWindow.tabId.

devtools.js

 $(function () {
    inputField.trigger('focus')
    chrome.tabs.sendMessage(chrome.devtools.inspectedWindow.tabId, {content: 'content'})
    chrome.runtime.onMessage.addListener(function (message) {
        if (!jQuery.isEmptyObject(message.pageHTML)) {
            pageHTML = message.pageHTML
        }
    })
})
  

SendMessage принимает обработчик ответа, с помощью которого вы, возможно, могли бы удалить прослушиватель, который вы регистрируете сразу после отправки сообщения. Подробная информация