繁体   English   中英

如何使用jQuery克隆窗口服务器端?

[英]How can I clone a window server-side using jQuery?

我目前正在使用Node.jsjsdom在AngularJS服务器端运行。 它工作得很好,但是我想通过在将AngularJS范围应用于页面之前缓存jsdom生成的DOM来优化性能。 当我尝试为给定请求应用AngularJS范围之前尝试克隆缓存的DOM时,就会出现问题。 当前,我正在使用jQuery(服务器端)克隆缓存的DOM:

var clone = cachedWindow.$("html").clone(); // This part works fine

然后,我使用jsdom创建一个新窗口,并且html标记内没有内容(快速):

jsdom.env(
  '<!doctype html><html></html>',
  injectedScripts, // This is where I inject AngularJS, which works fine
  function(errors, newWindow) {
    newWindow.angular.bootstrap(newWindow.document, ['ngView']);
    newWindow.$("html").replaceWith(clone); // This part does not work
  }
);

问题来自newWindow.$("html").replaceWith(clone); 生成此错误:

{ code: 4, message: 'Wrong document' }

我理解这个问题与以下事实有关:我试图用一个来自另一个文档( cachedWindow )的DOM元素替换一个文档( newWindow )中的DOM元素,但是我想不出任何办法。 这很重要,因为克隆html元素(从字面上看)比用jsdom从头重新构建DOM快大约十倍...

有什么建议么?

笔记:

  • 一方面,我正在寻找的解决方案需要使用jsdom。
  • 另一方面,我还没有嫁给jQuery。 任何替代方案都可以。
  • 需要窗口克隆以防止并发请求出现问题并支持会话。
  • 有关更多背景,请在Sutoiku上查看CircularJS

解:

Jason Livesay使用document.importNode提供

var original = cachedWindow.document.getElementById("app");
...
var clone = newWindow.document.importNode(original, true);
newWindow.document.getElementById("app").appendChild(clone);

当我用谷歌搜索“错误文档”时,我看到一堆提到importNode的PHP XML东西。 因此,也许您也可以在JavaScript中使用它: https : //developer.mozilla.org/en-US/docs/Web/API/document.importNode

或类似以下内容: http : //jsdom.wordpress.com/2011/03/14/appendchild-problem-in-google-chrome-and-safari/

另外,如果您想优化该部分,只是仔细检查一下,您就是将最终的HTML保存到磁盘上了吗? 我的意思是您不是在每个请求上都呈现静态页面吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM