Anton Первое.
Есть кнопка Quick History, вот код
/*Initialization Code*/ var menu = document. getElementById ("goPopup"). cloneNode (true); for (var i = 0; i < menu. childNodes. length; i++) { if (menu. childNodes [i]. hasAttribute ("id")) menu. childNodes [i]. setAttribute ("hidden", "true"); } menu. setAttribute ("place", "type=0&sort=4&maxResults=37"); function delId(node) { node.removeAttribute("id"); Array.forEach(node.childNodes, delId); } delId(menu); this. appendChild (menu); //this. type = "menu"; //this. orient = "horizontal"; this. setAttribute ("popup", menu. id = "cbHistory-" + this. id); this. onclick = function (event) { var node = event. originalTarget. node; if ((event. button < 2) && node) { PlacesUIUtils. markPageAsTyped (node. uri); openUILink (node. uri, event, false, true); } else if (event. button == 1) PlacesCommandHook.showPlacesOrganizer('History'); else if (event. button == 2) { if (event. shiftKey || (event. originalTarget. nodeName != "toolbarbutton")) return; toggleSidebar ("viewHistorySidebar"); event. preventDefault (); event. stopPropagation (); } };
/*Initialization Code*/ /* Тут находится секция функций-обработчиков */ this.onclick = function(event) { if(event.button == 0) { // Действие при клике ЛКМ lbMouse(); } else if(event.button == 1) { // Действие при клике СКМ } else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Действие при клике ПКМ без модификаторов rbMouse(); } }; this.oncontextmenu = function(event) { if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Блокируем контекстное меню при клике ПКМ без модификаторов event.preventDefault(); event.stopPropagation(); } };
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
для буфера обмена?
http://www.nakka.com/soft/clcl/index_rus.html
Кстати, вроде бы, о факте изменения содержимого буфера обмена из расширения/кнопки «встроенными» средствами не узнать – можно только периодически считывать содержимое.
и когда я нажимаю ПКМ то вместо того что бы вызывалась функция rbMouse(); происходит вызов меню настройки Custom Buttons
Скорее всего, происходит и то, и то.
Вообще, с подавлением контекстного меню иногда случается что-то странное.
Но можно вообще убрать контекстное меню кнопки, а когда нужно – показывать его «вручную»:
this.removeAttribute("context"); this.onclick = function(e) { // ... if(e.button == 2) { if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) { // Показываем контекстное меню кнопки let popup = document.getElementById("custombuttons-contextpopup"); document.popupNode = this.ownerDocument.popupNode = this; if("openPopupAtScreen" in popup) popup.openPopupAtScreen(e.screenX, e.screenY, true); else popup.showPopup(this, e.screenX, e.screenY, "context", null, null); } else { // Действие при клике ПКМ без модификаторов } } };
Отредактировано Infocatcher (20-07-2010 01:56:58)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher да, надо считывать по таймеру, это я уже понял ибо вытащить содержимое из сторонних дополнений типа AutoCopy мне так и не удалось плюс ставить их для того что бы просто получить буфер обмена, так они не стоят того ибо они несут не нужный функционал.
Спасибо за второй код, хотя я не очень понял разницы, ну да ладно разберусь ))))
Отредактировано Indomito (20-07-2010 02:19:11)
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
хотя я не очень понял разницы
Можно при определенных условиях останавливать событие contextmenu, а можно вообще убрать контекстное меню, чтобы оно само никогда не показывалось, а когда оно нужно – показывать «вручную».
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
И ещё....
Infocatcher сорри за "тупой" вопрос... )))) Что делать с CLCL - утилита кеширования буфера обмена.
1. Установить?
2. Скачать исходник и его "встроить" в какую либо кнопку CB?
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Что делать с
Ну, если утилита решит поставленные задачи, то поставить. Точнее, пожалуй, сначала поставить и проверить.
С точки зрения использования кода – проще найти документацию по буферу обмена и написать бинарную компоненту. И, видимо, сделать расширение, если иным способом воспользоваться ей не удастся. Но, думается, желающего найти будет трудновато.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher и ещё, пока не начал разбираться с CLCL, а разве не проще сделать обработчик по времени (событие)? Хотя думаю его эффективность по коду будет не высока, но всё же будет понятно мне что я делаю, а?
Если можно, то покажи пример оного, я то в теории понимаю, но в пространстве движка боюсь наворотить такого, что всё перестанет работать )))))
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
пример оного
С периодичностью this.CHECK_INTERVAL (в миллисекундах) и при открытии меню проверяется содержимое буфера обмена, если такая строка еще не сохранена, то она добавляется в массив, а к меню кнопки добавляется новый пункт (старые данные при этом удаляются), всего хранится this.MAX_ENTRIES строк:
this.MAX_ENTRIES = 16; this.CHECK_INTERVAL = 1000; this.type = "menu"; this.orient = "horizontal"; this._menupopup = this.appendChild(document.createElement("menupopup")); this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);"); this.clipboardStrings = []; this.checkClipboard = function() { var clipStr = readFromClipboard(); if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1) this.storeString(clipStr); }; this.storeString = function(str) { var cs = this.clipboardStrings; cs.push(str); while(cs.length > this.MAX_ENTRIES) cs.shift(); var mi = document.createElement("menuitem"); mi.setAttribute("label", str); mi.setAttribute("cb_index", cs.length - 1); this._menupopup.appendChild(mi); while(this._menupopup.childNodes.length > this.MAX_ENTRIES) this._menupopup.removeChild(this._menupopup.firstChild); }; this.handleCommand = function(mi) { this.insertText(this.clipboardStrings[mi.getAttribute("cb_index")]); }; this.insertText = function(str) { var cmd = "cmd_insertText"; var controller = document.commandDispatcher.getControllerForCommand(cmd); if(controller && controller.isCommandEnabled(cmd)) { controller = controller.QueryInterface(Components.interfaces.nsICommandController); var params = Components.classes["@mozilla.org/embedcomp/command-params;1"] .createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", str); controller.doCommandWithParams(cmd, params); } }; setInterval(function(button) { button.checkClipboard(); }, this.CHECK_INTERVAL, this); this.setAttribute("onpopupshowing", "this.checkClipboard();");
Исправленная версия:
this.MAX_ENTRIES = 16; this.CHECK_INTERVAL = 1000; this.type = "menu"; this.orient = "horizontal"; this._menupopup = this.appendChild(document.createElement("menupopup")); this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);"); this.clipboardStrings = []; this.checkClipboard = function() { var clipStr = readFromClipboard(); if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1) this.storeString(clipStr); }; this.storeString = function(str) { var cs = this.clipboardStrings; cs.push(str); while(cs.length > this.MAX_ENTRIES) cs.shift(); var mi = document.createElement("menuitem"); mi.setAttribute("label", str); this._menupopup.appendChild(mi); while(this._menupopup.childNodes.length > this.MAX_ENTRIES) this._menupopup.removeChild(this._menupopup.firstChild); }; this.handleCommand = function(mi) { var indx = Array.indexOf(mi.parentNode.childNodes, mi); if(indx != -1) this.insertText(this.clipboardStrings[indx]); }; this.insertText = function(str) { var cmd = "cmd_insertText"; var controller = document.commandDispatcher.getControllerForCommand(cmd); if(controller && controller.isCommandEnabled(cmd)) { controller = controller.QueryInterface(Components.interfaces.nsICommandController); var params = Components.classes["@mozilla.org/embedcomp/command-params;1"] .createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", str); controller.doCommandWithParams(cmd, params); } }; setInterval(function(button) { button.checkClipboard(); }, this.CHECK_INTERVAL, this); this.setAttribute("onpopupshowing", "this.checkClipboard();");
Добавлено 20-07-2010 03:34:29
А вот и иконка: http://www.iconfinder.com/icondetails/1 … _text_icon
Отредактировано Infocatcher (22-07-2010 17:21:32)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher ага, те поясню почему "ага" ))))
Я посмотрел и вспомнил что с ПО CLCL я уже встречался и даже переписывал её под себя, только исходники были из другого источника, а я то искал решения для программной отработки тегов типа
Еще вопрос.
При mb_BBCodePrim = function (open,close, readFromClipboard()) {}; значение readFromClipboard() равно undefined. При обработке на других языках, оно принимает значение 0 те буфер пуст, те выражение
if (paste.length == 0) { open +=close; alert (open+"буфер пуст"); } else { open +=paste+close; alert (open+"буфер не пуст"); }
ошибочно?
Тогда нужно писать так, что ли if (paste == "undefined") или применить преобразование paste в float/word/int/void .... или скажем написать так if (paste.boolean == false)
Сорри но я на JS пишу ну скажем неделю и основательно путаюсь )))
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Infocatcher с undefined... да ступил... тк не ожидал такой реализации.
if (paste == undefined) { open +=close; alert (open+"буфер пуст"); } else { open +=paste+close; alert (open+"буфер не пуст"); }
Хотя почти логично, но просто не привычно )))))
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
А авторы функции (см. chrome://browser/content/browser.js) решили (зачем-то) возвращать undefined.
var clipStr = readFromClipboard(); if(clipStr) alert("not empty"); else alert("empty");
Или
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Вопрос решил сам, как всегда задача на внимательно при разборке чужого кода
Пост оставил, может кому пригодиться ))) хотя не думаю, но может быть...
Массив this.clipboardStrings = []; объявлен как я понимаю локально или я не прав? Как получить размер массива? (смотрел методы по справочникам JS - не нашёл или проглядел, те не нашел ) Поясняю про что я.
Есть метод slice(startIndex[, endIndex]), который в контексте твоего кода выглядит так - var glbVarAarClip = clipboardStrings.slice(0) без var, что бы массив был глоб. видимость для всех кнопок CB, ну таких как QUOTE, URL, etc. Можно объявить глоб. функцию для унификации, ибо кнопок много и править один и тот же код во всех - врагу не пожелаешь)))
Остаётся вопрос как отловить конец массива... опять по undefined?
Пригляделся и всё нашел
this.storeString = function(str) { var cs = this.clipboardStrings; cs.push(str); alert ("Строка из буфера" + str); alert ("Размер массива" + cs.length); while(cs.length > this.MAX_ENTRIES) cs.shift(); var mi = document.createElement("menuitem"); mi.setAttribute("label", str); mi.setAttribute("cb_index", cs.length - 1); this._menupopup.appendChild(mi); while(this._menupopup.childNodes.length > this.MAX_ENTRIES) this._menupopup.removeChild(this._menupopup.firstChild); };
правда вопрос о передаче через функцию немного не понятен, а через глоб переменную/массив ясен, переменную CS объявить глобально, те без var.
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Infocatcher ты уверен что твой код по обработке ПКМ рабочий?
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Программируя на javascript никогда не знаешь когда встанешь на очередную граблю. Иногда складывается впечатление, что в языке больше плохого чем, хорошего.
... это я так... но теперь понял эту цитату прочитанную две недели назад.
Есть код
//Список сохранёного буфера обмена
//Не вызываем это обработка по таймеру или по событию ЛКМ (пока не понял как)
//this.MAX_ENTRIES = 16; - число записей 16
//this.CHECK_INTERVAL = 1000; - время опроса буфера 1000 миллисекунд
//-----Обработчики буфера обмена
this.MAX_ENTRIES = 16;
this.CHECK_INTERVAL = 1000;
this.type = "menu";
this.orient = "horizontal";
this._menupopup = this.appendChild(document.createElement("menupopup"));
this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);");
this.clipboardStrings = [];
this.checkClipboard = function() {
var clipStr = readFromClipboard();
if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1)
this.storeString(clipStr);
};
this.storeString = function(str) {
var cs = this.clipboardStrings;
cs.push(str);
while(cs.length > this.MAX_ENTRIES)
cs.shift();
var mi = document.createElement("menuitem");
mi.setAttribute("label", str);
mi.setAttribute("cb_index", cs.length - 1);
this._menupopup.appendChild(mi);
while(this._menupopup.childNodes.length > this.MAX_ENTRIES)
this._menupopup.removeChild(this._menupopup.firstChild);
};
// выбор строки из списка и вставка его
this.handleCommand = function(mi) {
this.insertText(this.clipboardStrings[mi.getAttribute("cb_index")]);
};
this.insertText = function(str) {
var cmd = "cmd_insertText";
var controller = document.commandDispatcher.getControllerForCommand(cmd);
if(controller && controller.isCommandEnabled(cmd)) {
controller = controller.QueryInterface(Components.interfaces.nsICommandController);
var params = Components.classes["@mozilla.org/embedcomp/command-params;1"]
.createInstance(Components.interfaces.nsICommandParams);
params.setStringValue("state_data", str);
controller.doCommandWithParams(cmd, params);
}
};
setInterval(function(button) {
button.checkClipboard();
}, this.CHECK_INTERVAL, this);
this.setAttribute("onpopupshowing", "this.checkClipboard();");
Отредактировано Indomito (20-07-2010 13:00:00)
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Anton
если не трудно - собери, пожалуйста, из этого готовый xpi и поделись здесь со всеми ссылкой.
Пока не могу.
Добавлено 20-07-2010 16:48:11
Anton пишетNajlus написал:как сделать кнопки перехода вперёд\назадhttp://custombuttons.mozdev.org/drupal/ … n-buttons/
Page not found
Вот это: http://custombuttons.mozdev.org/drupal/ … -buttons-0
?
Добавлено 20-07-2010 17:00:19
и когда я нажимаю ПКМ то вместо того что бы вызывалась функция rbMouse(); происходит вызов меню настройки Custom Buttons, это происходит, если:
1. Я ни разу не нажал ЛКМ на кнопках CB.
2. Я нажал Shift-ПКМ, а после этого не выполнил пункт №1
Эти предположения основаны на статистике, хотя есть вариант что модификатор был нажат дважды, а значит в моём обработчике есть ошибка.
Не могу воспроизвести (linux/windows).
Добавлено 20-07-2010 17:06:09
то что выделено красным не работает
Там, насколько я понимаю, this неверный.
get_ListClipboardPrim определяется в контексте окна, и в ней this==window
а clipboardStrings "подшивается" к кнопке, когда this==текущая кнопка
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton
Не могу воспроизвести (linux/windows).
я перепроверил, была опечатка, точнее пропал обработчик this.onclick = function(event) { тело }.
Если можешь, подскажи как верно написать метод slice() для массива this.clipboardStrings, для передачи через return его копии. Это нужно для доступа к нему из других кнопок. Вот исходный код, см. пост №2072
По сути не сложно, но я что то не так пишу...
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Массив this.clipboardStrings = []; объявлен как я понимаю локально или я не прав?
Ну, не совсем. this в данном случае ссылается на кнопку, поэтому «снаружи» можно найти эту кнопку и посмотреть на ее свойство "clipboardStrings".
Вот если там написать
var clipboardStrings = [];
и обращаться уже к clipboardStrings – без this. – то «снаружи» такую переменную будет уже не видно.
Infocatcher ты уверен что твой код по обработке ПКМ рабочий?
У меня работает, инициализация:
this.removeAttribute("context"); this.onclick = function(e) { // ... if(e.button == 2) { if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) { // Показываем контекстное меню кнопки let popup = document.getElementById("custombuttons-contextpopup"); document.popupNode = this.ownerDocument.popupNode = this; if("openPopupAtScreen" in popup) popup.openPopupAtScreen(e.screenX, e.screenY, true); else popup.showPopup(this, e.screenX, e.screenY, "context", null, null); } else { // Действие при клике ПКМ без модификаторов alert("Right-click"); } } };
Выделить кодКод:
if("openPopupAtScreen" in popup) popup.openPopupAtScreen(e.screenX, e.screenY, true); alert (1.3);
=>
if("openPopupAtScreen" in popup) { popup.openPopupAtScreen(e.screenX, e.screenY, true); } alert (1.3);
А дальше оказывается else уже без if, и все ломается.
Программируя на javascript никогда не знаешь когда встанешь на очередную граблю. Иногда складывается впечатление, что в языке больше плохого чем, хорошего.
... это я так... но теперь понял эту цитату прочитанную две недели назад.
Так нужно уметь его готовить.
Граблями славится IE, а неожиданностями – Opera.
то что выделено красным не работает, я просто хотел передать через RETURN копию массива, но даже Alert не хочет вычислять длину. А если посмотреть на что выделено синим - всё работает... почему?
Так не получится.
Ссылка this зависит от способа вызова функции.
Например, вот так
будет работать, если button – соответствующая кнопка. Но для этого нужно сначала получить ссылку на кнопку.
И даже копию просто так не вернуть – только ссылку на тот же массив.
Можно, не трогая остальной код, написать
Тогда этот массив будет доступен из всех кнопок (и не только из них, так что имя такой переменной должно быть достаточно уникальным) через window.cbClipboardStrings или просто cbClipboardStrings.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Можно, не трогая остальной код, написать
Тогда этот массив будет доступен из всех кнопок (и не только из них, так что имя такой переменной должно быть достаточно уникальным) через window.cbClipboardStrings или просто cbClipboardStrings.
так лучше, я уже все варианты перебрал LOL
Про
Infocatcher ты уверен что твой код по обработке ПКМ рабочий?
я уже нашёл свою ошибку и поправил, хотя пришлось 2-3 раза править файл buttonsoverlay.xul ))) Очень не удобно и без отладчика и без компилятора... иногда случайно узнаёшь об ошибке ))))
Кстати об обработчике по таймеру, а разве нельзя было использовать было событие onBeforeCopy? Или тут велика вероятность конфликтов с другими дополнениями или что то ещё?
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
я уже нашёл свою ошибку и поправил, хотя пришлось 2-3 раза править файл buttonsoverlay.xul ))) Очень не удобно и без отладчика и без компилятора... иногда случайно узнаёшь об ошибке ))))
buttonsoverlay.xul обычно править не нужно – можно или отключить инициализацию кнопок в настройках и открыть новое окно, или запустить Firefox с параметром «-custombuttons disable-buttons-initialization».
И еще консоль ошибок есть.
Кстати об обработчике по таймеру, а разве нельзя было использовать было событие onBeforeCopy? Или тут велика вероятность конфликтов с другими дополнениями или что то ещё?
Для этого кто-то должен генерировать это событие.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
4 реквеста:
1. может ли кто-нибудь скрестить кнопку запуска внешнего приложения с кнопкой открывающей суб-меню?
т.е. клик по кнопке открывает меню, где располагаются другие кнопки (можно даже в двух вариантах: 1 списком (иконка + подпись), а 2 - таблицей (иконки без текста), каждая их этих кнопок - запускает какую-то программу.
2. можно ли кнопку сделать такую, чтобы при нажатии на ctrl+f открывался сёрчбар, а по повторному нажатию - закрывался (в фф по дефолту такого нет) и чтоб между сессиями запросов поисковая фраза запоминалась бы, т.е. сёрчбар открыли, поискали им что-то, закрыли и снова открыли - а там фраза которую искали в прошлый раз + при открытии она выделена, т.е. если я сходу пишу что-то то старый поиск затирается новым. Я маньяк, я знаю, но можно такое?
3. кнопку, при нажатии на которой, списком (или ещё лучше таблицей) выводилось бы содержимое панели закладок (не самих закладок, а именно панели): у меня на ней ссылки расположены сокращённые до иконок (текст убран), было бы удобно скрыть панель целиком и открывать только когда надо добавить/удалить что-то (ведь кб кнопки не поддерживают drag'n'drop например закладок?)
4. в связи с новой фичей, думаю будет очень актуальна для многих: действие Make into App Tab (не знаю как оно звучит в локализованной сборке) для всех вкладок сразу.
Может быть, даже как-то продумать toggle on/off режим, т.е. чтобы пока кнопка нажата мидлкликом допустим - все открываемые табы в дальнейшем будут сразу сужаться до фавиконки, и так будет происходить до тех пор, пока кнопка не будет мидл кликнута 2-ой раз.
Отредактировано iDev.Pi (20-07-2010 21:08:22)
mzfx
Отсутствует
3 реквеста:
1. может ли кто-нибудь скрестить кнопку запуска внешнего приложения с кнопкой открывающей суб-меню?
т.е. клик по кнопке открывает меню, где располагаются другие кнопки (можно даже в двух вариантах: 1 списком (иконка + подпись), а 2 - таблицей (иконки без текста), каждая их этих кнопок - запускает какую-то программу.
можно, просто надо поставить обработчик мышки на кнопки ЛКМ СКМ ПКМ.
Ты про это?
приблизительно, да?
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Indomito
если приблизительно - то да. но вообще хотелось бы и вариант не со столбцом из всех этих 1 2 3 4 5 6 7 8 9..., а с квадратной (или прямоугольной) таблицей:
1 2 3
4 5 6
7 8 9
mzfx
Отсутствует
iDev.Pi код меню, который дал мне Anton
var menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:cb="http://xsms.nm.ru/custombuttons/" onclick="this. parentNode. handleClick (event);"> <menu label="Почта" image="http://mail.rambler.ru/favicon.ico"> <menupopup> <menuitem label="yandex" class="menuitem-iconic" image="http://img.imgsmail.ru/r/favicon.ico" cb:url="http://www.mail.ru/"/> <menuitem label="google" class="menuitem-iconic" image="http://66.102.9.104/favicon.ico" cb:url="http://gmail.google.com"/> <menuitem label="rambler" class="menuitem-iconic" image="http://mail.rambler.ru/favicon.ico" cb:url="http://mail.rambler.ru"/> </menupopup> </menu> <menu label="Поиск"> <menupopup> <menuitem label="google" class="menuitem-iconic" image="http://66.102.9.104/favicon.ico" cb:url="http://www.google.com"/> <menuitem label="yandex" class="menuitem-iconic" image="http://img.yandex.net/i/favicon.ico" cb:url="http://www.yandex.ru"/> </menupopup> </menu> <menuitem label="mysite.ru" cb:url="mysite.ru"/> <menuitem label="forum.example.org" cb:url="forum.example.org"/> </menupopup>; this. appendChild (custombuttonsUtils. makeXML (menu)); this. type = "menu"; this. orient = "horizontal";
this. handleClick = function (event) { var menuitem = event. target; var url = menuitem. getAttributeNS ("http://xsms.nm.ru/custombuttons/", "url"); if (event. button == 0) loadURI (url); else if (event. button == 1) gBrowser. addTab (url); this. open = false; };
function lbMouse(){}; function mbMouse(){}; function rbMouse(){}; this.onclick = function(event) { if(event.button == 0) { // Действие при клике ЛКМ lbMouse(); } else if(event.button == 1) { // Действие при клике СКМ mbMouse(); } else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Действие при клике ПКМ без модификаторов rbMouse(); } }; this.oncontextmenu = function(event) { if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Блокируем контекстное меню при клике ПКМ без модификаторов event.preventDefault(); event.stopPropagation(); } };
/*Initialization Code*/ var menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:cb="http://xsms.nm.ru/custombuttons/" onclick="this. parentNode. handleClick (event);"> <menuitem label="=1" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=1]" cb:close="[/size]"/> <menuitem label="=2" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=2]" cb:close="[/size]"/> <menuitem label="=3" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=3]" cb:close="[/size]"/> <menuitem label="=4" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=4]" cb:close="[/size]"/> <menuitem label="=5" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=5]" cb:close="[/size]"/> <menuitem label="=6" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=6]" cb:close="[/size]"/> <menuitem label="=7" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=7]" cb:close="[/size]"/> <menuitem label="=8" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=8]" cb:close="[/size]"/> <menuitem label="=9" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=9]" cb:close="[/size]"/> <menuitem label="=10" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=10]" cb:close="[/size]"/> <menuitem label="=11" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=11]" cb:close="[/size]"/> <menuitem label="=12" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=12]" cb:close="[/size]"/> <menuitem label="=13" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=13]" cb:close="[/size]"/> <menuitem label="=14" class="menuitem-iconic" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC" cb:open="[size=14]" cb:close="[/size]"/> </menupopup>; this. appendChild (custombuttonsUtils. makeXML (menu)); this. type = "menu"; this. orient = "horizontal"; this.handleClick = function(event) { var menuitem = event. target; var open = menuitem. getAttributeNS ("http://xsms.nm.ru/custombuttons/", "open"); var close = menuitem. getAttributeNS ("http://xsms.nm.ru/custombuttons/", "close"); if(event.button == 0) { // Действие при клике ЛКМ lbMouse(open,close); } else if(event.button == 1) { // Действие при клике СКМ mbMouse (open,close); } else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Действие при клике ПКМ без модификаторов rbMouse (open,close,readFromClipboard()); } }; this.oncontextmenu = function(event) { if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Блокируем контекстное меню при клике ПКМ без модификаторов event.preventDefault(); event.stopPropagation(); } }; function lbMouse (open,close){ var theBox = document.commandDispatcher.focusedElement; var startPos = theBox.selectionStart; var endPos = theBox.selectionEnd; var oPosition = theBox.scrollTop; var oHeight = theBox.scrollHeight; var text=theBox.value.substring(0,startPos); text +=open+theBox.value.substring(startPos, endPos)+close; text +=theBox.value.substring(endPos, theBox.value.length); theBox.value = text; var nHeight = theBox.scrollHeight - oHeight; theBox.scrollTop = oPosition + nHeight; }; function mbMouse (open,close) {}; function rbMouse (open,close,paste){ if (paste.length == 0) { open +=close; } else { open +=paste+close; } var theBox = document.commandDispatcher.focusedElement; var startPos = theBox.selectionStart; var endPos = theBox.selectionEnd; var selectionLen = endPos - startPos var oPosition = theBox.scrollTop; var oHeight = theBox.scrollHeight; var text=theBox.value.substring(0,startPos); var nHeight = theBox.scrollHeight - oHeight; text +=open; text +=theBox.value.substring(endPos, theBox.value.length); theBox.value = text; theBox.selectionStart = endPos + open.length; theBox.selectionEnd = endPos + open.length - selectionLen; theBox.scrollTop = oPosition + nHeight; };
PS Да, насчёт табличного расположения, то тут нужна форма (метод) и надо XUL смотреть, а лучше спросить у Anton, он сразу скажет можно или нет...
Отредактировано Indomito (20-07-2010 21:48:29)
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует