Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一种算法,用于保存包含链接和所有内容的网页的精确静态副本,以便将其作为原始文件打开_Javascript_Html_Node.js - Fatal编程技术网

Javascript 一种算法,用于保存包含链接和所有内容的网页的精确静态副本,以便将其作为原始文件打开

Javascript 一种算法,用于保存包含链接和所有内容的网页的精确静态副本,以便将其作为原始文件打开,javascript,html,node.js,Javascript,Html,Node.js,我正在尝试制作一个书签应用程序。我希望用户能够保存网页的特定部分 我正在考虑用完整的静态副本保存原始目标网页的一些坐标。因此,当用户打开保存的副本时,他将获得原始网页的精确副本以及所选部分的坐标。我需要保存副本,因为网页上的内容会随着时间的推移而改变 有点帮助。我在他们的网站上试用了premailer在线工具,但它无法捕获繁重的js站点。我在后端使用node.js 请给我指引正确的方向。谢谢

我正在尝试制作一个书签应用程序。我希望用户能够保存网页的特定部分

我正在考虑用完整的静态副本保存原始目标网页的一些坐标。因此,当用户打开保存的副本时,他将获得原始网页的精确副本以及所选部分的坐标。我需要保存副本,因为网页上的内容会随着时间的推移而改变

有点帮助。我在他们的网站上试用了premailer在线工具,但它无法捕获繁重的js站点。我在后端使用node.js


请给我指引正确的方向。谢谢
  • 您只想保存显式列出的文件
  • 您希望保存显式列出和隐式加载(即通过JS生成的URL+AJAX)文件
  • 第一种情况很容易用HTML解析器实现。我不打算讨论这个问题,因为你提到了“重js站点”,这似乎意味着你对第二种情况感兴趣

    @Bergi(对这个问题的第一个评论)有一个正确的想法:加载页面,然后存储所有下载的内容。但是,您必须有某种方式将其作为静态HTML页面打开。这可以通过将所有AJAX调用重写为原始函数调用来实现。(剧透:这是一个非常糟糕的方式)

    例如:

    $.get(url, data, callback);
    
    需要转化为:

    callback(response);
    
    这不是一件小事。JavaScript是一种非常灵活的语言。实现AJAX调用的方法太多了,因此用一种适用于所有JS代码的方式重写JS是不可行的。更糟糕的是,代码可能依赖于AJAX调用,而不是立即返回(糟糕的形式和糟糕的想法,但这毕竟是互联网)

    如果您愿意放弃独立的静态HTML解决方案,那么问题可以简化。您可以实现一个chrome或firefox扩展(或独立应用程序),将所有必需的数据保存到缓存中,然后在加载保存的版本时,强制将其从缓存中取出,或者使用伪造的
    XMLHttpRequest
    对象来阻止查询远程服务器。您还可以在此环境中伪造日期/时间和其他外部状态变量

    我处理这个问题的方法是采用现有的可定制渲染器(如Chrome、Firefox)并实现如上所述的扩展


    无论如何,我会认真地重新考虑这样一个解决方案的必要性。用更简单的方法(在浏览器中加载HTML图像地图链接的屏幕截图)可以解决这个问题吗?我觉得这个问题可能不需要这么复杂的解决方案,但是没有给出关于你的问题的很多细节,所以我可能是错的。

    尝试使用phantomjs加载页面。如果需要精确的副本,您可以捕获并存储所有请求的资源。但是,当“重新加载”副本时,您可能还需要伪造当前时间,以及可能已发生变化的其他一些全局条件。我不会尝试存储动态(重js)“精确副本”-在“重播时间”有太多可能出错的方法。我会尝试在建议的坐标处提取DOM,并且只存储它(可能包括css和图像)。谢谢Bergi。但是现在大多数网站都使用了很多js。忽略这一点不会让这个应用成为未来的证明。我没说你应该忽略它。但是,对于“静态副本”,您不需要存储页面时页面中的交互性,是吗?您只需要快照“当前状态”。或者,你的“书签应用程序”到底应该用于什么目的呢?小心版权问题谢谢,这很有帮助。Chrome和firefox扩展将使从网页中收集数据变得更容易,以便再次显示。你能给我一些我应该研究的技术术语吗。Evernote做到了。我正在寻找类似的技术。不,你不应该试图重写js-那只会出错。相反,伪造/模拟底层API(即js环境中的
    XMLHttpRequest
    ,甚至浏览器中的HTTP堆栈(如果您有权访问该堆栈)。@Bergi:您会注意到,我建议不要这样做。我把它提出来,然后把它击落,因为它会在某个时候被建议。最好是用一些理由来说明为什么要避免这样做。假装
    XMLHttpRequest
    或多或少是我建议的,尽管你的措辞更好。好吧,但也许你应该将“这意味着将所有AJAX调用重写为原始函数调用。”改为类似“这可以通过…”的内容。我发现了一个名为SingleFile的chrome扩展名,它将页面另存为.html文件。我会调查的。谢谢你的提示。