在AJAX中只检索远程URL的一部分

Retrieve only a part of remote URL in AJAX

本文关键字:URL 一部分 检索 AJAX      更新时间:2023-09-26

我试过在谷歌上搜索,也读过文档,但没有成功。我是在contentScript(chrome扩展)中发出ajax请求的,或者是为firefox用户提供的另一种称为greatemonkey的脚本。

使用AJAX、获取URL的典型功能

function getURL(url, element)
{
    var request = new XMLHttpRequest();
    request.onreadystatechange = function()
    {   
        if ( request.readyState == 4 ) 
        {   
            callback( request.responseText, element, request.status );    
        }   
    };  
    request.open( "GET", url, true );
    request.send()
}

比方说我只需要页面的前10kb,但需要whole size of page is more than 200kb。我正在检索的页面是一个普通的HTML。我不想waste the bandwidth by downloading the excess 190kb。有什么办法做到这一点吗?此外,如果只检索100kb到110kb页面的一部分是可能的?

我对浏览器特定的解决方案(chrome)持开放态度。我还必须将扩展移植到Firefox,所以对此的想法也很受欢迎。

您可以发送Range标头:

request.setRequestHeader("Range", "bytes=0-9999");
request.send(null);

请注意,服务器可能会忽略此标头,您将得到通常的响应。在大多数情况下,响应将是"206部分内容",但数据正好为10000字节。Content-Range响应标头指示您得到的是文件的哪一部分,例如request.getResponseHeader("Content-Range")可能会给您bytes 0-9999/1234567(此处1234567是文件的总大小)。

显然,您也可以使用request.setRequestHeader("Range", "bytes=100000-119999");从文件中间获取数据。

重新回答Rob W的答案,这样就有了这个问题的工作示例
根据问题的第一部分,以下代码可以用于下载网站html的前10k。。。

假设我只需要页面的前10kb

function getURL(url, limit, callback) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        if ( request.readyState == 4 ) {
            if (request.responseText!=0) callback( request.responseText, request.status );
        } else if (request.responseText.length >= limit) {
            // If limit is exceeded
            var result = request.responseText;
            request.abort(); // Cancel request
            callback( result, request.status );
        }
    };
    request.overrideMimeType("text/html");
    request.open( "GET", url, true );
    request.send();
}
getURL('http://www.google.com.au', 100000, debug);
//getURL('http://paez.kodingen.com/testy.png', 100000, debug);
function debug(responseText, status) {
    console.debug('length of responseText '+responseText.length);
    console.debug('responseStatus : '+status);
    console.debug('responseText :'n'+responseText);
}

注意
需要注意的是,这不会得到你指定的大小,因为他们无法说明readystate的调用频率。此外,我强迫它是文本,否则它们可能不是响应文本。