chrome.contextMenus.create会冻结chrome

时间:2014-11-24 11:24:38

标签: javascript google-chrome contextmenu

我正在使用活动页面!!并需要使用子菜单(深树)创建上下文菜单 它的深度取决于用户数据。并且创建该上下文菜单可能非常频繁,因为它取决于用户的操作。我可以用一些逻辑来降低这些更新的频率,但是在会话期间它可能会发生几次 问题是创建这些菜单会使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。

1 个答案:

答案 0 :(得分:1)

我在https://crbug.com/486505打开了一个错误报告。问题是由于事件页面在事件页面中添加,修改或删除上下文菜单项时执行相对昂贵的I / O操作(写入磁盘)这一事实。

目前,唯一的解决方法是使用背景页而不是事件页。