2011-06-07 18 views
0

我已經寫了一些代碼來探索我的Firefox書籤,但我只獲得第一級的書籤(即我沒有得到文件夾中的鏈接)。Firefox書籤探索不會超過第一級使用Javascript

例如

  • Search_engines/

    • yahoo.com
  • google.com

在這個例子中我只有Search_engines訪問和google.com不是雅虎.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; 
+0

@Wladimir Palant非常感謝您的回答。在閱讀我的代碼後,我意識到它有一個錯字! – Bruno 2011-06-07 12:23:00

回答

2

一個明顯的錯誤是使用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; 
} 
+0

@Wladimir Palant感謝您的回答,但我只需要瀏覽書籤菜單文件夾和問題是真正的文件夾的探索(我更新了我的帖子,把我的實際代碼)。 – Bruno 2011-06-07 10:05:42

+0

我明白了,你現在編輯了這個問題。 – 2011-06-07 10:08:33

+0

@Wladimir Palant我已經更新了我的文章(之前我曾經提過一箇舊版本,我的錯誤)。 – Bruno 2011-06-07 10:09:51

0

只是爲了節省時間,以誰想要得到的所有書籤的人,不要做 query.setFolders([ bookmarksService.bookmarksMenuFolder, bookmarksService.toolbarFolder, bookmarksService.unfiledBookmarksFolder ], 3); 由弗拉基米爾的建議,因爲它不會給你帶來的所有書籤而是做該文件夾的相交,並只給ü其放置在所有這些文件夾,如Mozilla的文檔的

您可以設置多個文件夾寫入,結果將是所有文件夾的交叉點上的書籤。

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