browser.tabs.create()
является асинхронным, поэтому browser.tabs.sendMessage()
запускается даже до создания вкладки.
Вам нужно дождаться, чтобы она запустилась первой.
Вот некоторые предложения:
// first create the tab
const newTab = browser.tabs.create({
url: 'https://example.org'
});
newTAb.then(onCreated, onError);
// after tab is created
function onCreated(tab) {
browser.tabs.sendMessage(tab.id,{message: 'hi'});
}
// in case of error
function onError(error) {
console.log(`Error: ${error}`);
}
// above can also be written as this
browser.tabs.create({
url: 'https://example.org'
}).then(
tab => browser.tabs.sendMessage(tab.id,{message: 'hi'}),
error => console.log(error)
);
// another alternative for above
browser.tabs.create({url: 'https://example.org'})
.then(tab => browser.tabs.sendMessage(tab.id,{message: 'hi'}))
.catch(error => console.log(error));
// Using chrome and callback function
chrome.tabs.create({url: 'https://example.org'}, tab =>
browser.tabs.sendMessage(tab.id,{message: 'hi'})
);
// same as above, all with chrome
chrome.tabs.create({url: 'https://example.org'}, tab =>
chrome.tabs.sendMessage(tab.id,{message: 'hi'})
);
Вы также можете использовать async/await
, но в этом случае это может усложнить задачу.
Обновление комментария:
content_scripts
по умолчаниюзапуск в "document_idle"
(соответствует завершению. Документ и все его ресурсы закончили загрузку.)
"content_scripts": [{
"matches": ["www.youtube.com"],
"js": ["input.js"]
}],
Следовательно, input.js
вводится после загрузки всего.Тем не менее, sendMessage()
запускается, как только вкладка создана, и, таким образом, нет прослушивателя для прослушивания ее сообщения.
В вашем простом примере это можно исправить с помощью "run_at": "document_start"
"content_scripts": [{
"matches": ["www.youtube.com"],
"js": ["input.js"],
"run_at": "document_start"
}],
Однако, если input.js
требуется получить доступ к DOM после получения сообщения, вам необходимо добавить прослушиватель DOMContentLoaded
или load
и запустить его после загрузки документа.