【问题标题】:using javascript to save information locally使用javascript在本地保存信息
【发布时间】:2012-07-22 01:09:11
【问题描述】:

我想写一个greasemonkey脚本来抓取网站并在本地保存数据,我可以使用javascript来保存本地收集的信息吗?

【问题讨论】:

    标签: javascript greasemonkey


    【解决方案1】:

    Local storage 是现代应用的首选!

    【讨论】:

    • 是否可以将此数据保存或移动到文本文件中?
    • 不,我其实不知道这个功能。我在网络应用程序中使用过它;在 Chrome 中,您可以使用开发者控制台查看数据,但在 Firefox 中...
    • 您还可以使用 GM_getValue 和 GM_setValue 为跨多个页面的脚本存储单个变量。
    • 有没有办法使用本地存储跨多个页面存储变量?我通常为此使用 GM_setValue 和 GM_getValue,但也可能有其他选项。
    【解决方案2】:
    window.location ="data:application/octet-stream," + encodeURI(JSON.stringify(translations.custom));
    

    这就是 Pixiv 翻译脚本如何保存自定义添加的翻译(未硬编码到其中)。您只需获得一个文件保存对话框,就像您单击了直接链接一样。

    Translations.custom 只是 JSON 格式的对象 (var a = {b : 1};)。

    我不知道你必须如何格式化你的数据,如果它不是 JSON,但我猜你可以尝试一下。

    另一种方法是替换整个文档的 html,然后保存页面。

    【讨论】:

    • +1,这确实有效(使用encodeURI(sometext) 表示文本),尽管缺少默认文件名令人讨厌。
    【解决方案3】:

    我建议使用 JQuery 的 data 方法,因为它提供跨平台支持,并且对您可以存储的信息量没有明确的限制。

    幕后花絮

    在内部,jQuery 创建一个空对象(称为 $.cache 好奇),用于存储您通过数据设置的值 方法。您向其中添加数据的每个 DOM 元素都分配有唯一的 ID 它用作 $.cache 对象中的键。 jQuery 不存储 该缓存中只有用户创建的数据。它还存储内部 您附加的信息和事件处理功能 活(),绑定()和委托()。拥有集中的数据存储使得 jQuery 的代码库更加健壮且无错误,这是我们所有人 可以从中受益。

    参考:jQuery’s Data Method – How and Why to Use It

    【讨论】:

    • data 方法不会像 OP 想要的那样“保存”信息。当页面关闭或重新加载时,此类数据会丢失。
    • 当然可以,但是单独使用 Javascript 总是如此。
    【解决方案4】:

    java.lang.Object ↳ android.webkit.CookieManager

    或者你可以使用这种逻辑..

    <html>
    <head>
    <script type="text/javascript">
    function getCookie(c_name)
    {
    var i,x,y,ARRcookies=document.cookie.split(";");
    for (i=0;i<ARRcookies.length;i++)
    {
    x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
    y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
    x=x.replace(/^\s+|\s+$/g,"");
    if (x==c_name)
    {
    return unescape(y);
    }
    }
    }
    
    function setCookie(c_name,value,exdays)
    {
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
    }
    
    function checkCookie()
    {
      var username=getCookie("username");
      if (username!=null && username!="")
      {
        alert("Welcome again " + username);
       }
     else 
       {
         username=prompt("Please enter your name:","");
        if (username!=null && username!="")
         {
           setCookie("username",username,365);
         }
      }
     }
    </script>
    </head>
    <body onload="checkCookie()">
    </body>
    </html>
    

    【讨论】:

      【解决方案5】:

      使用 Mozilla 的文件对象。 MDN 文档:https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FO

      编辑:这更容易,但仅适用于 Chrome http://www.html5rocks.com/en/tutorials/file/filesystem/

      【讨论】:

      • LOL 有人不喜欢我的回答……至少我没有说 ActiveX FileSystemObject!
      • Mozilla 文件 I/O 用于扩展。它不适用于 Greasemonkey 或普通 JS。同样,HTML5 文件系统在 Greasemonkey(即 Firefox)中也不起作用。最多,此答案的 部分 可能有效 - 但仅适用于 Chrome 用户脚本,而不是指定问题的 Greasemonkey 脚本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多