【问题标题】:jQuery parse HTML without loading imagesjQuery 解析 HTML 而不加载图像
【发布时间】:2013-02-13 08:49:09
【问题描述】:

我从其他页面加载 HTML 以从该页面提取和显示数据:

$.get('http://example.org/205.html', function (html) {
    console.log( $(html).find('#c1034') );
});

这确实有效,但由于$(html),我的浏览器会尝试加载在 205.html 中链接的图像。这些图像在我的域中不存在,所以我收到很多 404 错误。

有没有办法像$(html) 这样解析页面,但不将整个页面加载到我的浏览器中?

【问题讨论】:

    标签: javascript jquery ajax image


    【解决方案1】:

    使用正则表达式并删除所有<img>标签

     html = html.replace(/<img[^>]*>/g,"");
    

    【讨论】:

    • 这对我有用。请注意,它不适用于样式背景图像。因此,我猜你需要一个XML parser。谢谢!
    • @PiTheNumber & Bhuvan: FWIW,那个正则表达式很容易绕过:jsbin.com/wejosoku/1 我想它可以重复应用,但我不想把我的网站打赌没有人能够想出解决办法。正则表达式根本不适合重要的 HTML 解析。
    • @T.J.Crowder 我知道它没有保存,但就我而言,我可以信任其他域的 HTML 代码。正则表达式对大多数事情都不利,我强烈建议尽可能避免使用它。我很高兴看到另一个解决方案,但一个完整的 html 解析器对于这个来说太大了。
    【解决方案2】:

    您可以使用 jQuerys remove() 方法来选择图像元素

    console.log( $(html).find('img').remove().end().find('#c1034') );
    

    或从 HTML 字符串中删除 then。像

    console.log( $(html.replace(/<img[^>]*>/g,"")) );
    

    关于背景图片,你可以这样做:

    $(html).filter(function() {
        return $(this).css('background-image') !== ''; 
    }).remove();
    

    【讨论】:

    • 第一个不起作用。 $(html) 已加载页面。第二个确实有效。谢谢!
    【解决方案3】:

    使用下面的方式解析html会自动加载图片。

    var wrapper = document.createElement('div'),
        html = '.....';
    wrapper.innerHTML = html;
    

    如果使用DomParser解析html,图片不会自动加载。详情请见https://github.com/panzi/jQuery-Parse-HTML/blob/master/jquery.parsehtml.js。

    【讨论】:

    【解决方案4】:

    以下正则表达式替换所有出现的&lt;head&gt;, &lt;link&gt;, &lt;script&gt;, &lt;style&gt;,包括ajax 加载返回的数据字符串中的background 和style 属性。

    html = html.replace(/(<(\b(img|style|script|head|link)\b)(([^>]*\/>)|([^\7]*(<\/\2[^>]*>)))|(<\bimg\b)[^>]*>|(\b(background|style)\b=\s*"[^"]*"))/g,"");
    

    测试正则表达式:https://regex101.com/r/nB1oP5/1

    我希望有一种更好的解决方法(除了使用正则表达式替换)。

    【讨论】:

      【解决方案5】:

      很抱歉重新提出一个老问题,但这是搜索如何尝试阻止已解析的 html 加载外部资产时的第一个结果。

      我接受了 Nik Ahmad Zainalddin 的回答,但它有一个弱点,&lt;script&gt; 标签之间的任何元素都会被清除。

      <script>
      </script>
      Inert text
      <script>
      </script>
      

      在上面的示例中,Inert text 将与脚本标签一起被删除。我最终改为执行以下操作:

      html = html.replace(/<\s*(script|iframe)[^>]*>(?:[^<]*<)*?\/\1>/g, "").replace(/(<(\b(img|style|head|link)\b)(([^>]*\/>)|([^\7]*(<\/\2[^>]*>)))|(<\bimg\b)[^>]*>|(\b(background|style)\b=\s*"[^"]*"))/g, "");
      

      此外,我添加了删除iframes 的功能。

      希望这对某人有所帮助。

      【讨论】:

        【解决方案6】:

        您可以使用以下正则表达式来删除所有 src 属性,而不是完全删除所有 img 元素:

        html = html.replace(/src="[^"]*"/ig, "");
        

        【讨论】:

        • 这会破坏 html,因为 src 属性对于 &lt;img&gt; 元素是必需的。见developer.mozilla.org/de/docs/Web/HTML/Element/img
        • 这可能是真的,但对于在其 css 选择器中使用 img 标记或需要来自图像属性之一的数据的任何人来说,这是一个很好的替代解决方案。
        【解决方案7】:

        实际上,如果您查看jQuery documentation,它表示您可以将“所有者文档”作为第二个参数传递给$。

        那么我们可以做的是create a virtual document,这样浏览器就不会自动加载提供的 HTML 中的图像:

        var ownerDocument = document.implementation.createHTMLDocument('virtual');
        $(html, ownerDocument).find('.some-selector');
        

        【讨论】:

        • 我还没有测试过这个,但在我看来它是解决这个问题的最佳解决方案。如果它不起作用,请告诉我。您仍然可以使用下面的字符串替换,但我一直认为它是 bad solution。
        • 谢谢,这是我需要的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2013-07-29
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多