2

Я пробовал искать в Google, а также читать documentation, но не удался. Я делаю запрос ajax в contentScript (chrome extension) или иначе известен как скрипт greasemonkey для пользователей firefox.Получить только часть удаленного URL-адреса в AJAX

Типичная функция для получения URL с помощью 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() 
} 

Позволяет сказать мне нужен только первый 10КБ страницы но whole size of page is more than 200kb. Страница, которую я получаю, является обычным HTML. Я не хочу waste the bandwidth by downloading the excess 190kb. Есть ли способ достичь этого? Кроме того, возможно ли получить только часть страницы от 100 КБ до 110 КБ?

Я открыт для просмотра в браузере. (Хром). И мне придется переносить расширение на Firefox, поэтому идеи об этом также приветствуются.

+0

«Нет». Я не думаю, что есть какой-либо способ получить «часть» страницы от ajax. Вам нужно будет взять всю страницу. jQuey.load делает это, но насколько я знаю, он фактически загружает всю страницу, а затем отфильтровывает желаемый контент. – Jashwant

+0

PS. Скрипт содержимого - это ** не ** скрипты Greasemonkey. См. [Этот пост] (http://stackoverflow.com/a/9791647/938089?greasemonkey-require-does-not-work-in-chrome). –

+0

Решение, зависящее от браузера, не сэкономит вам пропускную способность. Чтобы сэкономить пропускную способность, серверу необходимо отправить вам меньше данных (что означает, что важной частью здесь является сервер, а не браузер). –

ответ

1

Отправляя ответ Rob W, есть рабочий пример для этого вопроса.
Следующий код может быть использован для загрузки первого 10k из сайтов через HTML, как в первой части вопроса ...

Lets say I only need first 10kb of the page

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); 
} 

Примечание
Следует отметить, что это обыкновения получите именно тот размер, который вы указали, поскольку они не могут сказать, как часто будет вызываться readistate. Кроме того, я заставляю его быть текстом, иначе их может не быть responseText.

+0

Можете ли вы уточнить: «Следует отметить, что это не будет точно соответствовать указанному вами размеру, поскольку их нельзя сказать, как часто будет вызываться readistate». Пожалуйста, уточните, почему нам нужна 'request.responseText.length> = limit' часть. Я заметил, что разные размеры загружаются каждый раз, когда я запускаю скрипт. Я знаю, что вы что-то говорили об этом, но я хотел бы получить более подробное объяснение. Благодарю. –

+0

Если его не readyState == 4, то, скорее всего, это ReadyState == 3, который загружается. Это происходит регулярно во время загрузки файла (я не мог найти ничего, говоря, как часто это должно произойти). Каждый раз, когда это происходит, responseText будет содержать загруженные в настоящее время данные, поэтому мы продолжаем проверять, не превышает ли его длину то, что вы просили, а затем прервать .... надеюсь, что это объяснит. – PAEz

+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"); для получения данных из середины файла.

+0

Дополнительная информация здесь: http://tools.ietf.org/html/draft-ietf-http-range-retrieval-00 – nisc

+0

@Wladimir Добавление этого дает сообщение об ошибке «Uncaught Error: INVALID_STATE_ERR: DOM Exception 11» в строке, где я установил «Заголовок диапазона». Есть идеи? –

+0

nisc: древняя спецификация. Пожалуйста, прекратите ссылаться на него. Последняя официальная спецификация - RFC 2616. –

Смежные вопросы