代码之家  ›  专栏  ›  技术社区  ›  Ken Browning

如何使用jquery替换整个HTML节点

  •  56
  • Ken Browning  · 技术社区  · 17 年前

    我有一根绳子,看起来像:

    <html><head><title>example</title></head><body>some example text</body></html>
    

    我得到这个字符串作为一个Ajax请求的结果返回。

    我希望浏览器呈现和显示该字符串。这样做的目的是:

    $('html').parent().html(myString);
    

    好吧,那不管用。我曾尝试使用iframe,但我也没想到如何让它起作用。

    注: 我不可能改变这根绳子。在随后对服务器的调用中,我也不可能重新生成这个字符串(否则我可以将浏览器重定向到该URL)。

    5 回复  |  直到 7 年前
        1
  •  119
  •   Jon Benedicto    14 年前

    document.open/write/close方法将按您的要求执行:

    var newDoc = document.open("text/html", "replace");
    newDoc.write(myString);
    newDoc.close();
    

    除非传入replace参数,否则document.open调用将添加页面历史记录。因此,用户必须单击两次“后退”才能转到上一页。

        2
  •  14
  •   Marius    17 年前

    您可以去掉HTML标记,然后将所有内容放入HTML元素中:

    $('html').html(myString.replace(/<html>(.*)<\/html>/, "$1"));
    
        3
  •  6
  •   grssn    10 年前

    至少在火狐(47.0)中,解决方案是:

    var newDoc = document.open("text/html", "replace");
    newDoc.write(response);
    newDoc.close(); 
    

    由于按firefox上的back按钮仍然会加载上一个历史记录条目,因此无法按建议工作-即,使用“replace”的整个要点是避免让用户单击back按钮,只会在上次调用document.write()之前收到页面视图的问候。这样做的方法不会造成上述效果,只需直接在文档对象上调用方法:

    document.open("text/html", "replace");
    document.write(response);
    document.close();
    

    使用replace选项不仅可以避免用垃圾填充用户历史记录,而且还可以帮助处理浏览器处理由javascript创建的历史记录条目的奇怪方式引起的问题,因为有时允许浏览器记录由javascript在历史记录中对文档所做的更改可能会有意想不到的结果。处理后退/前进操作时的结果(例如,在对文档执行document.write()后,将“wyciwyg://(somenumber)”添加到URL,该文档的历史记录将恢复为以前的状态)。

        4
  •  4
  •   emtrane    15 年前

    另一个要尝试的变化可能是

    $('html').replaceWith(myString);
    

    http://api.jquery.com/replaceWith/

        5
  •  1
  •   Serg    7 年前
    document.documentElement.innerHTML = myString;
    

    除IE9外,它工作正常。