Так что я пытаюсь сделать расширение Chrome, которое изменяет части YouTube. Проблема в том, что вся информация (комментарии, лайки, описание и т. Д.) Часто загружается после реального видео. Window.addEventListener ('load' .... запускается до полной загрузки страницы (до загрузки информации под видео).
Я попытался обойти проблему, добавив:
function myFunc() {
try {
var teste = document.getElementById('info-text').nextSibling.nextSibling.children[0].children[0];
setTimeout(function(){ Youtube(); }, 1000);
} catch(err) {
setTimeout(function(){ myFunc(); }, 400);
}
}
Так что, если элемент еще не существует, он зацикливается. Тогда проблема заключается в том, что YouTube загружает элемент, но все равно требуется некоторое время для извлечения и корректировки его значения. Тогда проблема заключается в том, что расширение изменяет текст из 2 элементов, и информация, которую ДОЛЖНО быть заменено расширению, извлекается впоследствии, поэтому он добавляет информацию, которую расширение пытается заменить, в конце нового текста. (Кроме того, я попытался установить тайм-аут перед выполнением функции «Youtube» на 5 секунд, но, похоже, эти тайм-ауты игнорируются, когда у меня не открыта консоль).
Так вот весь мой код:
var fetch_slash; var i; var votes; var f; var dislikes; var ElementDislikes; var matchingItemsRE;
var likes; var ElementLikes; var slash_placement; var res; var matchingItemsYT; var loaded;
if (location.href.includes("youtube.com/watch")) {
window.addEventListener('load', function(event) { myFunc(); })
}
function myFunc() {
try {
var teste = document.getElementById('info-text').nextSibling.nextSibling.children[0].children[0];
setTimeout(function(){ Youtube(); }, 1000);
} catch(err) {
setTimeout(function(){ myFunc(); }, 400);
}
}
function Youtube() {
loaded = false;
matchingItemsYT = [];
var allElements = document.getElementsByClassName("style-scope ytd-toggle-button-renderer style-text");
for(i=0; i < allElements.length; i++){
matchingItemsYT.push(allElements[i]);
if (matchingItemsYT[i].getAttribute("aria-label")){
if ( matchingItemsYT[i].getAttribute("aria-label").includes(" likes") ) {
ElementLikes = matchingItemsYT[i];
if ( ElementLikes.textContent != "" ){ loaded = true; }
}
else if ( matchingItemsYT[i].getAttribute("aria-label").includes(" dislikes") ) {
ElementDislikes = matchingItemsYT[i];
}
}
}
EditYoutube();
}
function EditYoutube(){
votes = ElementLikes.getAttribute("aria-label");
votes = votes.replace(" likes", "");
votes = votes.replace(/,/g, "");
EditYoutubeString(true);
likes = votes;
votes = ElementDislikes.getAttribute("aria-label");
votes = votes.replace(" dislikes", "");
votes = votes.replace(/,/g, "");
EditYoutubeString(false);
dislikes = votes;
ElementLikes.textContent = likes;
ElementDislikes.textContent = dislikes;
if( loaded == false ){ Youtube(); }
}
function EditYoutubeString(pro){
var groups;
if (votes.length < 4){ groups = 0 }
else if (votes.length < 7){ groups = 3 }
else if (votes.length < 10){ groups = 7 }
else if (votes.length < 13){ groups = 11 }
else { return; }
if (pro == true) { ElementLikes.textContent = " "; }
else if (pro == false) { ElementDislikes.textContent = " "; }
if (groups > 0){ EditYoutubeStringSub(3) }
if (groups > 3){ EditYoutubeStringSub(7) }
if (groups > 7){ EditYoutubeStringSub(11) }
}
function EditYoutubeStringSub(groupNumb){
var komma = ",";
var slice;
var punkt;
punkt = votes.length - groupNumb;
slice = votes.slice(punkt);
votes = votes.substring(0, punkt);
votes = votes.concat(komma);
votes = votes.concat(slice);
}
Как вы можете видеть, я попытался обойти проблему, установив и в конце кода, проверяя, «загружен ли == ложь», но, похоже, это не работает. Не совсем уверен, почему. Здесь заканчиваются идеи.
(Также, пожалуйста, дайте мне советы о том, как улучшить мой код. Поскольку я очень новичок в программировании)