创建JavaScript脚本以在Google Chrome扩展中创建书签列表时遇到的一些问题
我正在尝试创建一个JavaScript脚本,该脚本将创建用户书签的上下文菜单。我看过Chrome Extension Gallery中提供的各种扩展的代码,但它们都非常复杂,在某种程度上,有缺陷的大多数只会查看特定数量的子文件夹,然后停止。我正在尝试制作一个简单的脚本,它将适用于所有可能的项目,即使它们隐藏在非常深的文件夹层次结构中创建JavaScript脚本以在Google Chrome扩展中创建书签列表时遇到的一些问题,javascript,google-chrome,bookmarks,Javascript,Google Chrome,Bookmarks,我正在尝试创建一个JavaScript脚本,该脚本将创建用户书签的上下文菜单。我看过Chrome Extension Gallery中提供的各种扩展的代码,但它们都非常复杂,在某种程度上,有缺陷的大多数只会查看特定数量的子文件夹,然后停止。我正在尝试制作一个简单的脚本,它将适用于所有可能的项目,即使它们隐藏在非常深的文件夹层次结构中 chrome.bookmarks.getTree(function(children) { }); 以下脚本不起作用,但它演示了我想到的一个可能的解决方案: b
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中,将您的问题更新为另一个问题并不好,如果其他人想从中学习,这会使问题变得太混乱。如果你想要更多的问题,最好是为这个问题创建一个新的问题。