4

我有这个方法,它工作正常,除了在 Firefox 中:

function write(template) {
    document.open("text/html", "replace");
    document.write(template);
    document.close();
}

write("<!DOCTYPE html><head><title>MyPage</title></head><body>111</body><html>");

在 Firefox 中,无法再刷新整个页面,并且当您更新地址字段中的哈希时,它会强制完全刷新页面。

这不会发生在 chrome 中。

有没有一种不同的方法来更新整个文档,让 Firefox 继续运行?

谢谢!

- - - - - -编辑 - - - - -

我注意到有一个document.childNodes[0].remove()方法可以调用,它将删除旧文档,但我无法向该数组添加新的文档节点。

var node = document.createElement("html");
node.innerHTML = "<body>1111</body>";
document.childNodes[0].remove();
document.childNodes[0] = node;

似乎没有工作。有什么提示吗?

------------编辑2 ----------

function write(template) {
    var node = document.createElement("html");
    node.innerHTML = template;

    var head = node.getElementsByTagName("head")[0];
    var body = node.getElementsByTagName("body")[0];

    if ( head ) {
        document.documentElement.replaceChild(
            head,
            document.documentElement.getElementsByTagName("head")[0]
        );
    }

    if ( body ) {
        document.documentElement.replaceChild(
            body,
            document.documentElement.getElementsByTagName("body")[0]
        );
    }

}

不幸的是,这成功地替换了 dom,不像 write 它不会重新评估样式或脚本标签,使其无用:(

------- 编辑 3 -------

产生与 EDIT 2 相同的结果,使其也无用:

function write(template) {
    var node = document.createElement("html");
    node.innerHTML = template;

    document.replaceChild(node, document.childNodes[0]);

}

----- 编辑 4 -----

请看下面我的回答

4

3 回答 3

1

显然,当正确使用 html() 时,jQuery 能够重新评估脚本,这里是 write 方法:

function write(template) {
    var node       = document.createElement("html");
    node.innerHTML = template;

    var head = node.getElementsByTagName("head")[0];
    var body  = node.getElementsByTagName("body")[0];

    if ( head ) {
        jQuery("head").html(head.innerHTML);
    }

    if ( body ) {
        jQuery("body").html(body.innerHTML);
    }

}

write("<!DOCTYPE html><head><title>MyPage</title></head><body>111</body><html>");

:D

于 2013-08-27T10:49:58.037 回答
0

我建议你使用.html()jQuery 的功能。(或者innerHTML如果您更喜欢使用纯 Javascript)

如果文档 DOM 已经加载,则不应使用document.write.

于 2013-08-27T07:49:43.197 回答
0

替换 DOM 后,您可以通过创建新元素手动重新评估scripts 和styles:

function write(template) {
  var node = document.createElement("html");
  node.innerHTML = template;

  var head = node.getElementsByTagName("head")[0];
  var body = node.getElementsByTagName("body")[0];

  if ( head ) {
      document.documentElement.replaceChild(
        head,
          document.documentElement.getElementsByTagName("head")[0]
      );
  }

  if ( body ) {
      document.documentElement.replaceChild(
        body,
         document.documentElement.getElementsByTagName("body")[0]
    );
  }


var scripts = document.getElementsByTagName("script"),
styles = document.getElementsByTagName("style");

var or_scripts_length = scripts.length,
or_styles_length = styles.length;

//reproduce scripts
for(var i=0; i<or_scripts_length; i++){
   new_script = document.createElement("script");
   new_script.setAttribute("src", scripts[i].src);
   document.head.appendChild(new_script);
  if(i == or_scripts_length)
     break; //in order to avoid revaluating new created scripts which results to an infinite loop
 }

 //do the same for styles
}
于 2016-02-19T05:44:35.427 回答