2010-07-26 2 views
2

Я создаю расширение Firefox и хотел бы разрешить пользователю удалять объекты из дерева с помощью ключа удаления. В настоящее время я вызываю функцию, когда пользователь нажимает кнопку, но хотел бы позволить им просто нажать клавишу удаления на своей клавиатуре.Как удалить объект из дерева в XUL с помощью ключа удаления?

ответ

1

Собственно, я понял. Я добавил это к дерева элемента в XUL:

onkeypress="deleteSelection(event);" 

Вот мой Javascript:

function deleteSelection(event){ 
    if(event.keyCode == KeyEvent.DOM_VK_DELETE) 
    { 
    var t = document.getElementById('gs-scrapeToolbar-middlePanel-dom-tree'); 
    if (t.currentIndex > -1) { 
     treeView.model.splice(t.currentIndex, 1); 
     treeView.treeBox.rowCountChanged(t.currentIndex, -1); 
    } 
    } 
} 
0

Используйте ключевой элемент для определения сочетаний клавиш для окна. See tutorial here.

+0

Если вы хотите, чтобы ключ удаления имел эффект, когда дерево имеет фокус (что, по-моему, вероятно, то, что пользователи ожидали бы), тогда было бы лучше использовать атрибут 'onkeypress', правильно? Из вашей ссылки: «Ключевые события отправляются только элементу с фокусом ... Если ни один элемент не сфокусирован, ключевое событие вместо этого будет нацелено на сам документ XUL. В этом случае вы можете добавить прослушиватель событий к окну. Обычно, если вы хотите отвечать на клавиши по всему миру, вы будете использовать комбинацию клавиш, как описано ранее ». Поэтому я * думаю * ответ Джоша имеет больше смысла в этом случае. – MatrixFrog

+0

Наверное, так; У меня недостаточно информации о его пользовательском интерфейсе и намерениях рассказать вам, был ли он намереваться быть общим ярлыком для окна или нет. – pc1oad1etter

0

Я just noticed this, глядя на документацию для nsITreeView:

performAction()

API-интерфейс команды, который может использоваться для вызывать команды по выбору. Дерево будет автоматически вызывать этот метод при нажатии определенных клавиш. Например, когда нажата клавиша DEL , performAction будет называться со строкой delete.

void performAction(in wstring action);

Так что я думаю, что это еще один способ, которым Вы могли бы сделать это:

void performAction(action) { 
    if (action == 'delete') { 
    // delete the thing 
    } 
} 

хотя я не проверял.

+0

На самом деле, похоже, что это, вероятно, не лучший способ сделать это. https://bugzilla.mozilla.org/show_bug.cgi?id=406588 – MatrixFrog

Смежные вопросы