ты бы лучше написал чем грозят описанные нововведения - в плане что поломается из старых кнопок
и как с этими поломками бороться.
Ничем не грозят. Зато будет более удобная замена для E4X.
Но после обновления она стало дублироваться, не последнего обновления FF (точно с какой версии не помню).
Заменить
на
И можно уменьшить задержку:
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher спс - помогло, а таймер я менял и ранее... результат был нулевой.
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Indomito
Собственно, проблема там из-за
Из-за этого (и особенностей Custom Buttons) инициализация выполнится дважды.
А document.getElementById(mPopid) вернет <menupopup>, созданный при повторной инициализации, так что заполнится дважды.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Можно написать код, который бы результаты поиска Гугла по картинке мог сортировать пo дaтe?
Т. е. я захожу сюда нажимаю значок фотоаппарата, ввожу урл картинки и получаю много результатов.
Мне нужно расположить их по дaтe - сначала свежие, потом старше, или наоборот.
Отредактировано rbfyec (09-09-2014 13:10:56)
Отсутствует
Есть пара расширений которые иногда нужны на время, а держать их постоянно включенными не хочется. Приходится каждый раз открывать страницу аддонов, выбирать, перезапускать, закрывать страницу, потом чтобы отключить, всё повторять заново. Можно как то сделать кнопку, нажал, расширение включилось, автоматом браузер перегрузился, нажал, выключилось, перезагрузился и всё.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Есть пара расширений которые иногда нужны на время, а держать их постоянно включенными не хочется. Приходится каждый раз открывать страницу аддонов, выбирать, перезапускать, закрывать страницу, потом чтобы отключить, всё повторять заново. Можно как то сделать кнопку, нажал, расширение включилось, автоматом браузер перегрузился, нажал, выключилось, перезагрузился и всё.
Тебе нужна кнопка что бы переключить сразу несколько раширений или как?
Отсутствует
bunda1
Желательно по одному.
Визуальные закладки, удобно из контекстного иногда добавлять.
https://addons.mozilla.org/ru/firefox/a … bookmarks/
Иногда скачать видео, но если постоянно держать, то достают выскакивающие окошки.
http://www.internetdownloadmanager.com/ … ation.html
Иногда зайти на сайты когда не пускают по нормальному.
https://addons.mozilla.org/ru/firefox/addon/frigate/
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
villa7
Создай кнопки с вот таким кодом:
AddonManager.getAddonsByTypes(["extension"], function(addons) { addons.forEach(function(addon, i) { if ( addons[i].name == "DOM Inspector" ) addons[i].userDisabled = !addons[i].userDisabled; }) }); Application.restart();
Вместо DOM Inspector поставь название своего расширения без номера версии.
Отсутствует
Я попробовал. Кнопка циклично перезапускает , раза четыре подряд, пока процесс не убил и не восстановился из backup.
Ты наверно положил код в инициализацию.
Отсутствует
Пересел с на и обнаружил, что не работает одна кнопка
//quick drag + dowload sort //1. При перемещении выделенного текста, искать его в новой вкладке, с помощью текущего поисковика. //2. При перемещении изображения, сохранять его в папку ~/Загрузки/DD.MM.YYYY (DD - текущий день, MM - текущий месяц, YYYY - текущий год). location == "chrome://browser/content/browser.xul" && (function(event) { var self = arguments.callee; if ( !event ) { ["dragstart", "dragover", "drop"].forEach(function(type) { gBrowser.mPanelContainer.addEventListener(type, self, false) }); addDestructor(function() { ["dragstart", "dragover", "drop"].forEach(function(type) { gBrowser.mPanelContainer.removeEventListener(type, self, false) }); }); return; }; switch (event.type) { case "dragstart": { self.startPoint = [event.screenX, event.screenY]; self.sourceNode = event.target; event.target.localName == "img" && event.dataTransfer.setData("application/x-moz-file-promise-url", event.target.src); break; } case "dragover": { self.startPoint && (Components.classes["@mozilla.org/widget/dragservice;1"].getService(Components.interfaces.nsIDragService).getCurrentSession().canDrop = true); break; } case "drop": { if (self.startPoint && event.target.localName != "textarea" && (!(event.target.localName == "input" && (event.target.type == "text" || event.target.type == "password"))) && event.target.contentEditable != "true") { event.preventDefault(); event.stopPropagation(); var [subX, subY] = [event.screenX - self.startPoint[0], event.screenY - self.startPoint[1]]; var [distX, distY] = [(subX > 0 ? subX : (-subX)), (subY > 0 ? subY : (-subY))]; var direction; var t = content.getSelection().toString(); if (distX > distY) direction = subX < 0 ? "L" : "R"; else direction = subY < 0 ? "U" : "D"; // Изображения .... if ( event.dataTransfer.types.contains("application/x-moz-file-promise-url")) { // сохранить изображение или ссылку без запроса на место сохранения var img = event.dataTransfer.getData("application/x-moz-file-promise-url"); //var path = "/home/wl/Загрузки/" + new Date().toLocaleFormat("%d.%m.%Y"); var path = "/home/wl/Загрузки/image"; // создать папку если не существует .... const file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); file.initWithPath( path ); if ( !file.exists() || !file.isDirectory() ) file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0777); Application.prefs.setValue("browser.download.useDownloadDir", true ); Application.prefs.setValue("browser.download.dir", path ); setTimeout(function() { saveImageURL( img, 0, 0, 0, 1, null, content.document) }, 100); //saveImageURL(event.dataTransfer.getData("application/x-moz-file-promise-url"), 0, 0, 0, 1, null, content.document); //возврат опции сохраниения Спрашивать куда сохр файл setTimeout(function() { Application.prefs.setValue("browser.download.useDownloadDir", false ) }, 200); return; } // Выделенный текст .... if ( event.dataTransfer.getData("text/unicode") ) { var sel = event.dataTransfer.getData("text/unicode"); // поиск текста в текущем поисковике в новой активной странице var ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); var submission = ss.currentEngine.getSubmission( sel, null ); gBrowser.loadOneTab( submission.uri.spec, {relatedToCurrent: true, inBackground: true} ); return; } self.startPoint = 0; } } } })();
Браузер должен сам решать свои проблемы, а не возлагать их на пользователей. Minor
Отсутствует
bunda1
Ты не представляешь от каких неудобств меня избавил, нет честно, каждый раз лазить на страницу аддонов, чтобы просто тупо включить-отключить, муторно. Спасибо тебе большое.
Подумалось, вот бы ещё их объединить в одну кнопку с выпадающим списком, наподобие "Переключателя Jetpack-ов", цены бы не было, для тех кто не хочет держать постоянно включенными расширения, а лазить каждый раз на страницу аддонов лень.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Может кто сможет сделать кнопку (инициализация), которая после поиска в searchbar вернёт поисковик по умолчанию и к этой кнопке прикрутить код из расширения Search on Engine Change? Т.е. идея такая: поискал, поисковик по умолчанию вернулся, но поле не очистилось --> выбрал другой поисковик из установленных и поиск начался автоматически (так было в Опере), а не как сейчас - нужно нажимать Enter или значок.
У bunda1 есть кнопка, но убрать очистку и прицепить код из расширения самостоятельно для меня нереально.
P.S. Ставить просто это расширение не особенно хочется, если не будет возвращаться поисковик по умолчанию.
Отсутствует
villa7
Или где-то около такого минимума
var names = [ "FireGestures", "DOM Inspector" ]; function addElement(name, attrs, parent) { var elm = document.createElement(name); for(var attr in attrs) elm.setAttribute(attr, attrs[attr]); return parent.appendChild(elm); } function isAddonDisabled(addon) { var ud = addon.userDisabled; var po = addon.pendingOperations; return Boolean( (ud && !(po & AddonManager.PENDING_DISABLE)) || (!ud && po & AddonManager.PENDING_ENABLE) ); } var popup = this.firstChild; if (!popup) { popup = addElement("menupopup", { id: _id + "popup", position: "after_start", oncontextmenu: "return false", oncommand: "event.stopPropagation(); this.toggle(event);", onpopupshown: "this.decDisabled();" }, this); popup.toggle = function(e) { var node = e.target; if (node == popup) return; var addon = node.addon; var ud = addon.userDisabled; var po = addon.pendingOperations; var toggle = (ud && !(po & AddonManager.PENDING_DISABLE)) || (!ud && !(po & AddonManager.PENDING_ENABLE)); if (toggle) ud = addon.userDisabled = !ud; var rr = addon.operationsRequiringRestart; var restart = (ud && rr & AddonManager.OP_NEEDS_RESTART_DISABLE) || (!ud && rr & AddonManager.OP_NEEDS_RESTART_ENABLE); restart && Application.restart(); } popup.decDisabled = function() { for(var menuitem of popup.childNodes) { if (menuitem.getAttribute("addondisabled") == "false") continue; var [imgBox, lab, accBox] = document.getAnonymousNodes(menuitem); imgBox.firstChild.style.cssText = '\ filter: url("chrome://mozapps/skin/extensions/extensions.svg#greyscale");\ opacity: 0.5;\ '; lab.style.cssText = '\ color: grey;\ opacity: 0.7;\ '; } } } popup.textContent = ""; AddonManager.getAddonsByTypes(["extension"], addons => { var data = {}; for(var addon of addons) { var name = addon.name; if (name) data[name] = addon; } for(name of names) { if (!(name in data)) continue; var addon = data[name]; var menuitem = addElement("menuitem", { label: name, id: _id + "-" + addon.id, class: "menuitem-iconic", addondisabled: isAddonDisabled(addon), image: addon.iconURL || addon.icon64URL || "chrome://mozapps/skin/extensions/extensionGeneric-16.png" }, popup); menuitem.addon = addon; } popup.openPopup(self); });
Отсутствует
W@ld_Lii
Для начала, нужно удалить из первой строки кода
location == "chrome://browser/content/browser.xul" &&
Удалил, работает нормально до перезапуска браузера, после перезапуска отрабатывает дважды, т.е. при перетаскивании текста открывается 2 вкладки и картинки сохраняются дважды, причём игнорируется var path = "/home/wl/Загрузки/image"
Отредактировано W@ld_Lii (08-09-2014 19:58:50)
Браузер должен сам решать свои проблемы, а не возлагать их на пользователей. Minor
Отсутствует
bunda1
Ты не представляешь от каких неудобств меня избавил, нет честно, каждый раз лазить на страницу аддонов, чтобы просто тупо включить-отключить, муторно. Спасибо тебе большое.
Подумалось, вот бы ещё их объединить в одну кнопку с выпадающим списком, наподобие "Переключателя Jetpack-ов", цены бы не было, для тех кто не хочет держать постоянно включенными расширения, а лазить каждый раз на страницу аддонов лень.
Сделать могу, но лучше попроси Infocatcher что бы он добавил такую возможность в Toggle Restartless Add-ons.
Отсутствует
Может кто сможет сделать кнопку (инициализация), которая после поиска в searchbar вернёт поисковик по умолчанию и к этой кнопке прикрутить код из расширения Search on Engine Change? Т.е. идея такая: поискал, поисковик по умолчанию вернулся, но поле не очистилось --> выбрал другой поисковик из установленных и поиск начался автоматически (так было в Опере), а не как сейчас - нужно нажимать Enter или значок.
У bunda1 есть кнопка, но убрать очистку и прицепить код из расширения самостоятельно для меня нереально.
P.S. Ставить просто это расширение не особенно хочется, если не будет возвращаться поисковик по умолчанию.
(function () { var searchbar = document.getElementById("searchbar"); var getEngineModified = { observe: function(subject, topic, data) { if ( data == "engine-current" && searchbar.textbox.value.length && Services.search.currentEngine.name != "Яндекс" ) searchbar.textbox.onTextEntered(); } }; Services.obs.addObserver( getEngineModified, "browser-search-engine-modified", false ); var src = "BrowserSearch.searchBar.handleSearchCommand = " + BrowserSearch.searchBar.handleSearchCommand.toString(), res = src.replace("{", '{\nsetTimeout(function() Services.search.currentEngine = Services.search.getEngineByName("Яндекс"), 500)'); eval(res); addDestructor(function() { eval(src); Services.obs.removeObserver( getEngineModified, "browser-search-engine-modified", false ); }) })();
Отсутствует
bunda1
Спасибо, работает отлично! Это то, чего мне не хватало после перехода с .
Поисковиков у меня много, например, несколько музыкальных. И было неудобно после каждого поиска заново вбивать название песни, а теперь раз вбил и сиди, выбирай поисковики! И поиск по умолчанию не слетает.
Отсутствует
Dumby
bunda1
Всё замечательно настроилось, есть один маленький нюанс, у меня все кнопки с меню раскрываются наведением, а на эту №8812 нужно нажимать, непривычно, можно что то сделать?
Отредактировано villa7 (08-09-2014 23:46:48)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
у меня все кнопки с меню раскрываются наведением, а на эту №8812 нужно нажимать
В Инициализацию
this.onmouseenter = () => this.firstChild && this.firstChild.state == "open" || this.click();
var delayOpen = 250; var delayClose = 500; var timeoutOpen, timeoutClose; function isOpen(btn) btn.firstChild && btn.firstChild.state == "open"; function open(btn) isOpen(btn) || btn.click(); function close(btn) isOpen(btn) && btn.firstChild.hidePopup(); this.onmouseenter = () => timeoutOpen = clearTimeout(timeoutClose) || setTimeout(open, delayOpen, this); this.onmouseleave = () => timeoutClose = clearTimeout(timeoutOpen) || setTimeout(close, delayClose, this);
Отредактировано Dumby (09-09-2014 05:40:43)
Отсутствует