Есть ли способ уменьшить загрузку ресурсов (файлов изображений/css и js) с помощью Javascript?

У меня есть html-страница на моем локальном хосте — get_description.html.

Фрагмент ниже является частью кода:

<input type="text" id="url"/>
<button id="get_description_button">Get description</button>
<iframe id="description_container" src="#"/>

При нажатии кнопки src iframe устанавливается на URL-адрес, введенный в текстовое поле. Страницы, полученные таким образом, очень большие и содержат множество связанных файлов. Что меня интересует на странице, так это блок текста, содержащийся в элементе <div id="description">.

Есть ли способ уменьшить загрузку ресурсов, связанных со страницей, которая загружается в iframe?

Я не хочу использовать завиток, потому что данные доступны только зарегистрированным пользователям, а шаги, которые необходимо предпринять с завитком для получения содержимого, слишком сложны. iframe прост, так как я использую его в поле, которое отправляет правильные файлы cookie, чтобы идентифицировать запрос как исходящий от вошедшего в систему пользователя, но проблема в том, что очень расточительно получать почти 1 МБ данных, чтобы сохранить 1 КБ. а остальные выкинуть.

Изменить

Если предложенный метод работает только в Firefox, то все в порядке, поэтому я добавил тег Firefox. Кроме того, возможно, что ответ на самом деле из области надстроек Firefox, поэтому я также добавил этот тег.

Проблема не в том, что я не могу получить то, что ищу, а в том, что простой iframe метод является расточительным.

Я знаю, что Firefox позволяет загружать только текст страницы. Если вы откроете страницу и нажмете Ctrl+U, вы попадете в окно «просмотр исходного кода страницы». Там ссылки ведут себя как обычно и кликабельны, если вы нажмете на ссылку в представлении исходного кода источник новой страницы загружается в окно источника представления без загрузки связанных ресурсов, именно то, что я пытаюсь получить. Но я не знаю, как получить доступ к этому поведению.

Другой пример — надстройка Adblock. Это каким-то образом убивает элементы до их загрузки. С простым Javascript это невозможно. Потому что он срабатывает слишком поздно, чтобы вовремя вмешаться.


person Majid Fouladpour    schedule 12.07.2010    source источник


Ответы (4)


На самом деле я уже видел междоменный запрос jQuery .load здесь: http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

Автор утверждает, что подобные коды найдены на той странице

$('#container').load('http://google.com'); // SERIOUSLY!

$.ajax({
    url: 'http://news.bbc.co.uk',
    type: 'GET',
    success: function(res) {
        var headline = $(res.responseText).find('a.tsh').text();
        alert(headline);
    }
});

// Works with $.get too!

должно сработать. (Код BBC может не работать из-за недавнего редизайна, но вы поняли идею)

По-видимому, он использует YQL, завернутый в плагин jQuery, чтобы добиться цели. Теперь я не могу сказать, что полностью понимаю, что он там делает, но, похоже, это работает и отвечает всем требованиям. Как только вы загрузите данные, я полагаю, что это просто вопрос фильтрации данных, которые вам нужны.

Если вы предпочитаете что-то, что работает на уровне браузера, могу ли я предложить платформу Mozilla Jetpack для облегченных расширений. Я еще не прочитал документацию полностью, но она должна содержать API, необходимые для работы.

person Yi Jiang    schedule 10.08.2010
comment
Обратите внимание, что запрошенный URL-адрес будет загружен с серверов Yahoo, поэтому он не будет работать с URL-адресами, для которых требуется вход в систему. - person Andrea Zilio; 10.08.2010
comment
Хм... да. Хотя я заметил один из комментариев, прикрепленных к этому сообщению, в котором отмечалось, что данные POST также могут использоваться, что означает, что аутентификация может быть выполнена таким образом, нет? Или я не совсем понимаю, как работает этот подход? - person Yi Jiang; 10.08.2010
comment
Вау, ты прав! Никогда бы не подумал, что такое возможно! Единственная проблема в этом случае заключается в том, что учетные данные будут доступны для серверов Yahoo. - person Andrea Zilio; 10.08.2010

Политика единого происхождения запрещает любой веб-странице получать доступ к содержимому любой другой веб-страницы в другом домене. так что в основном вы не можете этого сделать.

Однако кажется, что в некоторых браузерах разрешен доступ к содержимому веб-страниц, если вы пытаетесь получить к нему доступ с локальной веб-страницы, что, по-видимому, и есть ваш случай.

Safari, IE 6/7/8 — это браузеры, которые позволяют локальной веб-странице делать это через XMLHttpRequest (источник: Руководство по безопасности браузера Google), поэтому вы можете использовать один из этих браузеров для выполнения необходимых действий (обратите внимание, что будущие версии этих браузеров могут больше не позволять это делать) .

Часть этого решения я вижу только две возможности:

  • Если веб-страницы, с которых вам нужно получить контент, каким-то образом контролируете вы, вы можете создать более простой интерфейс, чтобы позволить другим веб-страницам получать нужный вам контент (например, разрешив запросы JSONP).
  • Если веб-страницы, с которых вам нужно получить контент, не контролируются вами, единственное решение, которое я вижу, — это получить контент на стороне сервера, выполнив вход с сервера напрямую (я знаю, что вы не хотите этого делать). так, но я не вижу никакой другой возможности, если предыдущие, о которых я упоминал, нецелесообразны)

Надеюсь, поможет.

person Andrea Zilio    schedule 10.08.2010

Существуют различные способы сделать это в AJAX, я собираюсь показать способ jQuery для краткости как один из вариантов. , хотя вы можете сделать это и в ванильном JavaScript.

Вместо <iframe> вы можете просто использовать контейнер, скажем, <div> вот так:

<div id="description_container"></div>

Затем, чтобы загрузить его:

$(function() {
  $("#get_description_button").click(function() {
    $("#description_container").load($("input").val() + " #description");
  });
});

При этом используется метод .load(), который принимает строку в следующем формате: .load("url selector"), а затем принимает этот элемент в page и помещает ее содержимое в контейнер, который вы загружаете, в данном случае #description_container.


Это просто маршрут jQuery, в основном для иллюстрации того, что да, вы можете делать то, что хотите, но вам не нужно делать это именно так, просто показывая, что концепция заключается в получении того, что вы хотите, из запроса AJAX, а не в <iframe>.

person Nick Craver    schedule 08.08.2010
comment
Спасибо, Ник, но это не сработает, потому что, как я уже упоминал в своем вопросе, html-страница находится на моем локальном хосте, а .load() не работает в междоменном режиме. Вот почему я вернулся к использованию iframe в первую очередь. Но даже если бы это было так, я не уверен, что что-то помешало начать загрузку связанных ресурсов. Я собираюсь добавить больше пояснений к моему вопросу. - person Majid Fouladpour; 09.08.2010

Ваше описание звучит так, как будто вы загружаете страницы из того же домена (вы сказали, что вам нужно войти в систему и иметь учетные данные сеанса), поэтому вы пытались использовать асинхронный запрос через XMLHttpRequest? Он может пожаловаться, если html на странице особенно испорчен, но вы все равно сможете получить необработанный текст через .responseText и извлечь то, что вам нужно, с помощью регулярного выражения.

person ZXX    schedule 13.08.2010
comment
XMLHttpRequest — это то, что используется внутри IE, когда вы используете jQuery .get(), поэтому, попробовав jQuery, я попробовал этот путь. Спасибо за предложение. - person Majid Fouladpour; 14.08.2010
comment
И он все еще загружал изображения и другие нетекстовые вещи? Или просто дал вам какую-то ошибку? - person ZXX; 14.08.2010