该代码应该在多个网页中循环并找到每个页面上的所有链接,并在控制台中列出它们,但似乎只列出了最后一个网页(fakeURL.com/735)中的链接。

如何使console.log(url);在每次迭代中都能工作,而不仅仅是最后一个迭代(当i = 735时)?

for(i = 0; i <= 735; i += 15)
{
    var xhrs = new XMLHttpRequest();
    xhrs.open("get", 'http://fakeURL.com/' + i, true);
    xhrs.onreadystatechange = function()
    {
        if (xhrs.readyState == 4)
        {
            $(xhrs.responseText).find('a').each(function()
            {
                var url = $(this).attr('href');
                console.log(url);
            });
        }
    }
        xhrs.send();
}

最佳答案

您的问题是您对所有的ajax调用都使用相同的xhrs变量。因此,当xhrs事件触发时,所有正在播放的调用都无法立即找到属于其特定请求的onreadystatechange变量。因此,他们最终都会从最后一个请求中查看xhrs.readyState,因此您只会看到最后一个请求已完成。

您应该可以切换到使用this来引用生成onreadystatechange事件的请求:

for(i = 0; i <= 735; i += 15) {
    var xhrs = new XMLHttpRequest();
    xhrs.open("get", 'http://fakeURL.com/' + i, true);
    xhrs.onreadystatechange = function()
    {
        if (this.readyState == 4)
        {
            $(this.responseText).find('a').each(function()
            {
                var url = $(this).attr('href');
                console.log(url);
            });
        }
    }
    xhrs.send();
}


正如其他人所说,如果$表示您正在使用jQuery,则jQuery.ajax()可能会容易得多。

10-06 05:15