创建JavaScript脚本以在Google Chrome扩展中创建书签列表时遇到的一些问题

创建JavaScript脚本以在Google Chrome扩展中创建书签列表时遇到的一些问题,javascript,google-chrome,bookmarks,Javascript,Google Chrome,Bookmarks,我正在尝试创建一个JavaScript脚本,该脚本将创建用户书签的上下文菜单。我看过Chrome Extension Gallery中提供的各种扩展的代码,但它们都非常复杂,在某种程度上,有缺陷的大多数只会查看特定数量的子文件夹,然后停止。我正在尝试制作一个简单的脚本,它将适用于所有可能的项目,即使它们隐藏在非常深的文件夹层次结构中 chrome.bookmarks.getTree(function(children) { }); 以下脚本不起作用,但它演示了我想到的一个可能的解决方案: b

我正在尝试创建一个JavaScript脚本,该脚本将创建用户书签的上下文菜单。我看过Chrome Extension Gallery中提供的各种扩展的代码,但它们都非常复杂,在某种程度上,有缺陷的大多数只会查看特定数量的子文件夹,然后停止。我正在尝试制作一个简单的脚本,它将适用于所有可能的项目,即使它们隐藏在非常深的文件夹层次结构中

chrome.bookmarks.getTree(function(children) {

});
以下脚本不起作用,但它演示了我想到的一个可能的解决方案:

bookmarkObject = ITEM_FROM_ARRAY_OF_ALL_BOOKMARK_OBJECTS;
var OBJECT_NUMBER = chrome.contextMenus.create({
    "contexts": ["all"],
    "onclick": function() {
        return function() {
            if (bookmarkObject.url) {
                chrome.tabs.create({
                    "url": bookmarkObject.url
                });
            }
            else {
                return null;
            };
        };
    }(bookmarkObject),
    "parentId": bookmarkObject.parentId,
    "title": bookmarkObject.title,
    "type": "normal"
});
我认为,如果脚本将所有项目的Id值OBJECT_NUMBER设置为变量,脚本应自动将该变量用作任何可能的子项目的bookmark.parentId值,并以适当的方式自动嵌套树。这只是一个猜测;如果我错了,请告诉我

但是,我无法确定如何获取所有书签对象的数组,我只能设法检索特定文件夹中的书签对象数组。此外,我无法解决如何动态运行我为检索到的每个项目发布的代码,自动将OBJECT_编号设置为相关对象的Id值

有人能帮忙吗

编辑:我根据Mohamed Mansour的演示脚本做了大量更改,并得出以下脚本:

window.addEventListener("load", function() {
    init();
}, false);

function init() {
    chrome.bookmarks.getTree(function(children) {
        addBookmarks(children);
    });
};

function addBookmarks(bookmarks, parent) {
    bookmarks.forEach(function(bookmarkObject) {
        var bookmarkObject =    chrome.contextMenus.create({
            "contexts": ["all"],
            "onclick": function() {
                return function() {
                    if (bookmarkObject.url && bookmarkObject.url.length) {
                        chrome.tabs.create({
                            "url": bookmarkObject.url
                        });
                    };
                };
            }(bookmarkObject),
            "parentId": parent,
            "title": function() {
                if (bookmarkObject.url && bookmarkObject.url.length) {
                    return bookmarkObject.title;
                }
                else {
                    return chrome.i18n.getMessage("contextmenu_label");
                };
            }(bookmarkObject),
            "type": "normal"
        });
        if (bookmarkObject.children) {
            addBookmarks(bookmarkObject.children, bookmarkObject);
        };
    });
};

在某种程度上,它似乎正在工作,因为它没有在JavaScript控制台中返回任何错误。但是,当根元素显示为上下文菜单时,其名称由命令chrome.i18n.getMessagecontextmenu_label检索,但没有嵌套子元素,也没有显示它们。谁能帮我确定我做错了什么吗?

你看过书签API getTree了吗?

它将允许您从整个层次结构中获取所有书签

chrome.bookmarks.getTree(function(children) {

});
然后需要解析该结果,因为每个节点都有一个书签列表。如果您愿意,您可以递归地执行此操作,甚至可以进行迭代

以下是我如何获取所有书签,并将它们显示在从我的内部示例库中获取的弹出窗口上,我使用这些示例库来帮助用户:

var prefix = 'bookmark_';

function addBookmark(bookmark, parent) {
  var child = document.createElement('li');
  child.className = 'bookmark';
  child.id = prefix + bookmark.id;
  if (bookmark.url && bookmark.url.length) {
    var link = document.createElement('a');
    link.href = bookmark.url;
    link.innerHTML = bookmark.title;
    link.className = 'bookmark_title';
    link.onclick = function() {
       chrome.tabs.create({url: bookmark.url});
       return false;
    };

    child.appendChild(link);
  } else {
    var title = document.createElement('div');
    title.innerHTML = bookmark.title;
    title.className = 'bookmark_title';
    child.appendChild(title);
  }
  parent.appendChild(child);
}

function addBookmarks(bookmarks, parent) {
  var list = document.createElement('ul');
  parent.appendChild(list);
  bookmarks.forEach(function(bookmark) {
    addBookmark(bookmark, list);
    if (bookmark.children)
      addBookmarks(bookmark.children, list);
  });
}

function loadBookmarks() {
  var container = document.getElementById('container');
  var rootElement = document.createElement('div');

  var rootId = 0;
  rootElement.id = prefix + rootId;

  container.appendChild(rootElement);
  chrome.bookmarks.getTree(function(children) {
    console.log(children);
    addBookmarks(children, rootElement);
  });
}

您可以修改它以满足您的上下文菜单需要。

谢谢!我根据你的剧本整理了一个剧本,并把它贴回了问题中。不过,正如问题中提到的,我还有一些问题。您如何获取家长id?通过我的示例,看看父id是如何完成的。在Stackoverflow中,将您的问题更新为另一个问题并不好,如果其他人想从中学习,这会使问题变得太混乱。如果你想要更多的问题,最好是为这个问题创建一个新的问题。