【问题标题】:construct a DOM tree from a string without loading resources (specifically images)从字符串构建 DOM 树而不加载资源(特别是图像)
【发布时间】:2011-01-19 02:47:46
【问题描述】:

所以我正在通过 AJAX 获取 RSS 提要。处理它们之后,我有一个要使用各种 jQuery 功能操作的 html 字符串。为此,我需要一棵 DOM 节点树。

我可以将 HTML 字符串解析到 jQuery() 函数中。
我可以将它作为 innerHTML 添加到某个隐藏节点并使用它。
我什至尝试过使用 mozilla 的非标准 range.createContextualFragment()。

所有这些解决方案的问题在于,当我的 HTML sn-p 具有 <img> 标记时,Firefox 会尽职尽责地获取引用的任何图像。由于此处理是不向用户显示的背景内容,因此我只想获得一个 DOM 树 浏览器不加载其中包含的所有图像。

这可以用 javascript 实现吗?我不介意它是否仅限于 mozilla,因为我已经在使用 javascript 1.7 功能(目前似乎仅限于 mozilla)

【问题讨论】:

    标签: javascript jquery image download


    【解决方案1】:

    答案是这样的:

    var parser = new DOMParser();
    var htmlDoc = parser.parseFromString(htmlString, "text/html");
    var jdoc = $(htmlDoc);
    console.log(jdoc.find('img'));
    

    如果您注意您的网络请求,您会发现即使 html 字符串被 jquery 解析和包装,也没有发出任何请求。

    【讨论】:

    • @gfxmonk:这个问题是在 IE10 之前的任何东西中都不支持使用 DOMParser 解析 HTML,并且在 Safari 中根本不支持。 IE10 终于添加了 HTML 解析,所以如果 Safari 的人愿意加入,它可能会在几年内变得可行。但如果您的目标浏览器不包括 Safari 或 IE8 或 IE9,它就可以工作。 jeromeyers - 当有重大支持问题时,最好在回答中提及。
    • @T.J.Crowder 感谢您的提醒。我不知道浏览器兼容性问题。那么,jquery 的跨浏览器扩展看起来就像你对旧浏览器和 safari 的回答和我对新浏览器的回答?
    【解决方案2】:

    显而易见的答案是解析字符串并从img 标记中删除src 属性(对于您不想加载的其他外部资源也类似)。但是您已经想到了这一点,我相信您正在寻找不那么麻烦的东西。我还假设您已经尝试在 jquery 解析字符串之后但在将其附加到文档之前删除 src 属性,并发现仍在请求图像。

    我没有想出其他任何东西,但您可能不需要进行完全解析;这个替换应该在 Firefox 中完成,但有一些注意事项:

    thestring = thestring.replace("<img ", "<img src='' ");
    

    注意事项:

    • 这似乎在当前的 Firefox 中有效。这并不意味着后续版本不会选择以不同方式处理重复的src 属性。
    • 这假设文字字符串“通用假设,该字符串可能出现在足够...有趣...页面上的属性值中,特别是在像这样的内联 onclick 处理程序中:&lt;a href='#' onclick='$("frog").html("&lt;img src=\"spinner.gif\"&gt;")'&gt;(尽管在例如,误报替换是无害的。)

    这显然是一种 hack,但在有限的环境中,数据相当知名......

    【讨论】:

    • @T. J. - 你是对的,除了火狐之外的所有浏览器都可以使用,看看是否有另一种方法。另外为了让你的更健壮,我建议将 src= 替换为 blah=,这也将消除 javascript 获取。
    • @Nick:解析然后删除除了在 FF 中有效吗?呵呵。经典,除了 OP 想要使用的一个浏览器之外的所有内容。 :-) 我没有尝试使用 src=,因为它使替换 much 更加复杂,必须确保它出现在标签内,等等,等等。跨度>
    • @T.J.不不,我的解决方案在任何地方都有效,除了 FF 这就是为什么我没有看到,但是同样具有讽刺意味:)
    • 干杯 :) 我最终将 src= 修改为 _src=,因为我想(在某些时候)反转该过程并取回图像 URL。鉴于我在最终显示之前将其反转,误报应该可以忽略不计。
    【解决方案3】:

    您可以使用DOM parser 来操作节点。 只需替换 src 属性,存储它们的原始值并稍后添加它们。

    示例:

        (function () {
            var s = "<img src='http://www.google.com/logos/olympics10-skijump-hp.png' /><img src='http://www.google.com/logos/olympics10-skijump-hp.png' />";
            var parser = new DOMParser();
            var dom = parser.parseFromString("<div id='mydiv' >" + s + "</div>", "text/xml");
            var imgs = dom.getElementsByTagName("img");
            var stored = [];
            for (var i = 0; i < imgs.length; i++) {
                var img = imgs[i];
                stored.push(img.getAttribute("src"));
                img.setAttribute("myindex", i);
                img.setAttribute("src", null);
            }
            $(document.body).append(new XMLSerializer().serializeToString(dom));
            alert("Images appended");
            window.setTimeout(function () {
                alert("loading images");
                $("#mydiv img").each(function () {
                    this.src = stored[$(this).attr("myindex")];
                })
                alert("images loaded");
            }, 2000);
        })();
    

    【讨论】:

    • 谢谢,这是一个很好的答案。唯一的问题(就我而言)是它只支持有效的 XML,这可能不适用于任意 RSS 提要内容(我希望它如何)。但是对于其他人来说,如果你能确保有效的 XML,你应该使用这个 ;)
    • "用 Javascript 解析 RSS 提要非常容易,因为 RSS 提要只是普通的 XML。"来自“使用 AJAX/Javascript 解析 RSS 提要”:captain.at/howto-ajax-parse-rss.php :-)
    • 是的,RSS 提要是有效的 XML。然而,条目内容只是包含作者作为条目“内容”发布的任何 HTML 混搭的 CDATA。那是(可悲的)我想要解析的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2012-11-15
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多