【问题标题】:Get Google Chrome's root bookmarks folder获取谷歌浏览器的根书签文件夹
【发布时间】:2010-05-11 16:42:51
【问题描述】:

我正在尝试在 Chrome 扩展程序中编写一个更好的书签管理器。问题是没有关于如何实际使用bookmarks API 的简单示例(我可以找到)。

我查看了示例源代码(当我 d/led 并将其安装在我的计算机上时,它除了提供一个搜索框之外什么也没做。键入/键入和按回车键没有做任何事情)并且不能找到有用的东西。

我的最终目标是制作一个扩展程序,让我可以保存页面以供以后阅读而无需在某处注册某个服务的帐户。所以我计划在根文件夹/其他书签中创建一个或两个书签文件夹 - 至少是一个“未读页面”文件夹。在该文件夹中,我将创建未读书签。当用户将该项目标记为已读时,它将从该文件夹中删除。

所以这就是我想要做的......任何帮助将不胜感激,即使它只是为我指出一些很好的例子。

更新:

...<script>
function display(tree){
   document.getElementById("Output").innerHTML = tree;
}
function start(){
   chrome.bookmarks.getTree(display);
}
</script>
</head>
<body>
<h4 id="Output"></h4>
<script>
 start();
</script>
...

显示[object Object],这表明(至少对 JavaScript 经验有限的我而言)存在一个对象。但是如何访问该对象的成员呢?

tree 更改为tree.id 或任何其他看起来像参数的内容会显示undefined

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension bookmarks


    【解决方案1】:

    目前,在书签 API 中没有找到“其他书签”或“书签栏”等文件夹的好方法。您必须遍历所有书签并找到哪个节点具有这些根文件夹并保存其书签 ID。该错误已提交Issue 21330

    root id 始终为 0,当我指的是 0 时,它对应于“书签栏”和“其他书签”。与任何树结构一样,每个节点都有子节点。如果要获取一个文件夹下的所有书签,可以使用 getChildren API 并递归获取每个节点(也可以迭代)。例如,以下将获取每个书签:

    printBookmarks('0');
    
    function printBookmarks(id) {
     chrome.bookmarks.getChildren(id, function(children) {
        children.forEach(function(bookmark) { 
          console.debug(bookmark.title);
          printBookmarks(bookmark.id);
        });
     });
    }
    

    现在,为什么我们必须为每次迭代调用 API?他们是获取整个树的 API。如果您尝试过,您会看到 getTree 中的每个节点都有一个子节点列表。这是完美的:

    chrome.bookmarks.getTree(function(bookmarks) {
      printBookmarks(bookmarks);
    });
    
    function printBookmarks(bookmarks) {
      bookmarks.forEach(function(bookmark) {
        console.debug(bookmark.id + ' - ' + bookmark.title + ' - ' + bookmark.url);
        if (bookmark.children)
          printBookmark(bookmark.children);
      });
    }
    

    就是这样,您也可以迭代地执行所有这些操作,这样性能会更好,但您可以弄清楚这一点 :) 请注意,由于您想要重做书签栏,您可以在扩展中覆盖该页面(很快): http://code.google.com/chrome/extensions/override.html

    如果你想显示一个漂亮的书签 HTML 树,你可以通过扩展我上面展示的 getTree 功能来接受父 DOM 来轻松做到这一点。你可以做一些事情like this。编辑代码以使用 getTree 或折叠所有内容并使用 getChildren 并在他们请求时获取更多书签。

    【讨论】:

    • 感谢您的冗长解释。为了使 src.chromium.org 上的上述链接代码正常工作(十年后),我只需将脚本移动到外部文件中并推迟它,将函数调用也移动到脚本中,并将所有提及的“ id" 从 int 到 string。它就像一个魅力!开始构建我的扩展的完美样板:~)
    【解决方案2】:

    书签以树的形式组织, 树中的每个节点都是 书签或组(一个文件夹 可以包含节点)。中的每个节点 树由 a 表示 BookmarkTreeNode 对象。

    在文件系统对象的意义上没有根书签文件夹。所有书签都存储在一个结构化文件中,您可以通过您提供的链接中的 api 访问该文件。树的根由 getTree 返回:

    chrome.bookmarks.getTree
    

    【讨论】:

    • 虽然这可能是真的,但我尝试过的每一种形式和时尚都无法返回正确的结果。 chrome.bookmarks.getTree 实际上并不返回值。它需要一个函数,并且据说它对那个函数做了一些事情,但问题就在这里——没有简单的例子说“这得到了根节点,等等等等”。有一个非常高级的示例,但据我所知,它不再有效(因为它不起作用,我遇到了一些关于他们如何更新 API 的链接)
    【解决方案3】:

    好的,我已经发现了如何访问我想要的内容。回想起来我应该早点看到的。

    http://code.google.com/chrome/extensions/tut_debugging.html

    使用调试器,我能够设置断点并查看对象。 [object Object] 是一个长度为 1 的数组。

    使用我的示例中给出的函数,tree[0].children 是包含子项的数组。在我的默认设置树上有两个孩子,tree[0].children[0] 是“书签栏”,而 tree[0].children[1] 是“其他书签”。书签树的其余部分从那里向下流动,尽管“其他书签”(tree[0].children[1]) 是我要查找的文件夹。

    【讨论】:

    • 这可能不适用于自定义书签文件夹顺序的用户。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2013-08-05
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多