我正在使用活动页面!!并需要使用子菜单(深树)创建上下文菜单
它的深度取决于用户数据。并且创建该上下文菜单可能非常频繁,因为它取决于用户的操作。我可以用一些逻辑来降低这些更新的频率,但是在会话期间它可能会发生几次
问题是创建这些菜单会使Chrome冻结一两秒
由于我使用的是活动页面,因此我必须使用chrome.contextMenus.onClicked.addListener
。之前,当我使用onClick处理程序时,我没有经历过冻结(相同数量的数据)
现在我必须将子菜单创建放在我的主上下文项的回调中(任何其他方法?)。
这就是我做到的:
function createMenu(data) {
chrome.contextMenus.removeAll(function() {
chrome.contextMenus.create({
id: "v7",
title : "some title",
type : "normal",
contexts : ["editable"],
}, function() {
function buildTree(NTF, parID) {
for (var i=0, l=NTF.length; i<l; i++) {
var menuId = NTF[i].id;
var menuText = NTF[i].text;
chrome.contextMenus.create({
id: menuId,
parentId: parID,
title: menuText,
type: "normal",
contexts: ["editable"],
});
if (NTF[i].children) buildTree(NTF[i].children, menuId);
}
}
buildTree(data, 'v7');
});
});
}
这是我点击的handeler
chrome.contextMenus.onClicked.addListener(function(info, tab) {
if (info.menuItemId.indexOf("id_pattern_of_my_submenu_items") > -1) {
//do some stuff with it
}
});
有没有更好的方法来完成这项工作而不冻结铬? 我的数据数组包含大约700个节点,最大深度为3 lvl。
答案 0 :(得分:1)
我在https://crbug.com/486505打开了一个错误报告。问题是由于事件页面在事件页面中添加,修改或删除上下文菜单项时执行相对昂贵的I / O操作(写入磁盘)这一事实。
目前,唯一的解决方法是使用背景页而不是事件页。