Антон, извини, что опять надоедаю, но не мог бы ты к кнопке с закладками (которой я тебя так долго мучал), прицепить внизу списка функцию "открыть всё в новых вкладках?
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
А по поводу второго вопроса (пост 927)?
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Najlus
А по поводу второго вопроса (пост 927)?
Я сейчас занимаюсь вопросами razoo
Как закончу, займусь твоим.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
2. Использую расширение "Brief" https://addons.mozilla.org/en-US/firefox/addon/4578, как RSS агрегатор. Хотелось бы чтобы открывающая его кнопка одновременно закрывала боковую панель AiOS (но не блокировала). Просто у Брифа есть собственная боковая панель, которая в AiOS не интегрируется (и ненужно). Восстановление панели после закрытия Брифа тоже не требуется
Секция «код»:
if(this.isBriefOpen()) gBrowser.removeTab(gBrief.tab); else { try { toggleSidebar(); } catch(e) {} gBrief.open(gBrief.shouldOpenInNewTab()); }
Секция «инициализация»:
this.image = "chrome://brief/skin/toolbarbutton.png"; this.type = "checkbox"; this.isBriefOpen = function() { return gBrief.tab == gBrowser.selectedTab; }; this.updState = function() { this.checked = this.isBriefOpen(); }; if(gBrief.onTabLoad.toString().indexOf("var ret = _onTabLoad.apply(this, arguments);") != -1) return; var _onTabLoad = gBrief.onTabLoad; var _onTabSelect = gBrief.onTabSelect; var _this = this; gBrief.onTabLoad = function() { var ret = _onTabLoad.apply(this, arguments); _this.updState(); return ret; }; gBrief.onTabSelect = function() { var ret = _onTabSelect.apply(this, arguments); _this.updState(); return ret; };
Если нужно поставить свою картинку, строку
нужно убрать.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Спасибо, всё работает :)
Маленький недочет - если закрыть таб с "Брифом" кнопкой закрытия таба, а не той, которую сделали - то отображение нашей (custom) останется нажатой.
Может вообще убрать ей "нажатый" вариант?
Какая строчка кода на это работает?
Отредактировано razoo (25-07-2009 21:54:54)
Отсутствует
Маленький недочет - если закрыть таб с "Брифом" кнопкой закрытия таба, а не той, которую сделали - то отображение нашей (custom) останется нажатой.
Не должно бы. А оригинальная кнопка правильно меняет «нажатость»?
Можно вот так попробовать (вместо предыдущего кода для раздела «инициализация»):
this.image = "chrome://brief/skin/toolbarbutton.png"; this.type = "checkbox"; this.isBriefOpen = function() { return gBrief.tab == gBrowser.selectedTab; }; this.updState = function() { this.checked = this.isBriefOpen(); }; this.updState(); if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1) return; var _cb_onTabLoad = gBrief.onTabLoad; var _cb_onTabSelect = gBrief.onTabSelect; var _cb_this = this; gBrief.onTabLoad = function() { var ret = _cb_onTabLoad.apply(this, arguments); _cb_this.updState(); return ret; }; gBrief.onTabSelect = function() { var ret = _cb_onTabSelect.apply(this, arguments); _cb_this.updState(); return ret; };
+ теперь устанавливается правильное состояние при создании кнопки.
А вот правильно работать, возможно, будет только в новых окнах (или после перезапуска).
Без изменения состояния кнопки (только секция «код»):
if(gBrief.tab == gBrowser.selectedTab) gBrowser.removeTab(gBrief.tab); else { try { toggleSidebar(); } catch(e) {} gBrief.open(gBrief.shouldOpenInNewTab()); }
Отредактировано Infocatcher (25-07-2009 22:26:32)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
razoo
1. Сделал кнопку для "Block Site" https://addons.mozilla.org/en-US/firefox/addon/3145 с вашим кодом (пост #786 http://forum.mozilla-russia.org/viewtop … 88#p305388).
Спасибо, отличная вещь. Но можно ли усовершенствовать код, чтобы плагин блокировал весь сайт, а не только открытую страничку (пока приходится вручную добавлять "*" после доменной зоны нежелательного портала). А еще лучше, если бы, рядом была стрелка с выпадающим меню, где была бы возможность определить до какого уровня блокировать, а нажатие на саму кнопку - блокировало бы весь сайт целиком.
В раздел "Код":
var url = getBrowser (). contentDocument. location. href; url = url. match (/^([a-zA-Z]+:\/\/)?([^\/]+)\/([^?]*)?(.*)$/); var domain = ""; if (url) domain = url [1] + url [2] + "/*"; this. blockURL (this. uriToBlock || domain); this. uriToBlock = "";
В раздел "Инициализация":
/*Initialization Code*/ this. clickHandler = function (event) { if (event. button == 2) return; if (event. originalTarget. nodeName == "toolbarbutton") return; else if (event. originalTarget. nodeName == "menuitem") this. uriToBlock = event. originalTarget. getAttribute ("label"); }; this. blockURL = function (url) { var Cc = Components. classes; var Ci = Components. interfaces; var NSISSI = Ci. nsISupportsString; var blockedWebsitesArray; var BlockSitePrefBranch = Cc ["@mozilla.org/preferences-service;1"]. getService (Ci. nsIPrefService). getBranch("BlockSite."); if (BlockSitePrefBranch. prefHasUserValue ("locations")) { blockedWebsitesString = BlockSitePrefBranch. getComplexValue ("locations", NSISSI). data; blockedWebsitesArray = blockedWebsitesString. split ("|||"); } else { blockedWebsitesArray = new Array(); } blockedWebsitesArray. push (url); var locationNsIString = Cc ["@mozilla.org/supports-string;1"]. createInstance (NSISSI); locationNsIString. data = blockedWebsitesArray. join ("|||"); BlockSitePrefBranch. setComplexValue ("locations", NSISSI, locationNsIString); custombuttons. alertSlide ("Blocked: ", url); }; this. createMenu = function (event) { var url = getBrowser (). contentDocument. location. href; if (event && (event. originalTarget. nodeName != "toolbarbutton")) return; url = url. match (/^([a-zA-Z]+:\/\/)?([^\/]+)\/([^?]*)?(.*)$/); var domain = ""; var levels = ""; if (url) { domain = url [1] + url [2] + "/"; var path = url [3] && url [3]. split ("/") || ""; var levels = []; var curpath = ""; for (var i = 0; i < path. length; i++) { curpath = curpath + path [i] + "/"; levels. push (domain + curpath); } } var menu = this. getElementsByTagName ("menupopup") [0]; if (menu) this. removeChild (menu); menu = ""; menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/> var menuitem; for (var i = 0; i < levels. length; i++) { menuitem = <menuitem label={levels [i]}/> menu.menuitem[i] = menuitem; } menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement; this. appendChild (menu); this. type = "menu-button"; this. orient = "horizontal"; }; this. createMenu (null); this. setAttribute ("onclick", "this.clickHandler(event)"); this. setAttribute ("onmouseover", "this.createMenu(event,getBrowser().contentDocument.location.href)");
2. Использую расширение "Brief" https://addons.mozilla.org/en-US/firefox/addon/4578, как RSS агрегатор. Хотелось бы чтобы открывающая его кнопка одновременно закрывала боковую панель AiOS (но не блокировала). Просто у Брифа есть собственная боковая панель, которая в AiOS не интегрируется (и ненужно). Восстановление панели после закрытия Брифа тоже не требуется
У меня получилось "корявей" чем у Infocatcher'а (и получилось ли как надо - я не пользователь Brief). Кстати, Infocatcher - спасибо.
Какая строчка кода на это работает?
Вторая в разделе "Инициализация", вроде бы как.
3. Не получилось сделать работающую кнопку для добавления текущей страницы в проект Offline Explorerа. Родное метапродуктовское расширение позволяет это сделать только из контекстного меню. Самодельная кнопка запускает Оффлайн Эксплорер и создает пустой проект, а url текущей страницы в него не вставляет.
Тупо использовал код, вытащенный MenuManipulator из контекстного:
Перед строкой "MPContext.OEDownload(event);" надо добавить
var url = getBrowser (). contentDocument. location. href; this. setAttribute ("url", url);
Что касается вопросов по визуальному отображению кнопок.
Можно ли это реализовать в CB для других кнопок?
Скорее всего, можно, но я не настолько знаток css, чтобы "слету" придумать, что там надо записать в "Инициализацию", нужны дополнительные исследования.
Короче, идей пока никаких нет, если появятся - сообщу дополнительно.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Infocatcher
Всё теперь работает корректно )
Причем, действительно, "недочет" с новым кодом пропал после рестарта.
Спасибо )
Добавлено 25-07-2009 22:40:28
Anton
Спасибо, всё и работает отлично и выглядит правильно!
P.S. Уникальная у вас тут оперативность.
Думаю, что и с визуальными решениями вы тож разберетесь.
Отсутствует
Антон, извини, что опять надоедаю, но не мог бы ты к кнопке с закладками (которой я тебя так долго мучал), прицепить внизу списка функцию "открыть всё в новых вкладках?
"Прицеплением" дополнительного пункта меню я заморачиваться не стал.
Вместо этого клик по кнопке открывает весь список на вкладках.
Надо взять вариант кода, который предложил Infocatcher, в разделе "Инициализация" найти и заменить строки
на
В раздел "Код" добавить:
var menu = this. getElementsByTagName ("menupopup") [0]; var mi = menu. getElementsByTagName ("menuitem"); while (mi. length > 0) { getBrowser (). loadOneTab(mi [0]. getAttribute ("url"), null, null, null, false /*load in background*/, false); this. deleteMenuitem (mi [0]); }
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
По поводу отображения кнопок.
В стилях для стандартных кнопок:
+ другие иконки на
:hover и :hover:active
Реализовать это можно примерно вот так (код записывать в «инициализацию»):
with(this.style) { MozAppearance = "none"; border = "none"; } this.onmouseover = function() { this.image = "hover"; }; this.onmouseout = function() { this.image = "normal"; }; this.onmousedown = function() { this.image = "active"; }; this.onmouseup = function() { this.image = "hover"; };
Вместо "normal", "hover" и "active" – должны быть соответствующие картинки.
Только нужно следить, чтобы больше нигде не переназначалось this.on<событие>, иначе нужно править уже имеющийся код.
В качестве демонстрации (с изменением прозрачности вместо картинок):
with(this.style) { MozAppearance = "none"; border = "none"; } this.onmouseover = function() { this.style.opacity = "0.8"; }; this.onmouseout = function() { this.style.opacity = "1"; }; this.onmousedown = function() { this.style.opacity = "0.5"; }; this.onmouseup = function() { this.style.opacity = "0.8"; };
Добавлено 25-07-2009 23:02:11
P.S. Случаем API для регистрации CSS-правил не предусмотрено? По-моему, не помешало бы пригодилось бы.
Как примерный вариант – функция получает строку CSS-кода, заменяет все вхождения «%button%» на «#buttonId» и «регистрирует» новый стиль.
Добавлено 25-07-2009 23:14:57
Using the Stylesheet Service
Отредактировано Infocatcher (25-07-2009 22:54:50)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
"Прицеплением" дополнительного пункта меню я заморачиваться не стал.
Вместо этого клик по кнопке открывает весь список на вкладках.
Или можно открывать весь список при клике средней кнопкой мыши (по-прежнему в раздел «инициализация»):
var profileDir = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsILocalFile) .path; var path = profileDir + "\\tabbookmarks.xml"; var loadInBackground = true; this. handleDragOver = function (event) { var dt = event. dataTransfer; var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0); if (!tab) return; event. preventDefault (); event. stopPropagation (); return dt. effectAllowed = dt. dropEffect = "link"; } this. handleDrop = function (event) { var dt = event. dataTransfer; var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0); var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0); var label = tab. label; var image = tab. image; var br = getBrowser (); //if (br. tabContainer. childNodes. length > 1) br. removeTab (tab); this. addMenuitem (label, url, image); }; this. addMenuitem = function (label, url, image) { var menu = this. menu; var mi = document. createElement ("menuitem"); mi. setAttribute ("label", label); mi. setAttribute ("url", url); mi. setAttribute ("tooltiptext", url); mi. className = "menuitem-iconic bookmark-item"; image && mi. setAttribute ("image", "moz-anno:favicon:" + image); menu. appendChild (mi); this. type = "menu"; this. flushMenu (menu); }; this. deleteMenuitem = function (menuitem) { var menu = this. menu; menu. removeChild (menuitem); this. checkEmpty (menu); this. flushMenu (menu); }; this. checkEmpty = function (menu) { if (menu. getElementsByTagName ("menuitem"). length > 0) return; menu. hidePopup (); this. type = ""; }; this. flushMenu = function (menu) { menu = menu || this. menu; var xs = new XMLSerializer (); var xmenu = xs. serializeToString (menu); var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "UTF-8"; xmenu = suc. ConvertFromUnicode (xmenu); custombuttons. writeFile (path, xmenu); }; this. getMenu = function (event) { var menu = this. menu; if (menu) this. removeChild (menu); menu = ""; try { file = Components. classes ["@mozilla.org/file/local;1"]. createInstance (Components. interfaces. nsILocalFile); file. initWithPath (path); var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"]. createInstance (Components. interfaces. nsIFileInputStream); fis.init (file, 0x01, 00004, null); var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"]. createInstance (Components. interfaces. nsIScriptableInputStream); sis. init (fis); menu = sis. read (sis. available ()); sis. close (); var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "UTF-8"; menu = suc. ConvertToUnicode (menu); menu = new XML (menu) || ""; } catch (e) { menu = ""; } if (!menu) { menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onclick="this. parentNode. openTab (event);"/> } menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement; this. appendChild (menu); if (menu. getElementsByTagName ("menuitem"). length > 0) this. type = "menu"; this. orient = "horizontal"; return menu; }; this. __defineGetter__ ( "menu", function () { return this. getElementsByTagName("menupopup") [0]; } ); this. openTab = function (event) { var mi = event. target; var menu = mi. parentNode; var url = mi. getAttribute ("url"); if (event. button < 2) { if (event. button == 0) getBrowser (). loadURI (url, null, null); else getBrowser (). loadOneTab(url, null, null, null, loadInBackground, false); menu. hidePopup (); } else event. stopPropagation (); this. deleteMenuitem (mi); this. flushMenu (menu); }; this. onclick = function (event) { if (event. button != 1 || event. target != this) return; var menu = this. menu; var mis = menu. getElementsByTagName ("menuitem"); var mi; while (mis. length) { mi = mis[0]; getBrowser (). loadOneTab(mi. getAttribute ("url"), null, null, null, true /*load in background*/, false); menu. removeChild (mi); } this. checkEmpty (menu); this. flushMenu (menu); }; this. setAttribute ("ondragdrop", "return this. handleDrop (event);"); this. setAttribute ("ondragover", "return this. handleDragOver (event);"); this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);"); this. getMenu ();
Отредактировано Infocatcher (26-07-2009 03:43:58)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher, Anton СПА-СИ-БО!
Infocatcher - ваш вариант для меня более удобен
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Anton
А как насчет реализации деструкторов для кнопок?
Т.е. чтобы можно было определить действие, которое будет выполняться при удалении кнопки (или хотя бы – если сложно реализовать учет перетаскивания кнопки обратно в toolbarpalette – при пересоздании кнопки, если пользователь изменил что-то в коде).
Например, можно было бы сделать вот так (а не так):
if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1) return; var _cb_onTabLoad = gBrief.onTabLoad; var _cb_onTabSelect = gBrief.onTabSelect; var _cb_this = this; gBrief.onTabLoad = function() { var ret = _cb_onTabLoad.apply(this, arguments); _cb_this.updState(); return ret; }; gBrief.onTabSelect = function() { var ret = _cb_onTabSelect.apply(this, arguments); _cb_this.updState(); return ret; }; this.buttonDestructor = function() { gBrief.onTabLoad = _cb_onTabLoad; gBrief.onTabSelect = _cb_onTabSelect; };
Если пойти дальше, может пригодиться и чуть более расширенный вариант, который будет выполняться еще и при событии «unload» окна браузера.
Добавлено 26-07-2009 18:06:10
Во, вроде, работает даже при вызове настройки панелей инструментов:
var cssStr = "%button%:hover { opacity: 0.7 !important; }"; var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"] .getService(Components.interfaces.nsIStyleSheetService); var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var data = "data:text/css," + encodeURIComponent(cssStr.replace(/%button%/g, "#" + this.id)); var uri = ios.newURI(data, null, null); sss.loadAndRegisterSheet(uri, sss.USER_SHEET); var _this = this; this.addEventListener( "DOMNodeRemoved", function(e) { _this.removeEventListener("DOMNodeRemoved", arguments.callee, true); alert(e.type); if(sss.sheetRegistered(uri, sss.USER_SHEET)) sss.unregisterSheet(uri, sss.USER_SHEET); }, true );
Добавлено 26-07-2009 18:07:23
Но, по-хорошему, нужно еще повесить обработчик на unload и снимать слушателя DOMNodeRemoved, если он к тому моменту все еще висит.
Добавлено 26-07-2009 18:15:37
Вот как-то так:
var cssStr = "%button%:hover { opacity: 0.7 !important; }"; var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"] .getService(Components.interfaces.nsIStyleSheetService); var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var data = "data:text/css," + encodeURIComponent(cssStr.replace(/%button%/g, "#" + this.id)); var uri = ios.newURI(data, null, null); sss.loadAndRegisterSheet(uri, sss.USER_SHEET); var _this = this; var unloadDestroy = false; function destroy(e) { alert(e.type + " => destroy()"); _this.removeEventListener("DOMNodeRemoved", destroy, true); window.removeEventListener("unload", destroy, false); if(e.type == "unload" && !unloadDestroy) return; if(sss.sheetRegistered(uri, sss.USER_SHEET)) sss.unregisterSheet(uri, sss.USER_SHEET); } this.addEventListener("DOMNodeRemoved", destroy, true); window.addEventListener("unload", destroy, false);
Добавлено 26-07-2009 18:21:02
Пример с кодом для открытия Brief:
this.image = "chrome://brief/skin/toolbarbutton.png"; this.type = "checkbox"; this.isBriefOpen = function() { return gBrief.tab == gBrowser.selectedTab; }; this.updState = function() { this.checked = this.isBriefOpen(); }; this.updState(); if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1) return; var _cb_onTabLoad = gBrief.onTabLoad; var _cb_onTabSelect = gBrief.onTabSelect; var _cb_this = this; gBrief.onTabLoad = function() { var ret = _cb_onTabLoad.apply(this, arguments); _cb_this.updState(); return ret; }; gBrief.onTabSelect = function() { var ret = _cb_onTabSelect.apply(this, arguments); _cb_this.updState(); return ret; }; var _this = this; var unloadDestroy = false; function destroy(e) { _this.removeEventListener("DOMNodeRemoved", destroy, true); window.removeEventListener("unload", destroy, false); if(e.type == "unload" && !unloadDestroy) return; gBrief.onTabLoad = _cb_onTabLoad; gBrief.onTabSelect = _cb_onTabSelect; } this.addEventListener("DOMNodeRemoved", destroy, true); window.addEventListener("unload", destroy, false);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Код стиля кнопок "без бордюров" сработал.
/*Initialization Code*/ with(this.style) { MozAppearance = "none"; border = "none"; this. mouseover = function (event) { this. oldimage = this. image; this. image = "file:///W:/ReloadwoCach2.png"; } this. mouseout = function (event) { this. image = this. oldimage; } this. setAttribute ("onmouseover", "this.mouseover()"); this. setAttribute ("onmouseout", "this.mouseout()");
Кому как, а мне вариант "без бордюров" кажется аккуратней.
И какие, при этом, дает возможности для редизайна.
Спасибо.
P.S. Я, как Эдвард Нортон в Fight Club думал, "...что вопрос с диванам решён окончательно", а теперь, видимо, надо переделывать весь тулбар ))
Может быть, и вопрос со смещением кнопок удастся решить?
Как-нибудь при инициализации задавать им координаты?
Возможно, это покажется мелочью, но лично мне кажется логичней и эргономичней группировать вплотную друг к другу родственные кнопки типа "Reload" и "Reload without cache", или Скрапбуковские "Capture" и "Capture as..." Как это сделано со стандартными "Go Back"-"Go Forward".
Потому что пока, чтобы достичь визуального порядка, приходится использовать пустой "Space" из стандартной палитры настройки, чтобы раздвинуть и так не близко стоящие кнопки.
Отредактировано razoo (26-07-2009 20:17:04)
Отсутствует
Код стиля кнопок "без бордюров" сработал.
На отсутствие закрывающей фигурной скобки у
with(this.style) { ... }
не ругается?
Кстати, если написать
this. onmouseover = function (event) { ... }
, можно убрать часть кода с
this. setAttribute ( ... )
Может быть, и вопрос со смещением кнопок удастся решить?
Примерно так:
function isVisible(node) { if(!node) return false; var win = node.ownerDocument.defaultView; return win.getComputedStyle(node, "").display != "none" && win.getComputedStyle(node, "").visibility != "collapse" } // Отступ слева: if(isVisible(this.previousSibling)) this.style.marginLeft = "10px"; // Отступ справа: if(isVisible(this.nextSibling)) this.style.marginRight = "10px";
Или вообще без проверок:
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
ДА! Тотально-то-что-надо.
Если использовать отрицательное значение, например:
кнопки можно ставить вплотную. Именно, как хотелось!
На отсутствие закрывающей фигурной скобки у
with(this.style) { ... }
не ругается?
Нет. Все равно исправить?
Кстати, если написать
this. onmouseover = function (event) { ... }
, можно убрать часть кода с
this. setAttribute ( ... )
В предложенном вами коде так и было. Это я просто заменил на кусок, которым пользовался раньше :)
Отсутствует
Нет. Все равно исправить?
Да, лучше исправить.
У меня этот код вообще себя странно ведет. Из «инициализации» не работает (кнопка становится полупрозрачной), но в консоли ошибок ничего нету (что странно). А из «кода» уже ругается:
Ошибка: missing } in compound statement Источник: custombutton://buttons/Firefox/code/custombuttons-button11 Строка: 14
Более того, можно заменить код в инициализации на
try { new Function( 'with(this.style) {\n\ MozAppearance = "none";\n\ border = "none";\n\ this. mouseover = function (event)\n\ {\n\ this. oldimage = this. image;\n\ this. image = "file:///W:/ReloadwoCach2.png";\n\ }\n\ this. mouseout = function (event)\n\ {\n\ this. image = this. oldimage;\n\ }\n\ this. setAttribute ("onmouseover", "this.mouseover()");\n\ this. setAttribute ("onmouseout", "this.mouseout()");' ).call(this); } catch(e) { alert(e); }
, и будет сообщение:
SyntaxError: missing } in compound statement
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
А можете сделать кнопку для менеджера сессий навроде той для закладок?
При щелчке на кнопку происходит сохранение сессии. Сессии в списке (только собственноручно сохранённые). удаляются также ПКМ
Мне только это надо реализвать, чтобы избавиться от главного меню
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Najlus
А кнопка от Session Manager'а не устроит?
И мало исходных данных. Предполагается, что в наличии только встроенная сохранялка сессий?
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
А кнопка от Session Manager'а не устроит?
Сори, переработал
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Infocatcher
А как насчет реализации деструкторов для кнопок?
Они были в 0.0.3.0-0.0.3.5 на this. destroy = ...
При переделке binding'а в 0.0.3.6 я его как-то потерял, заметил только недавно.
Правда, работал он только по закрытию окна, из деструктора xbl.
Буду иметь в виду твои предложения.
razoo
Infocatcher
ДА! Тотально-то-что-надо.
Кажется, вопросы по визуальному оформлению разрешились ?
Я ещё даже не успел заняться "дополнительными исследованиями".
Al_H
Сделал кнопку для CustomButtons "по мотивам" ТЗ из № 906
Для работы требуется FF 3.5, Stylish 1.0.5, Custom Buttons 0.0.4.3 - проверял на этом.
Для сохранения настроек кнопка создает файл themes.js в корневом каталоге профиля.
Диалоговое окно "Добавить стиль" я реализовывать не стал, так как это может делать Stylish.
Раздел "Код": http://pastebin.mozilla-russia.org/100398
Раздел "Инициализация": http://pastebin.mozilla-russia.org/100399
Вот только слова "аддон" я заметил несколько позже.
Приношу свои извинения, но разработкой ещё одного расширения я заняться не могу.
Отредактировано Anton (27-07-2009 22:30:44)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Они были в 0.0.3.0-0.0.3.5 на this. destroy = ...
При переделке binding'а в 0.0.3.6 я его как-то потерял, заметил только недавно.
Правда, работал он только по закрытию окна, из деструктора xbl.
Буду иметь в виду твои предложения.
Все же от деструктора при (пере)создании кнопки пользы больше. И настраивать кнопки при этом проще (а рестарты – это не айс).
Так что поставлю вопрос иначе: отлавливает ли код с DOMNodeRemoved все удаления кнопки? А то я не особо вникал в механизм toolbarpalette.
Кстати, я там забыл про проверку (забавно, делал не так давно в своих целях – там не забыл ) на
event.originalTarget === button
А с ней как раз и проблемы – можно же удалить не саму кнопку, а ее родителя (хотя, вроде бы, такого в нормальных условиях не происходит).
Так что пока вот так (если снова чего-нибуть не упустил):
var _this = this; var unloadDestroy = false; function destroy(e) { (e.type == "DOMNodeRemoved" && e.originalTarget !== _this) return; _this.removeEventListener("DOMNodeRemoved", destroy, true); window.removeEventListener("unload", destroy, false); if(e.type == "unload" && !unloadDestroy) return; // Some code } this.addEventListener("DOMNodeRemoved", destroy, true); window.addEventListener("unload", destroy, false);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
А кнопка от Session Manager'а не устроит?
...поставил Session Manager, но быстро удалил.
Плагин замечательный, но я пользуюсь менеджером сессий, встроенным в “Tab Mix Plus” и он меня устраивает.
Всем, кроме кнопки. ))
Во-первых, родная кнопка Tab Mix Plus ущербная. Практически, это просто выпадающее меню. Отдельного действия у кнопки почему-то нет, хотя логичней было бы, чтобы нажатие на кнопу загружало последнюю сохраненную сессию. Причем в выпадающем меню last session у них действительно выделена, будто это действие по умолчанию.
Во-вторых, в связи открывшимися крутыми возможностями по визуализации просто хочется сделать эту кнопку с помощью CB. :)
Итого :) неплохо бы было получить кнопку, которая по нажатию загружает последнюю сессию, сохраненную “Tab Mix Plus”, а рядом стрелка с выпадающим меню, в котором всё то же, что в меню и сейчас.
И новая серия вопросов:
Я честно просмотрел все 38 страниц темы форума, но не нашел, как делать отработчик(?) shift+click или ctrl+click.
Т.е. я делаю кнопку для плагина Screengrab!
Хотел, чтобы при нажатии он делал скриншот всей страницы,
при ctrl+click видимую часть,
при shift+click предлагал выделить нужную часть. Коды, соответственно:
По отдельности все работают правильно, но зачем делать 3 кнопки, если можно объединить это в одной.
Ещё :)
Как кнопке задавать условия, при которой кнопка будет неактивной (выглядеть неактивной)?
Например: кноп, которая перематывает к первой страничке на табе
Как сделать, чтобы, вернувшись к самой первой - кнопка становилась (выглядела) неактивной как и стандартные лисовские стрелки, показывая что дальше «мотать некуда»?
Еще хотел избавиться от плагина Uppity, заменив его кастом-кнопкой с простеньким кодом upOneFolder();
Но хотелось бы чтобы кнопка становилась неактивной «когда выше подняться некуда» и было выпадающее меню с доступными уровнями, подобно тому, которое Anton сделал для плагина “Block Site”.
Кстати, Anton.
Твою кнопку для “Block Site” можно ещё усовершенствовать. Мог бы ты сделать так, чтобы нижней строкой в выпадающем меню можно было вызвать окно настроек самого плагина (там блэк лист)?
P.S. Я подозреваю, что в теме CB это может быть оффтопом, но как принудительно открывать в табах те окна, которые запускаются различными плагинами?
Например, окно infolisterа, или менеджер закладок (родной лисовский) или (О!) менеджер скрапбука. Может быть, делая кнопу, можно прописать в коде куда именно завернуть окно?
Отсутствует