【问题标题】:Firefox bookmarks exploration not going past first level with JavascriptFirefox 书签探索没有超过 Javascript 的第一级
【发布时间】:2011-06-07 08:51:17
【问题描述】:

我编写了一些代码来探索我的 Firefox 书签,但我只获得了第一级书签(即我没有获得文件夹中的链接)。

例如

  • 搜索引擎/

    • yahoo.com
  • google.com

在这个例子中,我只能访问 Search_engines 和 google.com 而不是 yahoo.com

我的函数是递归的,我不知道为什么会这样。

我的代码:

function browse_bookmark_node(bookmark_node, array)
{
    // We explore the bookmarks with this function     
   // iterate over the immediate children of this folder
   for (var i = 0; i < bookmark_node.childCount; i ++) {
       var node = bookmark_node.getChild(i);
       if (node.type ==0) {
          // the node is a link so we add it to the array
          array.push(node.title); 
       } else if (node.type ==6) {
          // the node is a folder so we explore it
          browse_bookmark_node(node, array);
       }
   }
}

function wrapper_browse_bookmark_node(bookmark_node) {
   // We use this function to wrapp the function browse_bookmark_node and keep track of the links
   var array = [];
   browse_bookmark_node(bookmark_node, array);
   return array;
}

// All the code following is used to access firefox bookmarks and works fine
var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"]
                               .getService(Components.interfaces.nsINavHistoryService);
var options = historyService.getNewQueryOptions();
var query = historyService.getNewQuery();

var bookmarksService = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
                                 .getService(Components.interfaces.nsINavBookmarksService);
var bookmarksMenuFolder = bookmarksService.bookmarksMenuFolder;

query.setFolders([bookmarksMenuFolder], 1);

var result = historyService.executeQuery(query, options);
var rootNode = result.root;
rootNode.containerOpen = true;

// The function call to explore the bookmarks
var links_array = wrapper_browse_bookmark_node(rootNode);

// close a container after using it!
rootNode.containerOpen = false;

【问题讨论】:

  • @Wladimir Palant 非常感谢您的回答。阅读我的代码后,我意识到其中有一个错字!

标签: javascript function recursion firefox-addon bookmarks


【解决方案1】:

一个明显的错误是使用toolbarFolder 作为起点——那只是书签工具栏。如果您想要所有书签(即书签菜单、书签工具栏和未排序的书签),您需要更改查询参数:

query.setFolders([
    bookmarksService.bookmarksMenuFolder,
    bookmarksService.toolbarFolder,
    bookmarksService.unfiledBookmarksFolder
], 3);

另一个问题是在 nsINavHistoryResultNode 对象上获取 childCount 属性 - 没有这样的属性。在访问nsINavHistoryContainerResultNode 的属性之前,您需要显式或隐式调用QueryInterface(通过instanceof)。所以我会写:

} else if (node.type == 6 && node instanceof Components.interfaces.nsINavHistoryContainerResultNode) {
    var oldOpen = node.containerOpen;
    node.containerOpen = true;
    browse_bookmark_node(node, array);
    node.containerOpen = oldOpen;
}

【讨论】:

  • @Wladimir Palant 感谢您的回答,但我只需要浏览书签菜单文件夹,问题实际上是文件夹的探索(我已经更新了我的帖子以放置我的实际代码)。
  • @Wladimir Palant 我已经更新了我的帖子(我之前放了一个旧版本,我的错)。
  • 我更新了我的答案,并在您的代码中添加了另一个问题。
  • @Wladimir Palant 谢谢,您的代码工作正常,除非我在另一个文件夹中有一个文件夹(包含链接)。在这种情况下,文件夹的链接不会出现,文件夹被视为链接。
  • 我没有看到任何问题。嵌套文件夹仍然具有类型 6,通常可以获取其子级。
【解决方案2】:

只是为了节省任何想要获得所有书签的人的时间,不要这样做 query.setFolders([ bookmarksService.bookmarksMenuFolder, bookmarksService.toolbarFolder, bookmarksService.unfiledBookmarksFolder ], 3); 正如弗拉基米尔所建议的那样,因为它不会为您带来所有书签,而是对文件夹进行交叉处理,并且只为您提供放置在所有这些文件夹中的书签,如 Mozilla 文档中所写的

您可以设置多个文件夹,结果将是所有文件夹的交集。

(https://developer.mozilla.org/en/Querying_Places)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多