Задать вопрос
@photosho

Можно ли получить head удаленной страницы?

Через "jQuery.get()" можно получить разметку другой страницы. Есть ли возможность получить контент только раздела "head" (интересуют именно мета-теги), а не все содержимое страницы?
  • Вопрос задан
  • 97 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Грузите вы в любом случае всё - это в первую очередь поток байт, во вторую простой текст, и только после парсинга движком браузера появляются какие-то там 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)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
Если это разрешено CORS получить вы можете что угодно, создавайте элемент через createElement, записывайте в него полученные данные и парсите head через стандартные функции.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы