Доброго времени суток, на форм лежит tree, нужно по двойному нажатию по ветке выполнять своё действие. Обработчик на событие вешаю динамически:

Выделить код

Код:

function makeTreeItem(text, group) {
    group = group || false;
    
    var treeitem = document.createElement("treeitem");
    var treerow = document.createElement("treerow");
    var treecell = document.createElement("treecell");
        
    treecell.setAttribute("label", text);
    treecell.setAttribute("src", "images/user.png");
    if(group) {
        treecell.setAttribute("properties", "group");
        treecell.setAttribute("src", "images/group.png");
        treeitem.setAttribute("container", "true");        
    } else {
        treeitem.addEventListener("dblclick", onTreeItemDoubleClick, false);  // доб. обработчик двойного нажатия
    }
    treeitem.appendChild(treerow);
    treerow.appendChild(treecell);
    
    return treeitem;
}

Это функция добавления элемента в дерево, но почему-то когда я кликаю по ветке, ничего не происходит :(

<tree id="treeUserList" flex="1" treelines="true">         
        <treecols>         
            <treecol id="treecolUserName" label="Users" primary="true" flex="1"/>         
        </treecols>         
    <!-- остальные элементы здесь добавляются динамически,
     поэтому тут пусто,  а так наверно можно было бы тут повешать событие
  -->
    </tree>

Сама функция формирования дерева:

Выделить код

Код:

function loadTree() {
    var tree = document.getElementById("treeUserList");
    var treechildren = document.createElement("treechildren");
        
    tree.appendChild(treechildren);
    
    var groups = [];
    var currentGroup = null;
    
    for(var i in someData) {  // данные для дерева
        var user = someData[i];
        
        for(var j in groups) {
            if(user.group == groups[i]) {
                currentGroup = groups[i];
                break;
            }
        }
        if(currentGroup) {
            // group exists, adding user
            var group = findGroup(tree, user.group);
            if(group) {
                var item = makeTreeItem(user.name);
                group.appendChild(item);
            }
        } else {
            groups = groups.concat([user.group]);
            // creating a new group 
            var group = makeTreeItem(user.group, true);
            treechildren.appendChild(group);
            // add user to group
            var child = document.createElement("treechildren");
            group.appendChild(child);
            var item = makeTreeItem(user.name);
            child.appendChild(item);
        }
        currentGroup = null;
    }
}

Обработчики пользовательских событий обычно вешают на treechildren.

hydrolizer пишет

Обработчики пользовательских событий обычно вешают на treechildren.

На самый верхний в дереве? А как мне определять по какой веке я кликаю, т.е как мне отличать что я кликнул по ветке а не по группе(у группу установлен атрибут: container=true)?

xterro пишет

А как мне определять по какой веке я кликаю, т.е как мне отличать что я кликнул по ветке а не по группе

Через tree selection (nsITreeSelection), и далее обращением к нужным методам модели дерева. У вас дерево контентное, однако для него часть интерфейса модели реализуется автоматически. И, тем не менее, я все-таки советую изучить, как делаются деревья на основе своей реализации nsITreeView (здесь, здесь, здесь) - контентные деревья мало используемы из-за проблем с производительностью при достаточно большом количестве элементов, и из-за того, что своя реализация nsITreeView дает намного большую гибкость в управлении деревом и данными дерева.

hydrolizer
Благодарю )