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

时间:2012-03-22 10:24:49

标签: javascript ajax http google-chrome-extension firefox-addon

我尝试在Google上搜索并阅读documentation但没有成功。我正在使用contentScript(chrome扩展名)制作ajax请求,或者以firefox用户身份称为greasemonkey脚本。

使用AJAX获取网址的典型功能

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上,所以也欢迎这方面的想法。

2 个答案:

答案 0 :(得分:7)

您可以发送Range header

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

请注意,服务器可能会忽略此标头,您将获得通常的响应。在大多数情况下,响应将是“206 Partial Content”,但只有10000字节的数据。 Content-Range response header表示您获得的文件的哪个部分,例如request.getResponseHeader("Content-Range")可能会为您bytes 0-9999/1234567(此处为1234567是文件的总大小)。

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

答案 1 :(得分:1)

重新发布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的频率。另外,我强制它是文本,否则它们可能不是responseText。