bunda1
Спасибо.
особенно если отключить "Показывать окно загрузок при загрузке файла" в настройках.
Кстати, попробовал сделать отключение только для «Правый клик > Сохранить изображение как...»,
напрямую - не получается ( не успевает, наверное ),
ничего лучше не придумал, вот так, только «под мышь», - вроде работает...
const prefName = "browser.download.manager.showWhenStarting"; var menuItem = document.getElementById("context-saveimage"); var dm = Components.classes["@mozilla.org/download-manager;1"] .getService(Components.interfaces.nsIDownloadManager); var cm = document.getElementById("contentAreaContextMenu"); var url = null; var thePref = true; var listener = { onDownloadStateChange: function(prevState, download) { if (download.source.spec != url) return; var state = download.state; if (state == dm.DOWNLOAD_FINISHED || state == dm.DOWNLOAD_CANCELED || state == dm.DOWNLOAD_FAILED) { dm.removeDownload(download.id); dm.removeListener(this); Application.prefs.setValue(prefName, thePref); } } } function cleaner() { url = gContextMenu.imageURL; dm.addListener(listener); } function onPopup(e) { if (e.target != cm) return; thePref = Application.prefs.getValue(prefName, true); Application.prefs.setValue(prefName, false); addEventListener("click", function reset(e) { removeEventListener("click", reset, false); if (e.target == menuItem) return; Application.prefs.setValue(prefName, thePref); }, false); } menuItem.addEventListener("command", cleaner, false); cm.addEventListener("popupshowing", onPopup, false); this.onDestroy = function() { menuItem.removeEventListener("command", cleaner, false); cm.removeEventListener("popupshowing", onPopup, false); }
Отредактировано Dumby (03-11-2012 04:40:35)
Отсутствует
А так тоже пробовал:
document.getElementById("context-saveimage").addEventListener("click", cleaner, false);
и
Отредактировано bunda1 (03-11-2012 09:19:43)
Отсутствует
"click"
Да! Это ты здо́рово подметил.
Стоило заменить «command» на «click» и заработало как надо,
даже, наверное, и лучше, что только по клику, если вдруг понадобиться,
чтобы картинка осталась в менеджере загрузок - сохраняешь клавишами.
А вот про «setTimeout» - не понял...
const prefName = "browser.download.manager.showWhenStarting"; var menuItem = document.getElementById("context-saveimage"); var dm = Components.classes["@mozilla.org/download-manager;1"] .getService(Components.interfaces.nsIDownloadManager); var url = null; var thePref = true; var listener = { onDownloadStateChange: function(prevState, download) { if (download.source.spec != url) return; var state = download.state; if (state == dm.DOWNLOAD_FINISHED || state == dm.DOWNLOAD_CANCELED || state == dm.DOWNLOAD_FAILED) { dm.removeDownload(download.id); dm.removeListener(this); Application.prefs.setValue(prefName, thePref); } } } function cleaner() { thePref = Application.prefs.getValue(prefName, true); Application.prefs.setValue(prefName, false); url = gContextMenu.imageURL; dm.addListener(listener); } menuItem.addEventListener("click", cleaner, false); this.onDestroy = function() { menuItem.removeEventListener("click", cleaner, false); }
Отредактировано Dumby (03-11-2012 13:52:36)
Отсутствует
bunda1
Да-да, setTimeout почти всегда помогает, но думаю это - на крайний случай,
когда альтернативу найти не получается. А в данном случае, вроде, не требуется...
В общем, ещё раз спасибо, и - ждём что Dеnis скажет
Отсутствует
Сохранить ссылку или изображение - Shift+ПКМ(Firefox 3.6 +)
Автор: bunda1
Описание:Код даёт возможность сохранить ссылку или изображение с диалогом сохранения если нажать Shift+правый клик(ПКМ) на ссылку или изображение:
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.
Выделить код
Код:Выделить кодКод:
document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function(event) { if (!event.shiftKey) return; if (gContextMenu.onLink && !gContextMenu.onImage){ gContextMenu.saveLink()}; //... if (gContextMenu.onLink && gContextMenu.onImage){ gContextMenu.saveMedia();}; }, false);
Почему-то этот код вызывает окно "Сохранить как..." два раза подряд - первое закрываешь, и тут же открывается второе.
А можно при использовании комбинации Shift+ПКМ не показывать контекстное меню, а сразу открывать диалоговое окно "Сохранить как...", или это отразится на отображении контекстного меню по ПКМ ?
Отредактировано PEAKTOP (13-03-2013 17:17:07)
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
Почему-то этот код вызывает окно "Сохранить как..." два раза подряд - первое закрываешь, и тут же открывается второе.
А можно при использовании комбинации Shift+ПКМ не показывать контекстное меню, а сразу открывать диалоговое окно "Сохранить как...", или это отразится на отображении контекстного меню по ПКМ ?
Вот попробуй:
// Сохранить ссылку или изображение с диалогом сохранения если нажать Shift + правый клик(ПКМ) на ссылку или изображение ............... function saveLinkOrImage(e) { if ( e.shiftKey && e.button == 2 && /img|a/.test(e.target.localName.toLowerCase()) ) { e.preventDefault(); saveURL( e.target.src || e.target.href ); } }; gBrowser.addEventListener("click", saveLinkOrImage, false); this.onDestroy = function() { gBrowser.removeEventListener("click", saveLinkOrImage, false); };
Отсутствует
bunda1, спасибо. Контекстное меню пропало, а окно "Сохранить как" всё равно открывается два раза.
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
bunda1, да какой-то шайтан с этой кнопкой - кода в других местах нет (специально пересмотрел код других кнопок). Последовательность действий - удаляю код, и окно "сохранить как" появляется единожды. Перезапускаю браузер - функция перестаёт работать (т.е.) кода этой кнопки в других местах нет. Вставляю код - окно появляется два раза. Я сам в шоке.
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
PEAKTOP
Я тут вспомнил что похожий глюк у меня был на Nigtly, некоторые коды тоже без причины срабатывали два раза. Помогла перестановка Nightly с полным удалением профиля. Похоже что тут само Сustom Buttons глючит.
Может попробуй это:
// Сохранить ссылку или изображение с диалогом сохранения двойним ПКМ(правый клик) на ссылку или изображение ............... function saveLinkOrImage(e) { if ( e.button == 2 && /img|a/.test(e.target.localName.toLowerCase()) ) { e.preventDefault(); saveURL( e.target.src || e.target.href ); } }; gBrowser.addEventListener("dblclick", saveLinkOrImage, false); this.onDestroy = function() { gBrowser.removeEventListener("dblclick", saveLinkOrImage, false); };
Отсутствует
У меня есть более общий вопрос.
Дело в том, что когда много дополнений, главное контекстное меню становится просто огромным.
У меня есть дополнение UI Eraser, которое позволяет узнать ID каждого менюитема и при необходимости скрыть его.
Но я бы хотел, чтобы по ПКМ открывалось не всё контекстное меню, а только выбранные мной по ID менюитемы (или наоборот, не указанные как скрытые - это не принципиально) и был дополнительный менюитем "показать всё").
Кроме того, по Shift+ПКМ - открывалось бы выбранное мной (по ID) подмножество менюитемов, по Ctrl+ПКМ - другое подмножество, по Alt+ПКМ - третье подмножество.
Сами ID, естественно, я буду сам в код кнопки вносить - мне бы только "скелет" или шаблон кнопки.
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
У меня есть более общий вопрос....
Дело в том, что когда много дополнений, главное контекстное меню становится просто огромным.
Вот пример:
// отслеживать открытие контекстного меню на странице .... addEventListener("popupshowing", function(e) { LOG('e.ctrlKey' + " " + e.ctrlKey); LOG('e.altKey' + " " + e.altKey); LOG('e.shiftKey' + " " + e.shiftKey); //menuitem.hidden = !gContextMenu.onImage; // скрывать пункт если не контекстное меню изображений }, true, document.getElementById("contentAreaContextMenu") );
Лучше сделать в контекстном меню несколько подменю и туда перенести лишние пункты.
Отсутствует
difabor пишетУ меня есть более общий вопрос....
Дело в том, что когда много дополнений, главное контекстное меню становится просто огромным.Вот пример:
Выделить кодКод:
// отслеживать открытие контекстного меню на странице .... addEventListener("popupshowing", function(e) { LOG('e.ctrlKey' + " " + e.ctrlKey); LOG('e.altKey' + " " + e.altKey); LOG('e.shiftKey' + " " + e.shiftKey); //menuitem.hidden = !gContextMenu.onImage; // скрывать пункт если не контекстное меню изображений }, true, document.getElementById("contentAreaContextMenu") );Лучше сделать в контекстном меню несколько подменю и туда перенести лишние пункты.
Спасибо, но:
1. Я всё-таки не понял как пользоваться тем, что Вы предложили и где и как "собирать" менюитемы в подменю.
2. Сделать несколько подменю - безусловно лучше - просто я думал, что если мне покажут как собирать в одно подменю, я смогу уже сам "наворотить" несколько
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
2. Сделать несколько подменю - безусловно лучше - просто я думал, что если мне покажут как собирать в одно подменю, я смогу уже сам "наворотить" несколько
Вот пример, передвигает стандартными пункты в подменю:
(function () { var contextMenu = document.getElementById("contentAreaContextMenu"); var menu = document.createElement("menu"); menu.setAttribute("id", "context-submenu1"); menu.setAttribute("label", "подменю"); contextMenu.insertBefore( menu, document.getElementById("context-sep-properties") ); addDestructor(function() { contextMenu.removeChild( menu ) }); var menuPopup = menu.appendChild( document.createElement("menupopup") ); menuPopup.appendChild( document.getElementById("context-selectall") ); menuPopup.appendChild( document.getElementById("context-copy") ); })();
Пригодится:
Метод insertBefore() XML Элемента | okITgo.ru
Метод appendChild() – добавление дочернего узла к XML элементу | okITgo.ru
Отсутствует
difabor пишет2. Сделать несколько подменю - безусловно лучше - просто я думал, что если мне покажут как собирать в одно подменю, я смогу уже сам "наворотить" несколько
Вот пример, передвигает стандартными пункты в подменю:
Выделить кодКод:
(function () { var contextMenu = document.getElementById("contentAreaContextMenu"); var menu = document.createElement("menu"); menu.setAttribute("id", "context-submenu1"); menu.setAttribute("label", "подменю"); contextMenu.insertBefore( menu, document.getElementById("context-sep-properties") ); addDestructor(function() { contextMenu.removeChild( menu ) }); var menuPopup = menu.appendChild( document.createElement("menupopup") ); menuPopup.appendChild( document.getElementById("context-selectall") ); menuPopup.appendChild( document.getElementById("context-copy") ); })();
Большущее спасибо!
Этот код действительно позволяет собирать менюитемы в подменю.
Но я оказался слишком самонадеянным - как сделать самому второе подменю - не знаю
Не могли бы Вы показать как добавить второе подменю?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Спасибо, okkamas_knife, но видать, мне это ещё не по зубам...
Как сделать второе подменю я так и не знаю...
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Сделал! Вот код:
var lst1 = ["openbox-context","context-selectall","context-copy","dwhelper-ctxmenu"]; var lst2 = ["context-back","context-forward"]; function sbmen (nam, lst) { var contextMenu = document.getElementById("contentAreaContextMenu"); var menu = document.createElement("menu"); menu.setAttribute("id", "context-submenu1"); menu.setAttribute("label", nam); contextMenu.insertBefore( menu, document.getElementById("context-sep-properties") ); addDestructor(function() { contextMenu.removeChild( menu ) }); var menuPopup = menu.appendChild( document.createElement("menupopup") ); for (var i = 0; i<lst.length; i++){if (document.getElementById(lst[i]) != null) menuPopup.appendChild( document.getElementById(lst[i]) ); } } sbmen("sbmenu1",lst1); sbmen("sbmenu2",lst2);
В lst1, lst2 перечисляем те итемы основного контекстного меню, которые хотим упрятать в подменю, "sbmenu1", "sbmenu2" - имена подменюшек!
Отредактировано difabor (18-05-2014 04:01:23)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует