Хорошо, я потратил последние 2 часа, работая над этим, и нашел решение, которым я доволен на данный момент (хотя и не доволен - но что вы будете делать). В основном, большой вопрос, который у меня возник в моем ОП, был:
как мне запустить мой скрипт на каждой странице Facebook, без необходимости повторного sh между страницами каждого типа?
Ну, я понял, что да, освежение - это решение. Итак ... что если мы принудительно сделаем refre sh на конце Facebook, позволив DOM
refre sh и коду, который будет работать, как ожидалось? Я полагаю, что это НАДЕЖНО на самом деле является основной проблемой того, как реализована используемая мной библиотека Clay.js
. Во всяком случае, я в основном подошел к решению:
- Во-первых, создав файл
background.js
, который использует chrome.tabs.onUpdated.addListener
- эта функция в основном позволяет мне определять, изменилась ли вкладка или статус страницы был «завершен», показывая, что он загрузился. - Если он загрузился, тогда я запускаю функцию
checkFeedUpdate()
точно так же, как указано выше. - Если она изменилась на новую страницу (например, пользователь нажал с Перейдите в раздел «Профиль»), я принудительно перезагружаюсь и жду, пока сработает пункт 2.
- 'background. js
is detecting whether or not these states have happened yet, and relaying the information to
response-changer.js`.
Вот обновленный бит устройства изменения реакции. js (вместо document.addEventListener):
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
// listen for messages sent from background.js
if (request.message === 'reload') {
location.reload();
} else if (request.message === 'start'){
checkFeedUpdate()
}
});
Вот обновленный манифест:
"background": {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["https://www.facebook.com/*"],
"js": ["extension/clay.js", "change-icons.js", "reaction-changer.js"],
"all_frames": true
}
],
"permissions": [
"tabs"
],
"web_accessible_resources": [
"img/*.png"
]
И вот что я создал для background.js
:
chrome.tabs.onUpdated.addListener(
function(tabId, changeInfo) {
// read changeInfo data and do something with it
if (changeInfo.url) {
chrome.tabs.sendMessage( tabId, {
message: 'reload'
})
} else if (changeInfo.status === 'complete'){
chrome.tabs.sendMessage( tabId, {
message: 'start'
})
}
}
);
Если кто-то сталкивается с подобной проблемой (кажется, что обновление работает, но вы не можете заставить его работать без обновления ), похоже, что просто принудительное использование refre sh может быть хорошим решением. Если есть лучший, пожалуйста, дайте мне знать!