Грузите вы в любом случае всё - это в первую очередь поток байт, во вторую простой текст, и только после парсинга движком браузера появляются какие-то там
head
и прочие
body
.
В принципе, вы можете прервать загрузку, если посчитали что загрузили достаточно.
XMLHttpRequest
вызывает событие
readystatechange\onprogress
несколько раз с промежуточными результатами, а также имеет метод
abort
для остановки. Однако с современными скоростями интернета весь контент скорее всего будет загружен быстрее чем браузер сможет остановить зарос.
Примерно такfunction parseHead(text) {
if(!parseHead.parser)
parseHead.parser = new DOMParser();
return parseHead.parser.parseFromString(
text.match(/<head>[\s\S]*?<\/head>/i)[0],
"text/html"
).head;
}
function getHead(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onreadystatechange = function(event) {
if (xhr.readyState === 3) { // если частично загружено
if(/<\/head>/i.test(xhr.responseText)) { // если в загруженном есть закрывающий тег </head>
resolve(parseHead(xhr.responseText)); // парсим текст и возвращаем head
xhr.onreadystatechange = null; // убираем дальнейшую обработку изменения состояния
xhr.abort(); // останавливаем дальнейшую загрузку
}
} else if (xhr.readyState === 4){ // если запрос завршён
if(xhr.status === 200) // если завершён успешно
resolve(parseHead(xhr.responseText)); // парсим текст и возвращаем head
else
reject(xhr);
}
};
xhr.send();
})
}
getHead('/').then(console.log, console.error)