Я пытаюсь получить доступ к любому элементу на YouTube из сценария содержимого.
manifest.json
"content_scripts": [
{
"run_at": "document_end",
"matches": ["*://www.youtube.com/watch?v=*"],
"js": ["content/content.js"]
}
]
Однако при регистрации элемента я иногда получаю null, и иногда элемент регистрируется.
content.js
document.addEventListener('DOMContentLoaded', afterDOMLoaded)
function afterDOMLoaded() {
const element = document.getElementById('top')
console.log(element)
}
Он работает при использовании setTimeout
setTimeout(function(){
const element = document.getElementById('top')
console.log(element)
}, 3000)
Я читаю здесь, что это потому, что элемент добавляется позже динамически, на странице javascript, и единственный способ решить это - использовать MutationObserver/mutation-summary. Это похоже на много хлопот за доступ к элементу. Разве нет другого пути?
Посредством загрузки асинхронно мы получим решение, выполняемое с помощью "document_idle". В случае с "document_idle" браузер выбирает время для ввода сценариев между "document_end" и сразу после возникновения события window.onload.
Обновление manifest.json
"content_scripts": [ { "run_at": "document_idle", "matches": [ "*://www.youtube.com/watch?v=*" ], "js": [ "content.js" ] } ]
В сценарии содержимого получите состояние готовности документа и выполните асинхронный путь.
HTMLDocument.prototype.ready = new Promise(function (resolve) {
if (document.readyState != "loading")
return resolve();
else
document.addEventListener("DOMContentLoaded", function () {
return resolve();
});
});
document.ready.then(function () {
const element = document.getElementById('top')
console.log(element)
});
Надеюсь это поможет.
setInterval
но я сомневаюсь, что это лучший подход.