代码之家  ›  专栏  ›  技术社区  ›  Andrew Matthews

无法从父级替换iframe中的div

  •  0
  • Andrew Matthews  · 技术社区  · 15 年前

    我有一个iFrame,我这样填:

    var usableUrl = unescape(url);
    var iframe = $("<iframe id='pageContentDownloader' name='pageContentDownloader' style='display:block'></iframe>");
    $("body").append(iframe);
    iframe.load(usableUrl, null, ondocloaded);
    iframe.css({ "width": $(window).width(), "height": $(window).height(), "border": "0px" });
    

    稍后,我希望用自己的修改版本替换所有的<P>和<DIV>:

    $("#pageContentDownloader").contents().find("p, div")
                .each(function () {
                    var para = $(this).text();
                    var words = para.split(" ");
                    var aWords = new Array();
                    $.makeArray(words, aWords);
                    var newPara = makePara(aWords);
                    $(this).replaceWith(newPara);
                });
    

    但出于某种原因,最后一个命令不起作用。我看到了 $(this) 是iframe中的原始段落(我可以看到它的内容,我知道它是该段落的原始未修改版本),newpara肯定包含适当修改的内容。

    这个 $(this).replaceWith() 似乎工作不正常。有关用中的文本元素替换标记的问题的注释 replaceWith API docs 此处不适用,因为替换内容是用<SPAN>s填充的<DIV>。

    这是一个奇怪的<iframe>/query 1.4+问题吗?我在HTML5、XHTML和IE8以及Chrome5测试版上测试过这个。他们都给我留下了一个空名字。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Pekka    15 年前

    你没有显示什么 newPara() 但如果它创建了一个新的dom元素,这可能是问题的根源:您隐式地将一个节点从一个文档移动到另一个文档。它 能够 如果iframe不接受这一点(尽管原则上应该有一条错误消息)。

    如果这是真的,则必须在iframe中创建dom元素,或者插入原始HTML而不是完成的节点。

    你可以尝试使用 $(iframe).document.createElement("p"); 而是创建元素

    $(html) 有第二个论点, ownerDocument . 尝试显式指定 $(iframe).document 创建要替换的元素时作为所有者文档。