(Расширение браузера) EventListener Load запускается до полной загрузки страницы - PullRequest
0 голосов
/ 20 января 2019

Так что я пытаюсь сделать расширение 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);
}

Как вы можете видеть, я попытался обойти проблему, установив и в конце кода, проверяя, «загружен ли == ложь», но, похоже, это не работает. Не совсем уверен, почему. Здесь заканчиваются идеи. (Также, пожалуйста, дайте мне советы о том, как улучшить мой код. Поскольку я очень новичок в программировании)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...