Использование Javascript и scrollIntoView в цикле и таймере для сбора ссылок / URL - PullRequest
0 голосов
/ 08 ноября 2018

Я не могу правильно обернуть голову вокруг обратных вызовов / таймеров, поэтому продолжаю работать со следующим.

Я хочу собрать все ссылки / URL-адреса на веб-странице, однако у веб-страницы есть одна из них, которая позволяет загружать больше контента, когда вы прокручиваете страницу до тех пор, пока больше не будет больше ничего отображать / загружать. Я могу добиться этого в Javascript с помощью .scrollIntoView ()

Следующий код используется для определения того, достиг ли я конца страницы, и больше нет доступных результатов для загрузки.

    var element =  document.getElementById('browse_end_of_results_footer');
    if (typeof(element) != 'undefined' && element != null) {
        console.log('end');
    } else {
        console.log('scroll');
        document.getElementById("pagelet_dock").scrollIntoView();
    }

Однако мне нужно продолжать цикл с задержкой в ​​1 секунду, пока либо не будет достигнут конец, либо будет предпринято несколько попыток, чтобы он не работал вечно, но мне нужно также собирать ссылки / URL-адреса внутри цикл и когда выполняется любое из условий (максимальное количество попыток / конец), результаты возвращаются.

Следующее - это то, что мне удалось получить, взломав некоторый пример кода вместе, но, как я изначально указал, я не могу разобраться с обратными вызовами и таймерами Javascript.

var myVar = setInterval(myTimer, 1000);

function myTimer() {
    var i = 0;
    var d = new Date();
    var t = d.toLocaleTimeString();
    console.log(t)
    i++;

    var element =  document.getElementById('browse_end_of_results_footer');
    if (typeof(element) != 'undefined' && element != null) {
        console.log('end');
        myStopFunction();
    } else {
        console.log('scroll');
        document.getElementById("pagelet_dock").scrollIntoView();
    }

}

function myStopFunction() {
    clearInterval(myVar);
}

РЕДАКТИРОВАТЬ: удалось получить следующий код для работы, однако кто-нибудь порекомендовал бы лучший способ.

const sleep = (milliseconds) => {
    return new Promise(resolve => setTimeout(resolve, milliseconds))
}

const pageDown = async () => {
    var element =  document.getElementById('browse_end_of_results_footer');
    if (element) {
        console.log('Reached Bottom');
        return true;
    }

    console.log('Scrolling');
    document.getElementById("pagelet_dock").scrollIntoView();
    return false;
}

var maxAttempts = 5;
var items =[];
var bottom = false;
var attemptCounter = 0;
while (!bottom && attemptCounter < maxAttempts ) {

    attemptCounter++;
    bottom = await pageDown();

    x = document.querySelectorAll('div[data-bt*="rank"]');
    for (var i = items.length; i < x.length; i++) {

        var jsonString = x[i].getAttribute('data-bt');
        var data = JSON.parse(jsonString);
        items.push(data.id);



    }

    await sleep(1000);

}

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