в FF при клике на ссылку появляется контекстное меню,там есть пункт :  Сохранить объект как...
вот его бы и повесить на Shift+Clik

Сохранить ссылку или изображение двойным правым кликом(Firefox 3.6 +)
Автор: bunda1
Описание: Код даёт возможность сохранить ссылку или изображение с диалогом сохранения двойным правым кликом(ПКМ) на ссылку или изображение. В настройках должен быть указан путь для сохранения файлов.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

//Сохранить ссылку или изображение двойным правым кликом..................
gBrowser.addEventListener("click", function(event) {
     if (event.button !== 2) return;
     //....
     if (gContextMenu.onLink && !gContextMenu.onImage){ gContextMenu.saveLink()};
     if (gContextMenu.onLink && gContextMenu.onImage){ gContextMenu.saveMedia();};
      //....
     setTimeout(function() { document.getElementById("contentAreaContextMenu").hidePopup()}, 500)
}, false);

Сохранить изображение в папке загрузки двойным правым кликом(Firefox 3.6 +)
Автор: bunda1
Описание:Код даёт возможность сохранить изображение без диалога сохранения в папке загрузки двойным правым кликом(ПКМ) на изображение:
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Сохранить изображение в папке загрузки двойным правым кликом, без запроса на место сохранения ......................
gBrowser.mPanelContainer.addEventListener("dblclick", function(event) {
      if ( event.button == 2 && event.target.nodeName == 'IMG') saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
      //....
      setTimeout(function() { document.getElementById("contentAreaContextMenu").hidePopup()}, 20)
}, false);

Спасибо!
вот ёлки палки :)
я не могу применить такую комбинацию в своей проге для автоматизации...
А ещё не срабатывает на картинках вот тут:
http://izhbazar.ru/gallery/album.php?album_id=18
А можно  просто чтоб по правому клику  происходило  такое сохранение но без показа save dialog box
нажал и сразу в папку  какую-то,картинка по ссылке эта сохранилась.
---------
И ещё  дурацкий вопрос,как самому написать  кнопку,что нужно почитать?
Очень хочу научится сам,буду признателен за пинок в нужную сторону.

selevo пишет

А можно  просто чтоб по правому клику  происходило  такое сохранение но без показа save dialog box нажал и сразу в папку  какую-то,картинка по ссылке эта сохранилась.

Можно, но как ты будешь открывать контекстное меню по ПКМ на ссылках и изображениях.

selevo пишет

И ещё  дурацкий вопрос,как самому написать  кнопку,что нужно почитать?
Очень хочу научится сам,буду признателен за пинок в нужную сторону.

Если не знаешь JavaScript  то можешь начать с хорошего учебника Современный учебник JavaScript | JavaScript.ru про кнопки для Custom Buttons можно почитать тут
Custom Buttons Documentation | custombuttons

selevo пишет

я не могу применить такую комбинацию в своей проге для автоматизации...

Сохранить ссылку или изображение - 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+ПКМ(Firefox 3.6 +)
Автор: bunda1
Описание: Код даёт возможность сохранить изображение без диалога сохранения в папке загрузки если нажать Shift+правый клик(ПКМ) на изображение:
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

//Сохранить изображение в папке загрузки - Shift+ПКМ.........
document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function(event) {
      if (!event.shiftKey) return;
      //...
      if (gContextMenu.onLink && gContextMenu.onImage){ 
      var doc = gContextMenu.target.ownerDocument;
      var d = "nodePrincipal" in doc?doc.nodePrincipal:doc.location.href; urlSecurityCheck(gContextMenu.imageURL, d);
      saveImageURL(gContextMenu.imageURL, null, "SaveImageTitle", false, true, makeURI(doc.location.href));
      };
      //....
      setTimeout(function() { document.getElementById("contentAreaContextMenu").hidePopup()}, 50)
}, false);

да контекстное пофиг не пользуюсь,так-то.И вообще это больше для тестов сайтов.
за книгу спасибо  начну читать!!!
------------------
не пойму что-то не так делаю наверно,не срабатывает действие кнопки.
Поставил код  во вкладку инициализация
перезагрузил FF жамкаю с Shift на картинку
тут и появляется контекстное стандартное меню.

selevo
У меня не появляется. Ты мой старый код удалил?

да ,всё в той же кнопке  меняю.
а старый работает

проверял на чистом профиле

видеоролик

Рестарт.

без изменений

Измени папку загрузки.

у меня сзадана была
e:\download

Ну тогда я не знаю. :(

сейчас проверю на вашей сборке

Может попробуй этот код:

Выделить код

Код:

// Сохранить изображение в папке загрузки двойным правым кликом, без запроса на место сохранения ......................
gBrowser.mPanelContainer.addEventListener("dblclick", function(event) {
      if ( event.button == 2 && event.target.nodeName == 'IMG') saveImageURL(gContextMenu.imageURL, 0, 0, 0, 1, null, content.document);
      //....
      setTimeout(function() { document.getElementById("contentAreaContextMenu").hidePopup()}, 20)
}, false);

проверил в вашей сборке...
в общем это нигде не работает
вы сами проверяли ?

Конечно проверял на своей сборке и FF14, я всегда проверяю. Не знаю в чем причина. Мистика однако.

ну естественно не будет работать,у меня-то 3.6 версия.

Посмотрел кстати вашу сборку,оставил впечатления  на страничке :)

На FF 3.6 тоже работает.

давайте знаете что сделаем,скиньте  мне вашу портабле версию  с этой кнопкой,а я её у себя проверю.
Фантастики буть не должно  тут.

Как сделать, чтобы сохраненные изображения не отображались в менеджере загрузок? Можно отключить в настройках глобально, но
1) с недавних пор эта опция совмещена с общей историей, а ее отключать не хочется
2) остальные скачиваемые файлы пусть бы оставались в менеджере загрузок

Dеnis
Чем ты сохраняешь изображения ?

Правый клик > Сохранить изображение как...

bunda1

Denis пишет

Правый клик > Сохранить изображение как...

Как думаешь - так сойдёт ?

скрытый текст

Выделить код

Код:

var menuItem = document.getElementById("context-saveimage");
var dm = Components.classes["@mozilla.org/download-manager;1"]
    .getService(Components.interfaces.nsIDownloadManager);
var url = null;

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);
        }
    }
}
function cleaner() {

    url = gContextMenu.imageURL;
    dm.addListener(listener);
}

menuItem.addEventListener("command", cleaner, false);

this.onDestroy = function() {
    menuItem.removeEventListener("command", cleaner, false);
}

Dumby
Отличная вещь, особенно если отключить "Показывать окно загрузок при загрузке файла" в настройках.

bunda1
Спасибо.

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);
}

А так тоже пробовал:

Выделить код

Код:

document.getElementById("context-saveimage").addEventListener("click", cleaner, false);

и

Выделить код

Код:

setTimeout(function() {  }, 500)
bunda1 пишет

"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);
}

Я имел виду что некоторые не запускаемые функции можно запустить если использовать метод setTimeout

bunda1

Да-да, setTimeout почти всегда помогает, но думаю это - на крайний случай,
когда альтернативу найти не получается. А в данном случае, вроде, не требуется...
В общем, ещё раз спасибо, и - ждём что Dеnis скажет :)

bunda1 пишет

Сохранить ссылку или изображение - 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 пишет

Почему-то этот код вызывает окно "Сохранить как..." два раза подряд - первое закрываешь, и тут же  открывается  второе.
А можно при использовании комбинации 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, спасибо. Контекстное меню пропало, а окно "Сохранить как" всё равно открывается два раза. :(

PEAKTOP
Наверно этот код у тебя где то уже есть, других объяснений у меня нет.

bunda1, да какой-то шайтан с этой кнопкой - кода в других местах нет (специально пересмотрел код других кнопок). Последовательность действий - удаляю код, и окно "сохранить как" появляется единожды.  Перезапускаю браузер - функция перестаёт работать (т.е.) кода этой кнопки в других местах нет. Вставляю код - окно появляется два раза. Я сам в шоке.

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, естественно, я буду сам в код кнопки вносить - мне бы только "скелет" или шаблон кнопки.

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") );

Лучше сделать в контекстном меню несколько подменю и туда перенести лишние пункты.

etoins srldu пишет
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. Сделать несколько подменю - безусловно лучше - просто я думал, что если мне покажут как собирать в одно подменю, я смогу уже сам "наворотить" несколько :)

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") );         
})();

Пригодится:
Метод insertBefore() XML Элемента | okITgo.ru
Метод appendChild() – добавление дочернего узла к XML элементу | okITgo.ru

etoins srldu пишет
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") );         
})();

Большущее спасибо!
Этот код действительно позволяет собирать менюитемы в подменю.
Но я оказался слишком самонадеянным - как сделать самому второе подменю - не знаю :blush:
Не могли бы Вы показать как добавить второе подменю?

Спасибо, 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" - имена подменюшек!