есть у меня в оверлее такая ветка:

Выделить код

Код:

<keyset id="mainKeyset">
	<key id="ila_hotkeys" modifiers="alt any control" key="K" oncommand="ila_hotkey_fs();" />
	<key id="ila_hotkey" modifiers="alt any control" key="L" oncommand="ila_hotkey_f();" />
</keyset>

я в функции ila_hotkey_fs() делаю следующее:

Выделить код

Код:

document.getElementById('ila_hotkey').setAttribute("key","P");

После этого я ожидаю, что вызов функции ila_hotkey_f() поменяется на ctrl+alt+P, но этого не происходит. Атрибут меняется, это я проверял при помощи алерта в самой функции ila_hotkey_f().

Как мне поменять кнопки, по котороым будет происходить вызов функции?

Можно посмотреть как это сделано в keyconfig-е.

ilagnev пишет
Выделить код

Код:

document.getElementById('ila_hotkey').setAttribute("key","P");

К сожалению, такие штуки срабатывают только в момент загрузки окна.
Правда, по идее, если очень надо, можно перехватывать нажатия клавиш своим обработчиком, но это будет несколько больше кода. :)

Infocatcher пишет

К сожалению, такие штуки срабатывают только в момент загрузки окна.
Правда, по идее, если очень надо, можно перехватывать нажатия клавиш своим обработчиком, но это будет несколько больше кода. :)

а как это скажется на производительности?
я вот размышляю, что если есть уже обработчик, то он где-то прописан, и нужно лишь до него достучатся и поменять один параметр. я в этом не разбираюсь, обьясните если не трудно.
я не понимаю, зачем довешивать обработчик, если он уже есть.

ilagnev пишет

а как это скажется на производительности?

Ну, производительность снизится, но не думаю, что сильно.

ilagnev пишет

я не понимаю, зачем довешивать обработчик, если он уже есть.

Тот, что уже есть, «регистрирует» сочетания клавиш где-то в районе загрузки окна.
Т.е. вот так будет работать:

Выделить код

Код:

function myLoadHandler(e) {
    window.removeEventListener(e.type, arguments.callee, false);
    document.getElementById("myKey").setAttribute("key", "P");
}
window.addEventListener("load", myLoadHandler, false);

В большинстве случаев этого достаточно – изменения вступают в силу только в новых окнах. Уже упомянутый keyconfig, скорее всего, делает именно это.
А если хочется странного большего – нужно писать дополнительный код.

Разве что, по идее, можно убедить встроенный обработчик «перечитать» сочетания клавиш, но только если в нем это предусмотрено (у меня есть подозрение, что работает это на уровне интерпретации XUL :/, впрочем, я этим как-то не интересовался).

P.S. Еще можно посмотреть, как сделано в Custom Buttons.

Infocatcher пишет
Выделить код

Код:

function myLoadHandler(e) {
    window.removeEventListener(e.type, arguments.callee, false);
    document.getElementById("myKey").setAttribute("key", "P");
}
window.addEventListener("load", myLoadHandler, false);

спасибо за помощь.
буду просить пользователей перезапустить браузер, чтобы настройки вступили в силу. :)

ещё по случаю хочю спросить, я для хранения настроек в одном расширении подсмотрел вот такую конструкцию:

Выделить код

Код:

var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
...
pref.setCharPref('hotkey','P');
...
var hotk=pref.getCharPref('hotkey');

храню так настройки.
это правильно, или нужно по другоу делать?

ilagnev пишет

буду просить пользователей перезапустить браузер, чтобы настройки вступили в силу

В принципе может быть достаточно открыть новое окно, но мб это так только в девелоперском режиме настройки Лиса?..

ilagnev

а как это скажется на производительности?

Боюсь, что никто не заметит.

----
Я ради интереса сделал 177 кнопок, всем назначил клавиши a-z, A-Z, Shift+A-Shift+Z, а-я, А-Я, Shift+А-Shift+Я
Каждая печатает в статусбар свою букву, если в статусбаре более 20 символов, отрезает первый символ.
Поклацал по клавиатуре, замедления не ощутил.
Хотя, конечно, профиль почти чистый, и, вероятно обработчик только один, от CB.
Тем не менее, обработчик лезет в компоненту, ищет соответствие, если находит - ищет кнопку, выполняет её код.
Т. е., кода там выполняется не одна строчка.

ilagnev пишет

храню так настройки.
это правильно, или нужно по другоу делать?

Ну, это самое простое встроенное средство – все, что так сохранено, можно увидеть в about:config или в файле prefs.js в профиле.
Разве что лучше давать имена подлиннее – чтобы избежать возможных конфликтов.
Скажем,
myExtension.somePref
или
extensions.myExtension.somePref

Только если нужны не только ASCII-символы, смотрите, как сделано в chrome://global/content/nsUserSettings.js

P.S. Кстати вот относительно недавно в одном расширении обнаружил такую штуку:

Выделить код

Код:

navigator.preference("perName", prefValue);
var pVal = navigator.preference("perName");

Покрутил и убедился, что в Firefox 1.5+ работает. =)