【问题标题】:Is there a way to mitigate downloading of resources (images/css and js files) with Javascript?有没有办法减少使用 Javascript 下载资源(图像/css 和 js 文件)?
【发布时间】:2010-07-12 22:07:39
【问题描述】:

我的本​​地主机上有一个 html 页面 - get_description.html

下面的sn-p是部分代码:

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

单击按钮时,iframe 的src 设置为在文本框中输入的 url。以这种方式获取的页面非常大,有很多链接文件。我对该页面感兴趣的是包含在 &lt;div id="description"&gt; 元素中的一段文本。

有没有办法减少加载到 iframe 的页面中链接的资源的下载?

我不想使用 curl,因为数据仅供登录用户使用,并且使用 curl 获取内容的步骤太复杂。 iframe 很简单,因为我在一个盒子上使用它,它发送正确的 cookie 来识别来自登录用户的请求,但问题是获取近 1 MB 的数据来保留 1 KB 是非常浪费的把剩下的扔掉。

编辑

如果建议的方法只适用于 Firefox,那很好,所以我添加了 Firefox 标签。此外,答案可能实际上来自 Firefox 附加技术领域,所以我也添加了该标签。

问题不在于我无法找到我正在寻找的东西,而是问题在于简单的iframe 方法很浪费。

我知道 Firefox 只允许加载页面的文本。如果您打开一个页面并按 Ctrl+U 您将被带到“查看页面源代码”窗口,如果您点击一个链接,链接的行为正常并且是可点击的在源视图中,新页面的源被加载到视图源窗口中,而没有下载链接的资源,这正是我想要得到的。但我不知道如何访问这种行为。

另一个例子是 Adblock 插件。它以某种方式在元素加载之前杀死元素。使用纯 Javascript 这是不可能的。因为它只是触发得太晚而无法及时干预。

【问题讨论】:

    标签: javascript firefox firefox-addon dom-events


    【解决方案1】:

    Same Origin Policy 禁止任何网页访问不同域中任何其他网页的内容,所以基本上你不能这样做

    但是,对于某些浏览器,如果您尝试从本地网页访问它,则似乎允许访问网页内容,这似乎是您的情况。

    Safari、IE 6/7/8 是允许本地网页通过 XMLHttpRequest 执行此操作的浏览器(来源:Google Browser Security Handbook),因此您可能需要选择使用其中一种浏览器来执行您需要的操作(注意这些浏览器的未来版本可能不再允许这样做)。

    这个解决方案的一部分我只看到两种可能性:

    • 如果您需要从获取内容的网页以某种方式由您控制,您可以创建一个更简单的界面让其他网页获取您需要的内容(例如允许JSONP请求)。
    • 如果您需要从获取内容的网页不受您控制我看到的唯一解决方案是直接从服务器获取内容服务器端登录(我知道您不想这样做,但如果我前面提到的不可行,我认为没有其他可能性)

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      其实我之前见过Cross Domain 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 代码可能无法正常工作,但您明白了)

      显然它是使用包装在 jQuery 插件中的 YQL 来实现这一点的。现在我不能说我完全理解他在那里所做的事情,但它似乎有效,并且符合要求。一旦你加载了数据,我想过滤掉你需要的数据是一件简单的事情。

      如果您更喜欢在浏览器级别运行的东西,我可以建议 Mozilla 的 Jetpack 框架用于轻量级扩展。我还没有完整阅读文档,但它应该包含此工作所需的 API。

      【讨论】:

      • 请注意,请求的 URL 将从 Yahoo 服务器加载,因此不适用于需要登录的 URL。
      • 嗯...是的。尽管我注意到该帖子附带的一个 cmets 指出也可以使用 POST 数据,这意味着可以通过这种方式进行身份验证,不是吗?还是我没有完全理解这种方法的工作原理?
      • 哇,你是对的!我从来没有想过这是可能的!在这种情况下,唯一的问题是雅虎服务器可以使用凭据。
      【解决方案3】:

      在 AJAX 中有多种方法可以解决此问题,为了简洁起见,我将展示 jQuery 方法作为一种选择,尽管您也可以在原生 JavaScript 中执行此操作。

      您可以只使用容器来代替&lt;iframe&gt;,比如&lt;div&gt;,如下所示:

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

      然后加载它:

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

      这使用.load() 方法,该方法采用以下格式的字符串:.load("url selector"),然后将该元素放入页面并将其内容放入您正在加载的容器中,在本例中为#description_container


      这只是jQuery的路线,主要是为了说明是的,你可以做你想做的,但你不必完全像这样去做,只是说明概念是从AJAX请求中得到你想要的,而不是&lt;iframe&gt;

      【讨论】:

      • 谢谢尼克,但这不起作用,因为正如我在问题中提到的,html 页面在我的本地主机上,.load() 不能跨域工作。这就是为什么我首先恢复使用iframe。但即使确实如此,我也不确定是否有任何东西阻止链接资源开始加载。我将进一步澄清我的问题。
      【解决方案4】:

      您的描述听起来像是从同一个域获取页面(您说您需要登录并拥有会话凭据)所以您是否尝试过通过XMLHttpRequest 使用异步请求?如果页面上的 html 特别混乱,它可能会抱怨,但您仍然可以通过 .responseText 获取原始文本并使用正则表达式提取您需要的内容。

      【讨论】:

      • XMLHttpRequest 是当您使用 jQuery 的 .get() 时在 IE 内部使用的,所以尝试过 jQuery 意味着我已经尝试过这条路径。不过还是谢谢你的建议。
      • 它还在加载图像和其他非文本内容?还是只是给了你一些错误?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多