Может кто-нибудь подсказать (можно ссылкой), как сделать кнопку для комбинации клавиш (Send Key Event)? Есть подобная возможность для "мышиных жестов" (в расширении FireGestures). Выглядит этот код, например, следующим образом:
var evt = document.createEvent("KeyEvents"); evt.initKeyEvent( "keypress", true, true, null, false, // holds Ctrl key false, // holds Alt key false, // holds Shift key false, // holds Meta key evt.DOM_VK_F5, // presses a special key, @see http://mxr.mozilla.org/mozilla/source/dom/public/idl/events/nsIDOMKeyEvent.idl 0 // presses a normal key, e.g. "A".charCodeAt(0), ); document.documentElement.dispatchEvent(evt);
но при "тупой" вставке этого кода в кнопку она не срабатывает...
Отсутствует
okkamas_knife
Мне нужно ровно наоборот. Не задать сочетание клавиш для срабатывания кнопки, а "от обратного": есть зарегистрированное в системе сочетание клавиш и надо сделать кнопку, дублирующую это сочетание. Попробую поподробнее объяснить. Есть весьма неплохая программка CintaNotes - легковесный менеджер заметок с функцией захвата текста из других приложений, быстрым поиском и поддержкой тегов. (http://forum.ru-board.com/topic.cgi?for … ic=32648#1). Очень удобная и ИМХО наиболее подходящая замена всяческим QuickNote и подобным дополнениям. Она работает по горячим клавишам, которые можно настроить (например, захват выделенного текста CTRL+SPACE, открытие блокнота - CTRL+ALT+SPACE). Вот и хочется для нее кнопку на панели создать, чтобы одной только мышой можно было работать не трогая клавиатуру. По аналогии с существующей кнопкой для того-же самого QuickNote например (по левому клику захват выделенного текста, по правому - открытие блокнота и т.п.) К сожалению в самой программе CintaNotes не смог найти возможности задания/указания параметров командной строки - тогда можно было бы сотворить простую кнопку запуска данного приложения с необходимыми параметрами... Вот и получается, что единственная возможность - это создание кнопки, которая по левому клику просто тупо отправляла бы в систему (эмулировала) команду нажатия какого-либо сочетания клавиш, по правому клику - эмулировала иное сочетание клавиш и т.д. Много чего перепробовал, что-то пока не получается... Возможно ли это реализовать?
Отсутствует
AnVn
С помощью кода javascript можно "послать" сочетание клавиш только окну Firefox. В обработчик другой программы они не попадут.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
в инициализацию
this.onclick = function(e) { if(e.button == 0) { Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection.executeSimpleSQL("VACUUM"); } };
mzfx
Отсутствует
okkamas_knife
есть такой способ vacuum-сжатия файрфоксовской базы
в java-консоль вводим следующую строку и жмём выполнить
Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection.executeSimpleSQL("VACUUM");
Эту строку можно поместить в раздел "Код", она будет выполняться.
Или воспользоваться кодом, предложенным iDev.Pi
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton
не подскажите
попробовал создать кнопку из готовых кнопок "Выбор папки загрузки", но как только после вставки кода нажимаю ОК
сразу же появляется окно выбора папки и все виснет намертво, даже диспетчер задач невозможно вызвать, а кроме того
после этого приходится восстанавливать профиль. Попробовал на двух разных профилях, одинаково, там код точно без ошибок?
Firefox 3.5.3
XP SP2
Отредактировано 4321vas (25-02-2010 17:16:02)
Отсутствует
4321vas
Кнопка моих рук дело и работает вроде как надо, проверял у себя.
А как ты создаешь кнопку? Очень похоже, что ты закидываешь этот код в раздел "Инициализация". Есть 2 способа ее создать:
1. То, что написано в разделе "код", можно добавить в раздел "Код" создаваемой кнопки.
2. То, что написано в разделе "код кнопки" скопировать полностью и вставить в адресную строку, нажать Ввод и согласиться добавить новую кнопку (в этом варианте присутствует еще и иконка к кнопке)
Может и есть какие огрехи, пусть Anton глянет
Отсутствует
Очень похоже, что ты закидываешь этот код в раздел "Инициализация"
Да, так и есть.
Спасибо большое.
Добавлено 25-02-2010 20:26:26
и работает вроде как надо
Все получилось.
Вы бы добавили это
1. То, что написано в разделе "код", можно добавить в раздел "Код" создаваемой кнопки.
2. То, что написано в разделе "код кнопки" скопировать полностью и вставить в адресную строку, нажать Ввод и согласиться добавить новую кнопку (в этом варианте присутствует еще и иконка к кнопке)
в готовой кнопке.
Отсутствует
а теперь собственно просьба - подскажите код кнопки который при нажатии добавляет текущую страницу в закладки но вызывает диалоговое окно как когда добавляешь ссылку в закладки.
PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Есть такое дополнение, которое умеет по альт+ЛКМ догружать недокаченные картинки на странице, а по шифт+ЛКМ открывать просматриваемую страницу из кэша гугла. Может ли кто по мотивам этого дополнения создать 2 кнопочки?
1. чтоб при клике ЛКМ по КБ-кнопке показывало текущую страницу из кэша яндекса, а при клике СКМ по этой кнопке чтоб из кэша гугла
2. кнопку, клик по которой догружал бы все недогруженные на странице картинки. И если это возможно, то чтоб после загрузки страницы автоматом шла проверка - есть ли недогруженные картинки и если есть - то автоматом догружать их, т.е. чтоб кликать по этой кнопке и вовсе не приходилось
Сможет кто сделать такое?
mzfx
Отсутствует
Догрузка всех картинок на странице (секция «код»):
// Based on code from chrome://browser/content/nsContextMenu.js (Firefox 3.6) function reloadImage(img) { if(!(img instanceof Components.interfaces.nsIImageLoadingContent)) return; urlSecurityCheck(img.currentURI.spec, gBrowser.contentPrincipal, Components.interfaces.nsIScriptSecurityManager.DISALLOW_SCRIPT); img.forceReload(); } function parseWin(win) { Array.forEach(win.frames, parseWin); Array.forEach(win.document.images, reloadImage); } parseWin(content);
Нагло стырено из chrome://browser/content/nsContextMenu.js
Там же можно обнаружить
var request = this.target.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST); if (request && (request.imageStatus & request.STATUS_SIZE_AVAILABLE)) this.onLoadedImage = true; if (request && (request.imageStatus & request.STATUS_LOAD_COMPLETE)) this.onCompletedImage = true;
и
// Reload image depends on an image that's not fully loaded this.showItem("context-reloadimage", (this.onImage && !this.onCompletedImage));
То есть, возможно, стоит делать проверку.
А вот определение наличия незагруженных картинок перебором всех картинок – это криво, по-моему. Тут хорошо бы найти какие-нибудь оповещения о неудавшейся загрузке.
Отредактировано Infocatcher (02-03-2010 23:58:24)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
текущую страницу из кэша
Для гугла – вот так (тоже секция «код»):
gBrowser.selectedTab = gBrowser.addTab("http://www.google.ru/search?q=cache:" + encodeURIComponent(content.location.href));
(в новой вкладке)
Или
loadURI("http://www.google.ru/search?q=cache:" + encodeURIComponent(content.location.href));
(в текущей вкладке)
Для яндекса нужно знать формат запроса...
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
И нечто вроде мануала для обработки кликов разными кнопками.
В секцию «инициализация» нужно добавить примерно следующее:
this.onclick = function(event) { if(event.button == 0) { // Действие при клике ЛКМ } else if(event.button == 1) { // Действие при клике СКМ } else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Действие при клике ПКМ без модификаторов } }; this.oncontextmenu = function(event) { if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Блокируем контекстное меню при клике ПКМ без модификаторов event.preventDefault(); event.stopPropagation(); } };
Если клик правой кнопкой обрабатывать не нужно, то часть кода про «this.oncontextmenu = function(event) { ... };» тоже не требуется.
Добавлено 03-03-2010 00:15:50
okkamas_knife
Мозилловцы не рекомендуют использовать _content (мол, deprecated). И правильнее делать encodeURIComponent, по идее. Хотя, конечно, это от серверной стороны зависит.
https://developer.mozilla.org/en/DOM/window.content
Some examples use _content instead of content. The former has been deprecated for a long time, and you should use content in the new code.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
То есть, возможно, стоит делать проверку.
Но трафик при перезагрузке картинок, если все и так загружены, кажется, не идет.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
okkamas_knife, спасибо, а где информацию по яндексу ты нашёл? я бы с удовольствием почитал бы статейку о синтаксисе который он понимает и прочих мелких фишечках...
И ещё новый реквест. Это должно быть просто.
Кнопка которая бы при нажатии циклически бы меняла параметр accessibility.blockautorefresh на true или false (разрешить или запретить сайту саморефрешиться или перенаправляться). Ну и чтоб иконка индицировала текущее состояние.
mzfx
Отсутствует
Кнопка которая бы при нажатии циклически бы меняла параметр accessibility.blockautorefresh на true или false (разрешить или запретить сайту саморефрешиться или перенаправляться). Ну и чтоб иконка индицировала текущее состояние.
Сложный вариант (отслеживает изменение этой настройки извне, код для секции «инициализация»):
const uid = "__custombuttons__" + this.id; if(uid in window) window[uid].destroy(); this.pref = { button: this, pName: "accessibility.blockautorefresh", get prefSvc() { return Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefService) .QueryInterface(Components.interfaces.nsIPrefBranch2); }, get pVal() { return navigator.preference(this.pName); }, set pVal(val) { navigator.preference(this.pName, val); }, init: function() { window.addEventListener("unload", this, false); this.prefSvc.addObserver(this.pName, this, false); this.setState(); //alert("init"); }, destroy: function() { this.prefSvc.removeObserver(this.pName, this); //alert("destroy"); }, setState: function() { this.button.setAttribute("checked", this.pVal); }, toggle: function() { this.pVal = !this.pVal; }, observe: function(subject, topic, pName) { if(topic == "nsPref:changed") this.setState(); }, handleEvent: function(e) { window.removeEventListener(e.type, this, false); this.destroy(); } }; this.onclick = function(e) { if(e.button == 0) this.pref.toggle(); }; window[uid] = { button: this, destroy: function() { this.button.pref.destroy(); } }; this.pref.init();
Простой вариант (изменяет состояние только при клике, тоже секция «инициализация»):
this.pName = "accessibility.blockautorefresh"; this.setState = function(pVal) { this.setAttribute("checked", arguments.length ? pVal : navigator.preference(this.pName)); } this.onclick = function(e) { if(e.button == 0) { var pVal = !navigator.preference(this.pName); navigator.preference(this.pName, pVal); this.setState(pVal); } }; this.setState();
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Anton
iDev.Pi
спасибо. воспользовался вторым вариантом(без Инициализации)
еще вопрос а можно ли сделать подобную кнопочку чтоб также сжимать базу Brief-a?
Вроде так:
window.openDialog('chrome://brief/content/compacting-progress.xul', 'Brief', 'chrome,titlebar,centerscreen');
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Выделить кодКод:
PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);
Добавил код в следующую кнопку:
var menu = document. getElementById ("bookmarksMenuPopup"). cloneNode (true); function delId(node) { node.removeAttribute("id"); Array.forEach(node.childNodes, delId); } delId(menu); this. appendChild (menu); this. setAttribute ("popup", menu. id = "cbBookmarks-" + this. id); this. onclick = function (event) { if (event. button == 1) { if (event. originalTarget. nodeName != "toolbarbutton") return; //PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId); PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title); } else if (event. button == 2) { if (event. shiftKey || (event. originalTarget. nodeName != "toolbarbutton")) return; toggleSidebar('viewBookmarksSidebar'); event. preventDefault (); event. stopPropagation (); } };
теперь при добавлении закладки начало появляться окно:
Отредактировано Jarichek (04-03-2010 12:04:00)
Отсутствует
Jarichek
Воспроизвести не удалось - видимо, дело в сборке.
Но установка переменной окружения XUL_ASSERT_PROMPT значением "0" должна подавить вывод подобных предупреждений.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует