Firefox书签浏览不超过Javascript的第一级
我已经写了一些代码来浏览我的Firefox书签,但我只获得了第一级书签(即,我没有获得文件夹中的链接) e、 gFirefox书签浏览不超过Javascript的第一级,javascript,function,recursion,firefox-addon,bookmarks,Javascript,Function,Recursion,Firefox Addon,Bookmarks,我已经写了一些代码来浏览我的Firefox书签,但我只获得了第一级书签(即,我没有获得文件夹中的链接) e、 g 搜索引擎/ 雅虎网站 谷歌网站 在这个例子中,我只能访问搜索引擎和google.com,而不能访问yahoo.com 我的函数是递归的,我不知道为什么会发生这种情况 我的代码: function browse_bookmark_node(bookmark_node, array) { // We explore the bookmarks with this func
- 搜索引擎/
- 雅虎网站
- 谷歌网站
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;
函数浏览书签节点(书签节点,数组)
{
//我们使用此功能浏览书签
//迭代此文件夹的直接子级
对于(var i=0;i
一个明显的错误是使用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;
}
只是为了节省时间,任何人谁想要得到所有的书签,不要这样做
query.setFolders([
bookmarksService.bookmarksMenuFolder,
bookmarksService.Toolbar文件夹,
bookmarksService.unfiledBookmarksFolder
], 3);
正如Wladimir所建议的,因为它不会给你所有的书签,而是对文件夹进行交叉,只给你所有文件夹中的书签,就像Mozilla doc上写的那样
您可以设置多个文件夹,结果将是所有文件夹的交集
()@Wladimir Palant谢谢你的回答,但我只需要浏览bookmarksMenuFolder,问题实际上是对文件夹的探索(我更新了我的帖子以放入我的实际代码)。@Wladimir Palant我更新了我的帖子(我以前放了一个旧版本,我错了)。我更新了我的答案,并在您的代码中添加了另一个问题。@Wladimir Palant谢谢,您的代码工作正常,除非我在另一个文件夹中有一个文件夹(包含链接)。在这种情况下,文件夹的链接不会出现,并且文件夹被视为链接。我在这里看不到任何问题。嵌套文件夹仍然具有类型6,可以像往常一样获取其子文件夹。@Wladimir Palant非常感谢您的回答。读了我的代码后,我意识到里面有一个打字错误!