getAllBookmarks в Firefox - PullRequest
       23

getAllBookmarks в Firefox

0 голосов
/ 28 марта 2012

Я пытаюсь получить содержимое со всех узлов в меню закладок в textbox.value, но отображается только последняя закладка. Что я делаю не так?

function AllBookmarks()
{
    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 toolbarFolder = bookmarksService.toolbarFolder;
    //var bookmarksMenuFolder = bookmarksService.bookmarksMenuFolder;
    var unfiledBookmarksFolder = bookmarksService.unfiledBookmarksFolder;

    //query.setFolders([toolbarFolder], 1);
    //query.setFolders([bookmarksMenuFolder], 1);
    query.setFolders([unfiledBookmarksFolder], 1);

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

    // iterate over the immediate children of this folder
    for (var i = 0; i < rootNode.childCount; i ++) {
      var node = rootNode.getChild(i);
    }

    // close a container after using it!
    rootNode.containerOpen = false;
    var textbox = document.getElementById("MyExtension");
    var title= "Title: " + node.title; // shows the title of URL
    var url= "\nURL: " + node.uri; // shows the URL
    textbox.value = title + url + "\n";
}

1 Ответ

0 голосов
/ 28 марта 2012

В цикле, прокомментированном как «перебирать непосредственные дочерние элементы этой папки», вы, вероятно, правильно зацикливаетесь на каждой из закладок, но ничего не делаете с каждым узлом, прежде чем перейти к следующему.В результате переменная node устанавливается на последний узел при выходе из цикла.

Кроме того, вы присваиваете textbox.value, а не добавление к нему, так что даже если бы вы действовали на данные для каждого узла, вы бы каждый раз сжимали его, в результате чего только данные последнего узла (тот же результат!).Если вы хотите создать подобную строку, вы должны добавить к ней, а не присваивать ей.Один из способов сделать это - использовать оператор +=.

Итак, последняя часть кода должна выглядеть примерно так:

var textbox = document.getElementById("MyExtension");

// iterate over the immediate children of this folder
for (var i = 0; i < rootNode.childCount; i ++) {
  var node = rootNode.getChild(i);
  var title = "Title: " + node.title; // gets the title of URL
  var url = "\nURL: " + node.uri; // gets the URL
  textbox.value += title + ": " + url + "\n"; // note the += (append) operator
}
// close a container after using it!
rootNode.containerOpen = false;

Примечание: во многих других (более строгих) языкахваш опубликованный код не будет компилироваться, потому что вы используете переменную node за пределами "контекста" (фигурных скобок), в котором он был объявлен.Это хорошее эмпирическое правило: следовать этому принципу добровольно: нарушение этого правила часто означает, что вы совершаете ошибку или вам необходимо более тщательно продумывать, что вы делаете.В этом случае он мог предупредить вас о проблеме.

...