Захват изменений дерева в XUL - PullRequest
2 голосов
/ 22 мая 2011

У меня есть динамически создаваемое редактируемое дерево XUL.Проблема в том, как можно прослушивать и захватывать измененные ячейки?

Я обнаруживаю отправку отредактированного значения путем захвата blur события tree.inputField, любые другие события не работают.По крайней мере, это работает, но есть ли простой способ получить новое значение?

Должно ли оно быть таким же хакерским, как получение элемента Tree, вычисление текущей ячейки и запрос его нового значения?

1 Ответ

2 голосов
/ 06 июня 2011

Полагаю, что "динамически построенный" означает, что вы динамически генерируете элементы DOM для элементов дерева. Тогда вы сможете зарегистрировать обработчик событий DOMAttrModified для тега <treechildren> и прослушать изменения атрибута label ячеек дерева.

Однако обычный подход состоит в том, чтобы дерево было полностью динамичным. Вам нужен объект, реализующий nsITreeView (см. https://developer.mozilla.org/En/NsITreeView).. Вы назначаете этот объект свойству tree.view. И этот объект определяет, сколько строк имеет ваше дерево, что отображать в какой ячейке, какие свойства строки / столбец / ячейка должны иметь все, без каких-либо узлов DOM внутри <treechildren>. К сожалению, это сложный интерфейс для реализации, особенно из-за иерархической природы деревьев. Однако если у вас простой список, многие методы становятся тривиальными.

Два метода особенно интересны. isEditable() позволяет определить, должна ли конкретная ячейка дерева быть редактируемой. И setCellText() вызывается всякий раз, когда ячейка была отредактирована.

Если вы не хотите переопределять nsITreeView, обертка по умолчанию также должна быть возможной. Примерно так:

var oldView = tree.view;
var newView = {
    __proto__: oldView,
    setCellText(row, col, value)
    {
        oldView.setCellText(row, col, value);
        alert("Text changed for a tree cell!");
    }
};
tree.view = newView;
...