Полезная информация

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№1655129-09-2022 11:11:10

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 102.0

Re: Custom Buttons

ifln
https://forum.mozilla-russia.org/viewto … 13#p799413
   
Еще читайте дальнейшие посты.

Отредактировано _zt (29-09-2022 11:13:41)

Отсутствует

 

№1655229-09-2022 14:19:41

ifln
Участник
 
Группа: Members
Зарегистрирован: 20-09-2013
Сообщений: 235
UA: Firefox 102.0

Re: Custom Buttons

_zt
Стоит  "антиподписячий" код и paxmod 0.0.7.0.0.26 отсюда
Добавил запускатор  по вашей ссылке.
Не работает кнопка как положено. Но дело не только в ней. И другие кнопки чудят. Undo Close Tabs button, например, по пкм открывает меню кнопки.

Отсутствует

 

№1655329-09-2022 16:28:34

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

ВВП пишет

Как сделать этот код с цикличностью ? К,примеру через каждые 15сек
Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_DOM_STORAGES, () => {});

Из кнопки это совсем неудобно. Лучше в custom_script.js добавить

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

Выделить код

Код:

(async () => {
	var timer = globalThis[Symbol()] =
		Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
	var callback = Services.clearData.deleteData
		.bind(null, Ci.nsIClearDataService.CLEAR_DOM_STORAGES, () => {});
	timer.initWithCallback(callback, 15000, timer.TYPE_REPEATING_SLACK);
})();

Отсутствует

 

№1655429-09-2022 16:36:52

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 105.0

Re: Custom Buttons

ifln пишет

Стоит  "антиподписячий" код и paxmod 0.0.7.0.0.26 отсюда

Какой код используйте, для [firefox] 102+ здесь > https://forum.mozilla-russia.org/viewtopic.php?id=70326 + инструкция куда ... добавлять.


Win7

Отсутствует

 

№1655529-09-2022 18:09:14

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 105.0

Re: Custom Buttons

Dumby

Dumby пишет

Лучше в custom_script.js добавить

Блеск ! как бы еще алертик ввернуть?
alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
                      alertsService.showAlertNotification(alertimg, "Очистка хранилища", "Завершено" );
                      setTimeout(()=> alertsService.closeAlert(), 2000);
Нет, не подходит. При просмотре на ютуб ,конфликт ! Если бы при выходе из домена, или просто при закрытии вкладки...
Типа, после gBrowser.removeMultiSelectedTabs();
Исполняется этот:
  Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_DOM_STORAGES, () => {});
Можно и без таймера.

Отредактировано ВВП (30-09-2022 17:45:40)

Отсутствует

 

№1655601-10-2022 02:55:20

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: Custom Buttons

Подскажите код - как получить размер кэша в папке cache2 ?


Эта цифра отображается в настройках: "Ваши сохранённые куки, данные сайтов и кэш сейчас занимают на диске 700 МБ."

Отсутствует

 

№1655701-10-2022 11:25:27

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 105.0

Re: Custom Buttons

Dobrov
Диск SSD ? Тогда browser.cache.disk.enable - false. Будет кэш пустой.

Отсутствует

 

№1655801-10-2022 14:21:49

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 97.0

Re: Custom Buttons

ВВП я спрашивал про js-код - как получить размер кэша.

Отсутствует

 

№1655901-10-2022 14:55:13

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 105.0

Re: Custom Buttons

Dobrov
Закладка about:cache

Отсутствует

 

№1656001-10-2022 21:35:10

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

ВВП пишет

Dumby


При просмотре на ютуб ,конфликт !


просто при закрытии вкладки...
Типа, после gBrowser.removeMultiSelectedTabs();
Исполняется этот:
  Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_DOM_STORAGES, () => {});

Да сколько раз уже говорил, нет у меня никакого ютуба
и никаких dom storages, бесполезно спрашивать.


При закрытии вкладки, может в Инициализацию как-то так, не знаю

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

Выделить код

Код:

(flags => {
	var hosts = new Set([
		"youtube.com",
		"example.org",
	]);
	var clear = Services.clearData.deleteData.bind(null, flags, () => {});

	var skip, check = () => {
		skip = null;
		for(var w of CustomizableUI.windows) for(var tab of gBrowser.tabs) try {
			if (!tab.closing && hosts.has(tab.linkedBrowser.currentURI.host)) return;
		} catch {}
		clear();
	}
	addEventListener("TabClose", e => skip ??= setTimeout(check, 400), false, gBrowser.tabContainer);
})(Ci.nsIClearDataService.CLEAR_DOM_STORAGES);

Dobrov пишет

как получить размер кэша в папке

Например

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

Выделить код

Код:

Services.cache2.asyncGetDiskConsumption({
	onNetworkCacheDiskConsumption(bytes) {
		Services.prompt.alert(null, " ", bytes + " bytes");
	},
	QueryInterface: ChromeUtils.generateQI([
		"nsISupportsWeakReference",
		"nsICacheStorageConsumptionObserver"
	])
});

Отсутствует

 

№1656103-10-2022 10:16:31

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 105.0

Re: Custom Buttons

Dumby
А вот здесь не понял...Что это дает?
var hosts = new Set([
        "youtube.com",
        "example.org",
    ]);
Извиняюсь, врубился...Хотя...не полностью. Вот бы на активной вкладке не срабатывало. А так какую не закроешь - все сразу чистит.

Отредактировано ВВП (03-10-2022 13:55:12)

Отсутствует

 

№1656205-10-2022 11:11:21

Deriax
Участник
 
Группа: Members
Зарегистрирован: 27-03-2021
Сообщений: 37
UA: Yandex 22

Re: Custom Buttons

Можно ли перезапустить FF с запуском нужного url?

Отсутствует

 

№1656305-10-2022 23:42:07

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 104.0

Re: Custom Buttons

Подскажите пожалуйста, давно не был на форуме. Перестал работать код с закладками (лиса 104)

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

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок
addEventListener("dblclick", (e, targ = e.originalTarget)=> {     
   if ( e.button || !targ._placesNode || !PlacesUtils.nodeIsFolder(targ._placesNode) ) return;          
   
   var docTitle = gBrowser.selectedTab.label.substr(3, 50);
   var folderId = PlacesUtils.getConcreteItemId(targ._placesNode);
   var folderTitle = PlacesUtils.bookmarks.getItemTitle(folderId);
   var currentURI = Services.io.newURI(gBrowser.currentURI.spec, null, null);
   PlacesUtils.bookmarks.insertBookmark(folderId, currentURI, 0, docTitle);  

   // всплывающая подсказка ....
Components.utils.import('resource://gre/modules/PopupNotifications.jsm');
var notify  = new PopupNotifications(gBrowser,
                    document.getElementById("notification-popup"),
                    document.getElementById("notification-popup-box"));

var notification =  notify.show(
// browser
gBrowser.selectedBrowser,
// popup id
"PDES-popup",
// message
"Добавил в папку " + folderTitle + ":",
// anchor id
null,
// main action
null,
// secondary action
null,
// options
{ 
  // Alternative way to set the popup icon
  popupIconURL: gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png"
}
);

setTimeout(function(){
  notification.remove();
}, 2000); // Time in milliseconds to disappear the door-hanger popup.
});

// Управление закладками
(function func() {
// Подсказка у кнопки.............................................................................
   var nnn = document.getElementById("bookmarks-menu-button");
   nnn.tooltipText = "Показать закладки" +"\n"+"\n"+
                   "Папки:" +"\n"+
                   "Двойной ЛКМ по папке: Добавить закладку в эту папку" +"\n"+
                   "СКМ: Открыть все закладки из папки не загружая страниц" +"\n"+"\n"+
                   "Закладки" +"\n"+
                   "ЛКМ: Открыть закладку в новой вкладке" +"\n"+
                   "СКМ: Открыть закладку в текущей вкладке"+"\n"+
                   "Ctrl+СКМ: Удалить закладку" +"\n"+"\n"; 

   const background = false;      // открывать закладку в фоновой вкладке
   const nextToCurrent = true;  // открывать закладку рядом с текущей вкладкой
   const menuAutoClose = true;   // автоматически закрыть меню закладок при уходе курсора

   function handleClick(e) { 
      var target = e.originalTarget;
      if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;

       // получить закладку, адрес, папку и id закладки, другие переменные
      var node = target._placesNode,
      id = node.itemId, uri = node.uri, button = e.button, type = e.type, isURI = PlacesUtils.nodeIsURI(node);

      // блокировать действие по умолчанию для клика и отжатия ....
      if ( button !== 2 && /click|mouseup/.test(type) ) { 
           e.preventDefault(); e.stopPropagation();
           }
       // если Ctrl+ средний клик - удалить закладку ....    
         if ( e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey && button == 1 ) {
              e.preventDefault();
              e.stopPropagation();
              // удалить закладку ....
              var itemId = target._placesNode.itemId;
              PlacesUtils.bookmarks.removeItem(itemId);
              }

         // левый клик открывает закладку в новой вкладке ....
         if ( button == 0 && type == 'click' && isURI ) {
           gBrowser.selectedTab = gBrowser.addTab ( uri, {triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });
           }

      // средний клик открывает закладку в текущей вкладке ....
      if ( button == 1 && type == 'click' && isURI ) {gBrowser. loadURI( uri, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });
           }

      // автоматически закрыть все меню закладок при уходе курсора .... 
      var menu = target.parentNode;
      if ( !menuAutoClose || !menu || menu.localName !== 'menupopup' || type !== 'click' || button == 2 ) return;

      menu.onmouseover = function() {menu.f = true};
      menu.onmouseleave = function() { 
         menu.f = false;
         setTimeout(function() {
           if ( menu.f ) return;
           for ( var node = menu; node; node = node.parentNode )
                 node.nodeName == 'menupopup' && node.hidePopup();
           menu.onmouseleave = null;
         }, 500);
      };

   };
   ["click", "dragstart", "mouseup", "mousedown"]
   .forEach(function(type) {addEventListener(type, handleClick, true)} );
})();
//Открыть всё из папки закладок в новых вкладках не загружая страниц от 
((g, id) => {
    addDestructor(r => r[5] == "e" && id in g && (g.PlacesUIUtils[id] = g[id]) && delete g[id]);
    if (id in g) return;

    g[id] = g.PlacesUIUtils[id];
    var func = g => PlacesUIUtils.openMultipleLinksInTabs = async function(nodeOrNodes, event, view) {

        var where, win = getBrowserWindow(view.ownerWindow);
        var newWin = !win || (where = win.whereToOpenLink(event, false, true)) == "window";

        var items = PlacesUtils.nodeIsContainer(nodeOrNodes)
            ? PlacesUtils.getURLsForContainerNode(nodeOrNodes)
            : Array.from(nodeOrNodes).filter(PlacesUtils.nodeIsURI);

        if (newWin) {
            var args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
            args.appendElement(PlacesUtils.toISupportsString(items.shift().uri));
            win = Services.ww.openWindow(
                win || null, AppConstants.BROWSER_CHROME_URL, null, "chrome,dialog=no,all", args
            );
            if (!items.length) return;
            await new Promise(resolve => win.addEventListener("load", resolve, {once: true}));
        }

        var loadInBackground = where == "tabshifted";
        var insertAfterCurrent = !newWin && Services.prefs.getBoolPref("browser.tabs.insertAfterCurrent");
        var triggeringPrincipal_base64 =
            g.Utils && g.Utils.SERIALIZED_SYSTEMPRINCIPAL || g.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL;

        var multi = items.length > 1;
        var params = {
            skipAnimation: multi || newWin,
            bulkOrderedOpen: multi,
            createLazyBrowser: true
        };
        if (insertAfterCurrent) params.index = win.gBrowser.selectedTab._tPos;

        var first = true;
        for(var {uri, title} of items) {
            if (insertAfterCurrent) params.index += 1;
            var tab = win.gBrowser.addTrustedTab(null, params);
            var state = {
                index: 1,
                hidden: false,
                attributes: {},
                lastAccessed: 0,
                entries: [{url: uri, title, triggeringPrincipal_base64}]
            };
            var image = await new Promise(resolve => PlacesUtils.favicons.getFaviconDataForPage(
                Services.io.newURI(uri),
                (uri, len, data, type) => {
                    if (!len) return resolve();
                    var reader = new FileReader();
                    reader.onloadend = () => resolve(reader.result);
                    reader.readAsDataURL(new Blob([new Uint8Array(data)], {type}));
                }, 16
            ));
            if (image) state.image = image;
            g.SessionStore.setTabState(tab, JSON.stringify(state));

            if (first) {
                first = false;
                if (newWin) continue;
                if (multi && insertAfterCurrent) params.index = tab._tPos;
               }
        }
    }
    Services.scriptloader.loadSubScript("data:," + encodeURIComponent(
        `(${func})(Cu.import("resource:///modules/sessionstore/SessionStore.jsm", {}))`
    ), g);
})(Cu.import("resource:///modules/PlacesUIUtils.jsm", {}), "openMultipleLinksInTabs");


В частности не работает - Открыть все закладки из папки не загружая страниц и автоматически закрыть все меню закладок при уходе курсора

Отредактировано Andrey_Krropotkin (05-10-2022 23:49:31)

Отсутствует

 

№1656406-10-2022 20:28:24

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

Andrey_Krropotkin пишет

В частности не работает - Открыть все закладки из папки не загружая страниц

Вариант под 104

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

Выделить код

Код:

(id => {
	addDestructor(r => {
		var func = r[5] == "e" && PlacesUIUtils[id].src;
		if (func) PlacesUIUtils[id] = func;
	});
	var func = PlacesUIUtils[id];
	if (func.src) return;

	var g = Cu.getGlobalForObject(Cu), o = g.Object;
	var obj = o.assign(o.create(null), {
		PlacesUtils, PlacesUIUtils, BrowserUtils, SessionStore, BrowserWindowTracker,
		BR_URL: location.href, triggeringPrincipal_base64: E10SUtils.SERIALIZED_SYSTEMPRINCIPAL
	});
	g.eval("((t, u) => Services.scriptloader.loadSubScript(u, t))")(obj, "data:," + encodeURIComponent(`
		var ${id} = async function(nodeOrNodes, event, view) {
			var win = view.ownerWindow;
			win = win?.document.documentElement.getAttribute("windowtype") == "navigator:browser"
				? win : BrowserWindowTracker.getTopWindow();
			var where = BrowserUtils.whereToOpenLink(event, false, true);
			var newWin = !win || where == "window";

			var items = PlacesUtils.nodeIsContainer(nodeOrNodes)
				? PlacesUtils.getURLsForContainerNode(nodeOrNodes)
				: Array.from(nodeOrNodes).filter(PlacesUtils.nodeIsURI);

			if (newWin) {
				var args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
				args.appendElement(PlacesUtils.toISupportsString(items.shift().uri));
				win = Services.ww.openWindow(win || null, BR_URL, null, "chrome,dialog=no,all", args);
				if (!items.length) return;
				await new Promise(resolve => win.addEventListener("load", resolve, {once: true}));
			}
			var insertAfterCurrent = !newWin && Services.prefs.getBoolPref("browser.tabs.insertAfterCurrent");

			var multi = items.length > 1, gb = win.gBrowser;
			var params = {
				skipAnimation: multi || newWin,
				bulkOrderedOpen: multi
			};
			if (insertAfterCurrent) params.index = gb.selectedTab._tPos;

			var first = true;
			for(var {uri, title} of items) {
				if (insertAfterCurrent) params.index += 1;
				var tab = gb.addTrustedTab(null, params);
				var state = {
					index: 1,
					hidden: false,
					attributes: {},
					lastAccessed: 0,
					entries: [{url: uri, title, triggeringPrincipal_base64}]
				};
				var image = await new Promise(resolve => PlacesUtils.favicons.getFaviconDataForPage(
					Services.io.newURI(uri),
					(uri, len, data, type) => {
						if (!len) return resolve();
						var reader = new FileReader();
						reader.onloadend = () => resolve(reader.result);
						reader.readAsDataURL(new Blob([new Uint8Array(data)], {type}));
					}, 16
				));
				if (image) state.image = image;
				SessionStore.setTabState(tab, state);

				if (first) {
					first = false;
					if (newWin) continue;
					if (multi && insertAfterCurrent) params.index = tab._tPos
					if (where == "tabshifted") gb.selectedTab = tab; // ???
				}
			}
		}`)
	);
	(PlacesUIUtils[id] = obj[id]).src = func;
})("openMultipleLinksInTabs");

и автоматически закрыть все меню закладок при уходе курсора

Работает. В смысле, что в коде написано, то и происходит.

Отсутствует

 

№1656507-10-2022 22:33:47

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 85
UA: Iceweasel 2.0

Re: Custom Buttons

Подскажите, пожалуйста, а новой версии кнопки Поиск изображения в ..." в контекстном меню изображений нет? Что-то не получается поиском найти.
На 78 работает, на 102 нет, выдаёт пустой результат. Пользуюсь пока 0T Reverse Image Search, иконку только в нём поменял, но не нравится, что нет у пунктов меню картинок поисковиков. Понимаю, что это шашечки, но хотелось бы с ними.

Отредактировано kazarin (07-10-2022 22:34:21)

Отсутствует

 

№1656607-10-2022 23:55:01

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

kazarin пишет

На 78 работает

Это как такое может быть, когда в коде повсюду document.createElement() торчит?

Отсутствует

 

№1656708-10-2022 01:27:43

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 85
UA: Iceweasel 2.0

Re: Custom Buttons

Dumby
Так я поменял на document.createXULElement().

Код из 78

Выделить код

Код:

// Добавить подменю "Поиск изображения в" в контекстном меню изображений, от 02.06.2019. .............
(()=> {
   var copyimage = document.getElementById("context-copyimage-contents");
   var contextMenu = copyimage.parentNode;

   var array = [
      ['Google', 'https://www.google.lv/favicon.ico', 'https://www.google.com/searchbyimage?&image_url='],
      ['Яндекс', 'http://yastatic.net/morda-logo/i/favicon_islands.ico', 'http://yandex.ru/images/search?rpt=imageview&img_url='],
      ['Bing', 'https://www.bing.com/s/a/bing_p.ico', 'http://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl='],
      ['Tineye', 'http://tineye.com/favicon.ico', 'http://tineye.com/search?pluginver=bookmark_1.0&url='],
   ];
  
   var menu = contextMenu.insertBefore(document.createXULElement("menu"), copyimage); 
   menu.setAttribute("label", "Поиск изображения в ...");
   menu.setAttribute("class", "menu-iconic");
   menu.setAttribute("image", "data:image/png;base64,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");
   menu.onclick =e=> { e.target.nodeName == 'menu' && search(array[0][2]); setTimeout(()=> contextMenu.hidePopup(), 20) };
   addEventListener("popupshowing", ()=> menu.hidden = copyimage.hidden, true, contextMenu);
   addDestructor(()=> menuitem.remove());

   var menuPopup = menu.appendChild(document.createXULElement("menupopup"));              
   array.forEach(m=> {
      var mItem = menuPopup.appendChild(document.createXULElement("menuitem"));
      mItem.setAttribute("label", m[0]);       
      mItem.setAttribute("image", m[1]);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.onclick =()=> search(m[2]);
   });
   
   var mItem = menuPopup.appendChild(document.createXULElement("menuitem"));
   mItem.setAttribute("label", 'Искать во всех поисковиках');       
   mItem.onclick =()=> { array.forEach(m=> { search(m[2]) }) };
   
   function search(finder) {
      gBrowser.selectedTab = gBrowser.addTab(finder + encodeURIComponent(gContextMenu.imageURL), {
                                             triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()});
   };
})();

Отредактировано kazarin (08-10-2022 01:31:53)

Отсутствует

 

№1656808-10-2022 10:43:19

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

kazarin пишет

Код из 78

Другое дело.


Если закрыть глаза на имеющиеся косяки,
то суть для 102 — заменить gContextMenu.imageURL на gContextMenu.mediaURL
или на gContextMenu.originalMediaURL
даже не знаю, первый after, а второй before redirects.

иконку только в нём поменял, но не нравится, что нет у пунктов меню картинок поисковиков.

Ту, которая в папке «i»?
Ну так положил бы туда же одноимённые пунктам поисковиков .ico'шки,
и в reverse.js

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

Выделить код

Код:

/*
for (var Engine in SearchEngines) {
	browser.menus.create({
		id : Engine,
		title : Engine,
		type : "normal",
		contexts : ["image"],
       		});
	};
*/
for(var id in SearchEngines) browser.menus.create({
	id, title: id, type : "normal", contexts : ["image"], icons: {16: `i/${id}.ico`}
});

Отсутствует

 

№1656908-10-2022 20:42:02

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 85
UA: unknown 0.0

Re: Custom Buttons

Dumby, огромное спасибо! Оба скрипта завелись))

Dumby пишет

даже не знаю, первый after, а второй before redirects.

А как лучше?

Dumby пишет

и в reverse.js

Что прописать можно, это я догадывался, а вот как, не угадал. Смотрел другие расширения и скрипты, даже один скрипт починил, пока экспериментировал. А вот тут не понял.
Можно вопрос? Что бы лично вы советовали почитать по скриптам, чтоб получше в них разбираться? Документацию по функциям с мозилла.орг я читал, не всю, правда, про создание вебэкстеншнс тоже, и всю тему про кастомные кнопки, по верхам нахватался, часто вижу, какой кусок кода за что отвечает, но правильно изменить могу, наверно, в 1 случае на 100.

Отсутствует

 

№1657009-10-2022 12:00:34

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

kazarin пишет

А как лучше?

Без понятия.
С одной стороны, в 78, аналог gContextMenu.imageURL это gContextMenu.mediaURL
С другой стороны, в 102, для WebExtensions, отдают gContextMenu.originalMediaURL
Вообще, полагаю, это всё не очень принципиально, если вдруг столкнёшся с ситуацией,
когда это повлияет на конечный результат, то такое будет интересно, а так, вроде, не должно.

Можно вопрос? Что бы лично вы советовали почитать по скриптам, чтоб получше в них разбираться?

Да я, вобщем-то, не теоретик.
Читать хорошо скрипты сделанные другими,
полезно читать gre и app omni.ja, их давно запаковывают без сжатия,
поэтому можно просто открыть в текстовом редакторе и, воспользовавшись поиском,
попробовать посмотреть как что-то сделано в самом браузере.
Консоль читать всегда полезно, как на предмет записей об ошибках,
так и своё, если в коде вставить console.log(что-то); для проверки.


А если что-то конкретное непонятно, то да, сходить за докой на MDN,
если это чисто по JS-языку или по веб-API, но если это нечто сугубо браузерное,
то почитать что выдаст https://searchfox.org (idl'ки, в основном).

Что прописать можно, это я догадывался, а вот как, не угадал.

Так и я был не в курсе. Посмотрел menus.create() и написал.
То есть, если строго дословно, то ты мог бы записать так, чтобы было совсем понятно

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

Выделить код

Код:

/*
for (var Engine in SearchEngines) {
	browser.menus.create({
		id : Engine,
		title : Engine,
		type : "normal",
		contexts : ["image"],
       		});
	};
*/
for (var Engine in SearchEngines) {
	browser.menus.create({
		id : Engine,
		title : Engine,
		type : "normal",
		contexts : ["image"],

		icons: {
			"16": "i/" + Engine + ".ico",
		},

       		});
	};


И, если понятно, можешь, для тренировки, попробовать добавить
иконку на пункт «Search All», заказ на его создание в reverse.js прописан отдельно.

Отсутствует

 

№1657109-10-2022 19:55:36

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 85
UA: Iceweasel 2.0

Re: Custom Buttons

Dumby пишет

С одной стороны, в 78, аналог gContextMenu.imageURL это gContextMenu.mediaURL

Это чтоб был универсальный для 78 и 102? Тогда оставлю gContextMenu.mediaURL.

Dumby пишет

если вдруг столкнёшся с ситуацией,
когда это повлияет на конечный результат

Вряд ли я пойму, что оно повлияло))

Dumby пишет

Читать хорошо скрипты сделанные другими

То немногое, что я знаю, я так и узнал, читал чужие скрипты, кнопки. Обычно сперва всегда стараюсь сделать сам, но если не получается и захожу в тупик, тогда приходится спрашивать(( Жаль, конечно, что нет учебников, которые можно было бы почитать.

Dumby пишет

Посмотрел menus.create() и написал

Вот как вы объяснили, так сразу стало ясно, что это было просто:) но до

Dumby пишет

i/${id}

я бы не додумался точно.

Dumby пишет

иконку на пункт «Search All»

А я вчера уже добавил:D и в кастомную кнопку тоже. Вот так:

Добавить подменю "Поиск изображения в" в контекстном меню изображений, от 08.10.2022

Выделить код

Код:

/*Initialization Code*/
// Добавить подменю "Поиск изображения в" в контекстном меню изображений, от 08.10.2022. .............

(()=> {
   var copyimage = document.getElementById("context-copyimage-contents");
   var contextMenu = copyimage.parentNode;

   var array = [
      ['Google', 'https://www.google.lv/favicon.ico', 'https://www.google.com/searchbyimage?&image_url='],
      ['Яндекс', 'http://yastatic.net/morda-logo/i/favicon_islands.ico', 'http://yandex.ru/images/search?rpt=imageview&img_url='],
      ['Bing', 'https://www.bing.com/s/a/bing_p.ico', 'http://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl='],
      ['Tineye', 'http://tineye.com/favicon.ico', 'http://tineye.com/search?pluginver=bookmark_1.0&url='],
      ['SauceNao', 'https://saucenao.com/favicon.ico', 'https://saucenao.com/search.php?url='],
      ['IQDB', 'data:image/x-icon;base64,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NP+Nnaz/zeT+/8zj/f/K4P7/xdv9/7/U/P+ow/r/haj4/3uh9v99o/f/nrz6/77T9f9iW7X/enDs/4yI8P+YmfP/lpfy/4OUzv/J4f3/oLPL/7zT8v+AmcH/eJ3e/4my+f+Ls/n/i7T6/463+v87RU//REtd/05Sav84Y4n/R6X4/0Wl+P88g8L/MjtI/zI7SP81PUz/TVFu/3R8sf9fZY7/T1h5/zM4SP85SF7/O0hd/5G5+v+Tu/r/e4ud/42drv/N4/3/zeP9/8zi/f/I3/3/xNr8/77S/P+cufn/f6T3/3yi9/9/pPf/sMn7/8PZ/P+CjLP/dmzh/21j0v9lYbb/g4y5/8bb9v/M4v7/kqS6/3qZzP+LtPn/irP6/32i4v+Mtfr/jrb6/422+P9ASVb/U1dw/zg/S/8/e7D/Sab5/0el+P89hMH/MzxJ/zM8Sv9KT2n/XmSK/2dtmf9KUGv/TVV1/zI+VP8tNUL/bou6/5G5+v9zjbX/KjI7/7rQ7P/O4/7/zeT+/8zi/v/I3v7/w9j8/77S/P+xyPv/lLP4/5e1+f+sxPr/n7nk/8HX/P/F3Pv/nrHH/7HH3v/J4vz/yuP9/8vi/v/L4v7/h5/B/4+4+f+KtPr/eaDf/2SBtP+Otvr/j7f6/4Kq3/9TWHH/REpa/0hPY/9Ch8P/Sqb5/0mm+f8/hsX/ND1K/0RLYP9RVXL/Vlx8/05Sbv9bYYb/OkRZ/zE4Rv9RXnn/kLj6/3GPvv8tNUP/UF94/7XO8P/O4/7/zeP+/8zi/v/I3f3/wtj8/77T/P+5zvz/tcv7/7XL+/+wxvT/pLzn/8DV/P/E2v3/x9/+/8ri/v/K4/3/yuP9/8rj/f/K4/3/hZq1/5S7+v92m9f/LDpP/4Ot8f+Nt/r/hq/r/5S67v9YXHb/Vlp1/0dOYP9Dicf/S6f4/0un+P9Dj9L/OkJQ/1JWc/9NUmz/REpf/1FVcv9QV3T/O0hb/z1EV/+HqeP/aISx/y43RP87QVb/f5zK/3N/jf/O4/7/zuP+/8zi/v/J3v7/xNr8/8DV/P+70Pz/uM37/7jM+/+5zfv/ssr7/7DK+/+70/z/xdv8/8ff/v/L4f7/yuL+/8rj/f/L5P3/ZV1b/3KFn/8kLT//YH6u/4i0+/95ntv/kbjr/1Numf9bX3v/U1hw/0tSZv9Dhr//S6j3/0un+P9Ppu3/SExh/09Ubv87Q1P/UFVw/09UcP9FUGf/REhe/2iHvP9VbJL/LjdD/0BGXf9VY4L/YnSL/3F8jv/P5P7/zuP+/83j/v/K4P3/xt39/8PZ/P+/1Pz/u9H8/7rQ+/+60Pv/kbP5/4Wr+P+Zufn/wtj8/8Xc/f/H3/3/yuD+/8zj/v+/0+n/Pzk6/ycvQv9LXYL/gqrr/0Zcfv95ndf/aYi6/yYuQv9aXnn/U1lw/0RMW/9DfrH/Tan4/0uo9/9eu/v/QlJr/zpDUf9LUGj/U1d0/0tQaf9NUWv/UWOH/0BQaP8yO0j/Q0lg/0tQaf9VYnP/OT9S/6W2yv/P5f7/z+X+/83k/v/M4v7/yd/9/8bd/f/D2fz/wtT0/4eVrv99jKf/tMz6/5+++v+zzPv/wtj8/8Ta/f/G3f3/yN/+/9nq/v+Uoa//MThR/zM7U/9HXX7/KTJG/2SDtP9zls//JjBE/0JQcf9aX3n/VVpz/z5HVP9Fcpz/Tan4/06q+P9vzP3/PWGC/0hPY/9VWXb/VFh1/05Sa/9DUGj/P05j/zU8Sf9TWXj/TlJu/zA2Qv84QFD/XmZ6/8/l/v/P5f7/z+X+/8/l/v/N5P7/zOL9/83h+v+IkqD/JFFw/xmEv/87kL3/Q2F8/7LG5//C2Pz/w9n9/8Xb/f/G3f3/0eT+/+71/v9eaXn/JS8//ygwQv82PVj/aoi7/3me2f8pNEj/MjdS/2mJvf9dYnz/TFNl/1BXbP9UbYv/T6n4/1Sw+f920/7/TYSw/1dceP9WWnf/S1Bm/zQ7Rf88RFP/WmSG/2xyn/9XXHz/NjtK/zhAUP9MUGn/ssTZ/8/l/v/P5f7/z+X+/8/l/v/F2vH/h4aK/0hKUv8UIzb/E0Rn/x9IXP81iKP/OrXh/yVJYv+ru9X/0Njj/8bc+//N4f3/5Ov2/9DZ5P8rMkL/MTlP/yUrO/8tO0//JzNF/xoiLv82O1b/Iic3/xUbJf9eYn3/VFpv/11hfP9UWnH/V6/x/2zI/P930/7/YbLg/1JWbv9PVWz/TVNp/1NYcv9XW3r/foa8/4GJwv9FTGH/PURV/05Tbv+Fkab/xt/9/6vJ9v+myPz/zeP+/8/l/v9icIH/LzAz/5eaoP86QEn/FBoi/xMYIf8SGSP/isjg/0qby/9WY2//5Ojy/+Lm6v/s8/7/s7i+/1Vc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c/9YdIj/es71/3bO/f9sw/v/c8Tq/1lxiP9dYXv/XWF8/1VZcf9LUGL/UVhu/213nv9/h7j/VFhy/0RKWv9XX3z/YWmM/1VZdv8+RFP/PURU/0xRa/9MUWr/TlFs/zY8Sv87QlT/P0JW/z9Scf86erX/OYnP/zqM0/84hMj/M2uf/ztNaf9UYIP/WGWL/1dojf9keqL/dImp/2+NqP9pbYb/aGyF/2drhP9na4T/ZmqD/2Vpgv9laYL/ZGiB/2Rogf9jZ4D/X3OK/3bE6P950f3/Z7/7/3HJ+v9jmLT/VWF3/1pfeP9cYHz/W197/1ldef9eY4H/hIu//3yEtP9hZoj/TVFm/0lOYf9SV3H/VFh1/1RYdP9KTmb/QEVY/0NJX/82U3L/PH+8/0Oi9v9Co/f/QaP3/0Gj+P8/nvL/NoDB/2CHt/+Pt/b/iK3p/2+WzP9ak8n/O4G+/5240/9kaH3/am6H/2lthv9maoL/Z2uE/2drhP9maoP/ZWmC/2Rogf9gZHv/WV5x/1Jaav9ZhJ7/VZPB/0yEtv9NfaT/RWiJ/0BIUv9RVGf/ZmyN/3h+qv+Di77/c3mi/2hukv9pbpP/bXOa/3F3of9fZIX/Vlp2/1VZdv9MUmv/PFBq/zZtm/87gb3/PYjJ/zyIy/89is//OoXH/zyS2/83gL//OIXI/z2Q1v86icz/OpDc/z6g9/8/l+H/nbXO/87j/v90cHz/am6H/2puh/9hZ3z/aGyF/2drhP9na4T/ZmqD/2Vpgv9laIL/Y2eA/15jef9YXnH/U1pr/1FYaf9PVmf/UFZo/1JYbP9VWnD/UlVp/1VZcP9dYn7/aG6R/3F3oP98hLP/fIOy/2Noiv9OU2v/SV9//0t/q/9QpOX/U7D6/1Ot8v9Jmdn/P4rL/0OPzf9Kls3/SZbO/zh8t/9IqPX/UJ/Q/2PE/P9fw/z/Urb7/2DD/f9yobv/zuP+/87j/v+Yion/a2+I/2puh/9hZnr/ZmqC/2hshf9obIX/Z2uE/2drhP9maoP/ZWmC/2Rogf9kaIH/Y2eA/2Jmf/9hZYH/YWV//2Bkfv9fY37/XmJ+/1tfeP9RVGj/SExb/0tRY/9DSVf/OEBL/0Ruiv9JeJP/R36l/1ykzP9rveT/dNH9/3HP/v9pyPz/bs79/3DR/f9w0f7/ZMT8/0Sk+P9Lk8H/ZrPV/2q+5f9ryvj/asz6/12r0P+lv97/uNX8/8Pc/P/Suq//aGyC/2tviP9nbIP/XGNz/2puh/9pbYb/aGyF/2drhP9na4T/ZmqD/2Vpgv9kaIH/Y2eA/1xfdP9XWm7/Vlls/1JWZ/9MUV//RkxY/0RLVv9MWGr/XmyI/11og/9QV2z/Vlt1/0Z2o/9Mn+f/PnGd/0SIxP9HmN7/R5DL/1Cazf9Xos//Yq7U/5TY9v+l4v3/a8f8/0CLzP8zRVX/MjpG/zpAUv8/Q1j/Qkhf/0ZVbP9uh6z/j6nO/56/8P/Pysf/h4eS/2xwiP9rb4j/V19t/2lthf9qbof/aW2G/2hshf9na4T/Z2uE/2Zqg/9laYL/ZWmC/2Rogf9kaIH/YWV9/2Jmf/9iZYD/YWV//2Bkff9fY37/YGSB/2twk/9tc5j/Vl52/0dTZf9HhLv/T6f3/0SJxP9AeKn/Q4jD/0mh7f9Lp/j/S6X1/0eR0/9bnM7/UZrJ/z5mjf9ES2P/P0Za/zc/T/8wOEX/LDM9/0NRZ/9WaYj/bomw/42kx/+TlqH/0NHT/2tvhv9tcYn/X2Z3/15ldv9qbof/am6H/2puh/9ma4P/aGyF/2drhP9na4T/ZmqD/2Vpgv9kaIH/ZGiA/1xfdP9TVmb/S1Bd/0lPW/9HTVn/Q0pV/0FHUf9KVGP/X2uH/2l1mP9fZoT/SHCa/1u09f9WpNz/S42+/0KCuf9Disb/S6f4/0un+P9Lp/j/Sqb5/0im+f8/h8f/OEBP/0ZMYv9LT2n/SE1n/0lRa/9SW3v/OD5P/0NKWv9nbH3/5OXm/42Qmv9tcYr/aW6E/1NcZ/9obYT/a2+H/2puh/9kaX//X2V4/2hshf9na4T/Z2uE/2Zqg/9kaIH/XWF2/2NngP9kaIH/Y2eA/19je/9gZX//b3WY/4GItv95gKr/aG2O/1lddP9LT2D/PUJM/0dldP91z/n/d9P+/2Wx1f9Kh7P/QH6z/0qk8/9Lp/j/R5jf/0OIwP8/dqP/R01k/ztDU/8uNT7/YnaZ/4mXtf+Ej6j/f4uh/4mXrP9kaXX/m56p/+Dg4f9tcYb/bnKK/1xjcv9cY3L/bHCI/2tviP9qbof/WmBx/1ZaaP9maoP/aGyF/2drhP9qbon/aW6K/1xjd/9VXW7/WWF0/2VtiP9vdpf/Z22K/1VZbf9JTVv/QUZP/z5ETP8/Rk//QUhT/0hQYP9WeZD/d9P9/3fT/v920/3/Y6rN/0h3lP9Disj/RI3N/125+/83VXD/QEVW/09Tbv9JUmv/RFJm/5Oy4//I4P3/z+X+/87j/v+ztbj/cHeN/9fS0v+jlpb/b3OL/2puhP9VXmj/Zmt//2xwiP9rb4j/am6H/11jdf9PVV//Wl5v/2drg/9obIb/cXaV/3uBpv+BiLL/fYeu/2Vvif9TWmv/UVho/1BXZ/9PV2f/UVhp/1NZbP9YXXT/XWF8/11ifP9VWG//WYmg/3jT/v951P7/ktz+/4rY/f9Ro+L/V7P5/1GWw/8+Z43/P0VV/3CJsf9VXnn/YWqQ/z5JWv9+msb/vNj8/87j/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=', 'https://iqdb.org/?url='],
   ];
  
   var menu = document.createXULElement("menu"); 
   menu.setAttribute("label", "Поиск изображения в ...");
   menu.setAttribute("class", "menu-iconic");
   menu.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAVYklEQVRoQ7VaCXgUVbb+q3rf0unOvpAQyEaIwAABkcUgCAYUUQYQB3HMOOgTRgdmFWTcQAFHh0FFWR+DiMoqIKBsWViFAEmAhEAIZO+QTjrp7iS9Vr1zu9MaAXmMzpTfpdNV1bfOf85//nPuLTn8Fw9RFHmaXuQ4TvxvPYb7uRN3Gumbhwz1jhg5Mjtz+PC0NWvWLK+rq6ti5zvvYdeFn/u8m3//swHcNKH+8OGcwpEjM7tbrTbbypUff3b06NEPd+3aVdwJJAD0PxaRnwtAN3/+/IXtdntT0fnzJ7Vqdb/PN29Zsn//frdUJpONH5cFs7nJ88knG7YTiPdzc3OPBgCzqPwnIvKTANDD6dmcqFQqRzc03DgQFKSDg3zq7HBBLuXFQ/v3c3l5OWJycrIwevRoSUJCAuz2NmzduuWbVatWvXH8+PETgbyguSSMZT81V34SgIAXExMT5xZduPBO5alDHrHhijQoOYPjtSFccFgklJogNDWZif8Q1RqNoFErJBwnQVtbm5iTc7hg7dp1y51O55Z9+/Y5u9KwE5CPcXcToZ8M4LXXXuOLCws/2rpjx8xz7z/nVZd+KlHF9gQX0QvSlCxo0x+BNigYPM+ECDA32SiJBa9cykl0QUG+c/lH8ku2bd2yqbXJkqvR66+uWLHCdHOSsmjTOZ+a3S5K/xaATjVh3PXQZDICsW/eK6+MuvrZfG90t0iJOiUT0ogkkiONzw5R8OLg8XpUVDvAS+WIMnoxZliE2NpcK0okGtEQFk1RATooBrW11dZLJRfKyspKLpwrKDh1vqSosLKyrqy1tdVyJ+W6I4Cu6G8OZ48ePYZ98MGH/8rKGptAFvtUlLnIdKMNlTWtsLZ5caHc4XOc3SHBp7tNiAvrwFcrM2Fv2grRkQOvECN4hRBBruwhUWh6cBp9d/Ayhc9eprf1psbG0ovnL5SWnD9VV2f6ViqVFvbp06dqypQp3gCoWwAEdJ1pelfkM2fOVNvt9oGUkA9mZo4YPXrUyP7gZPIOcl+tyY7yaxZcrWmDxUqP5mXYcbgRDRYB0yd0x1e5DbhYaoNO58K5zUMRF9sEmewLiF4nPK5WuNvtNJyiyyYVPA4jmRANiSpRotCncGpjd8hVarSRQFhbmpzTpk37G6nZO8xhzKk+AD9WaGbMmBEnkctH9O/bd+xIqk690/vGs/s9BK24pB6Xr7Wg2tSBVrtAHpOQgSryKo+vjpjxq/ExKK/xYPn7VwCjkjDxEOwd+OLvPTH5oXC4vfsgl7fRbCyH2WcLGWKBYG2C19ICl7kNrhZRdNt1Qps9SJT3mYWYPiOk5Lg1NbX1c4lrNp8advUycVpeWnqlf3R05Ohhw4Y8OGzofQPCI6J8hG5obMP5UpNYUt7kbWh2cQ63hJdKZZxSqQDHS2DQK5H9WDxFwIVTF2345ehwnClzwGpzoqCsDf/8pB7zn4/H4CQvkuO0kCuvQC6rJ4IRzcRWIiFRnSMQXhoOAuSg8zY7YLWjtbgSHX1WiNrkTMREGN+wWu2vdTqe4yIiIjRjxowZl5aW9tCI4feNGDCwf6JCoYXbI6KkzESeNnnLK61is9XFeyHjFWSwWqWEUiEjw3mf8W4vh149gzB1TOR3/hAEkRToe/9UmT2IC5Wipr4FKoUESlkLNDrm/VYazTTMBOQGgWDRaISnpg6ehhbwHRThejo15F/QR8SJR/JyLq1avfpNsncLOdzDdevWbUJBwZmd4eFhqKlrRvGFerGopNFbWdfG2Z0SXiKTcmq1HBqNgjwmg0Qi8Q+plLhO6sbxvr+jI7VkmBT3JGkRYaSIqDkQBrjIEZZ2ER5Sw5JKF+XDDcyeaEBQy2m0NVch+YGppFblNA0TGwsaTn2Fit2H0HHdBK1MQGSCEp6YDIRM2o66umpER8dArw/C5s2bjz3zzDNTmIt+tXfv3n8MHz7M8OJfv+FqG0WJTq+Cz2gtGU2elsqk/kGGMmM5AsC8rlHLiMdS9ErQQauR48X3azFrYigmZQZDq6RcoXy+3iQiLYojinAY9pdGHM9txCevBWPKMAk2znoU05bvgpLoB6EBBe/PwcWte6CQA/HpYUgYGgdDrAxmx2DEjlqGh8dnkR0K744dO7gNGzbUPvvss08xAMPnzZu/YtGihelvLj0o5Be08sYQLYKCVJCRR2UMABkpY0MmIc7yCDOqMDjdAKNeThPK4PIKSI2RYdtxGx4ZRPyWcnB4RSglHFwE4i+ftGHiEAU25DixfpcNv8lsx6o/9cDqZ8dgwJiH0X/Ki8hf+CgKt+6CMcaIlMEJ6DGqGwwpIfDeqMIN+wSED5yNtOQemDP3j+ILL7zA9e3bd1dxcfECTqVSdcvIGPRuXt7hyVt3FgtFl9r5CQ8lYm9eHWobncRTZqS0MxKMPjxiI9QYkKqH2erF5XovHhsahEi9v+Kyg/Cgwiygkry/9rALX591IVgrIQryqLNwSNI049tlMchZtQgO01UMzJqAL377GHSRCvS+T0TSmHsRmjHGlxttFy7Cof0DWmTpmPL4ODH/yFGuoKCgIzMz829hYWEfswiog4KD/3ixuPB1gdPC6ZXgzIUWfH2kHrogpS8CnJT6LUpWBUXEECRHWnc1aigpP/ragoRoDXbMi8WJchcqGoHBiVI0Ux6SYOHdPS6U1QuICJYS5XiSa46cIYGj1Y7D8+Qw2s8ib8UCaNwmVF0oQ99RQ5EyxgytrgyC7GHIdJFor6mCJm0FDp4ow9H8Q+LixUs4KmRntmzZ8hLZfozr7Cwf//LLL1dnZY0zbNp9Rbxu8nItNi88RBcpETKIjE7qpoGNWk5Lm4h+iWrsPm3H/+ba8fbTkRjdR41Jy1sw5T4dUmPlRDMRJquII5dFWB08rjXyPkViXQ0FEI3NbizNsuL5MWp89vz9sJefQVhSL4QkpKK27Cyaq6vBuTxQKSVQRcVh0pqL2LJtJ9J6pSAkNFTo1avXP6nHestms5kDOtd3zpy56957793+y9edFWS6YL53agg27KyCWqfES5Nj0TNahRstbuw4aUO1xYvDJQ60eXi0ugikTE5JLIVAFXjRRAXOk+xRCiCZknfZIQ4NrZxPsNjBKg9TpaxoSuZZ4fhq0Uxc3bsREp0WNeWNEIh+Our1tKR6EqcTxj5DMWllPgpPnxCH3DeUe/XVV6+98cYbc0hCd9PwV2I6wjIyBr93/PiR6WfPm4RjJU7eRp6rMLkwYoAB2Q9F+G46VtqOY5cd2HfBiYsmgVSI5IJcKlfKMDZdCS9FTEIJXFzPoV8sUGLiUEZDRbcxSQ08zEV/h7iakftnA0oObsb6558gzyphiPQgLCoYaqUSerER0jYPtKP/gLRpi+G0NdEEEvyif/9NDSbTKw6H41rXSizXaDQvnj17ZnFcfIKkxeYRN+xv4upbvHhhYhQlHwdrh4jcUgeuNgr45JQTKhWpk0+lJL6CptdIIHBSNLRRkgdTg0D9qt3FUcGiaFDr4euFO0GQHbCY27HlSQH36Bvx8qh7oOOdiI/hkT5MQLfeCTB6nGgvqIF3wgboB04TtXKR2/jppmZqb/5KU22g4by5lRi/ffu2dY8++lh4/Q2byMtVXLtToNzlyMkcrjR4cIN4/d5hAkFKotNSXZBLqDZISF6J33QPT/WBVmQ+6fQ18fQPUyTWpgZW8ywSEqqBUtGD7EQLfjfGiLcmDcfVkycgVcoRpvQivbeAUZlUW0qsaJ36DbRDRotyr5sb/eCDh06ePPkHt9tdFFgVBpKYOSj9pZdeWrds2bKMsoomISpCzwcRrz1EZjMlNJPFL4vc+OiYG0E6ZjwrbsR/OQ0C6S/M/oLFiM4MpoewddV31GHn1AoR3ShCTdTqZCgaseTxcGxc+Bdc+nwp1JEa3KjpgJpo2SNKQLqgQs8PzsKYloxjeXnOkQ88sFAQhOU0jfV2AML69eu3tKDg9K9vNHWIEqmc8/BSFFW5YemgPp+8v/qkB3VEER3Rxed98jwDwTzKjGerE7YF5MtX5nWGhf5jqkSrIB+NdEoRE9MEDIrlcbK0FTP6a1F96gA2/s849EqRo52Uro16OMHhRkRyb0xdc1IM0mk5ahuK1q9f/3syPK/rPlPXblSuUChmFRcVLe3RM1G67qBFjIvWcrWtIiotInEb2HROJO4z4/2el7EIUNL6aEa8pg//2o88z1bqLBLsAUx5GO8ZpaQSEZFBIrIHcpC7HOghc8Igb8e7E/silgpcYi81qgtdqLW40H0UtRr/+BLXr14R+w0Y+KHo9S6kNXUDm9Lvou+FoVOMMJYW22uys5+J3X7MLAxJM/CNJHm7ij3YXSqiiFaseqqoPPGceZ9xnycAErKcsPhmZBxXS/3u9xlO55nhPoD0N/t0EcCxtPKc3FPA6RIzZgwLw5rnxsF68RvcnyRHy0ngGi1+Yp78szhuzhJu0cKF1a8sWDB38uTJO6iA/WChFYhAAFHyE9Omrfxs06bMU6UW4cBVBS9SkjZ3cFhfIMBDblQoiDKkLDIGglGHeZYVKbKZBAkDYwTYnSKqWhgAVsD8hrNizoxnn92CRUxNFykqHPacaMTiR8JxYv1bOLpiPsZ200FHLchlpx1xr38upox6jPtFeu8tl8vL55F/ygPcD3j8BwBonatva29/s7qy4nfVTaL41tceLipSjfPUFuwp4xCkJoN8HmcAAl6lPKDvMUECwtQi7gkH8io5H2gGiB2suWP3U96jV7iA7gYgjhLZ7KRmz2LDpBQprOUF2P77+3FfTBQSNV5cb28U4xde5KqtLsegAf3+3L1799XXr193/BgA34MoRBIK0TNnzhQs79evv+rN3XbRo9ByO0sFlJN0ahSM734ZZLxnFGGU6WkQMXuQF+eoaNGaHhduUN9D8yUaBMiI8+YOyhe6PyVURIKRKRCPCB0QpSU6tXYgQdqKhAgptj3fB0kGKZIFExpCo8TUVy9zX2zZXJWdnT3D4/Hk3Wz87XKA9fzDlixZunbu3DnJG4+1CvkmHb+RdjbZ6pN6Oz+XfbQhA3QCOqidaHNTh2kUfO1Dh8dPJ1rHkDECEggcM562tXwqRdipaHmgprVwsNQFDRWwKErqqNgo5C/+JYIv7UGs4IS5zzjhF/P28HPnzDnxj2XLnqafXbkjgC4X4x7Kyvpg3969j5y6bBM+OKvkOYq9ihJz52VSDkYdH69F9CY6VLXycFPCMo9rKDdCVCK1FBwGRgF9IigXSMGMMi+oEIFzOxGi8MBI94TqOBIEHgrqTr1UqjmVEZWHPoZr6SzoKUqOCX8U0rLf4R8cef8XBWfOzWaN211FgK2ROzo6Xq68XjEfUh2mbPJgcLIKFbTiy7tOCkN9jZN0YFicgFDi/PEaCZJDiCqUyAIZHkI6T9URCRo3BGrGlKILcTovYoJ5RBI9NGoqgOQBL93jdpMwUKkWqYPjFEo4rl1CyxODICbRfM+tQfj9TyElPvLtxOTUN0+cONFxVwA6b5p68ODBj0aNGhX86MfNYlxcMNdOnDhjYlwW8XCSiMdTgdPUdR6ooKpJqiITvXBT8dFzLvQMckMnFxBFRncLldMmgNS3xciWmMxg2s2i3GFVmj4piVjd8PVKtEytevYBWFoKkbz8CGzqKE96SuIL1HWuZZ1nQHm6fv7Yzlz/l+fNX/vWooX9Xv6sWojvGc0PjicpLaTFiZbWtt1oyeim9S4tappaiceiA+FKN2L1QGyIFKG01FRSo8eKgJsSw8uMZNnurz2+HGFGU1vgHwTEpwZSGRzNjbBVXRbjBgzlDuTk3Xj8sYkz6Cff3M77tyRxl5siMgYNeu/bE0ef/PRQpVAjieUzeipwyeSBXuKFjfZ6FJRoBrkLCSFEGx11o7RuUFLr6aXeh/VPzKaAwd/Xza4AKOlZJAgAA+Q/WG1gKiEXgrVqfsnit84vWLBgOl0ovisAgWmysrIUBw4c+H3JhfOL2r1yyf4rKsSGqcC77NDL3QijKBh1tBNHfGa6So+lqkwrMdYu+3qHW0t8wPMBMH7vewlEp/X0G5YL7BxdE0JCwvinnvrV3m3bts2k39b+WwA6gTy8cuXq1eMffiSyrMIsGnQyjjVxjBo8GS2Qp/2LFJJHqspKthfSafkPeclklSD6mlQ/Ovbd6/XAw/YoAzzopJV/Dk6UUYtLWz0fms3ml2n4txFv87LwlhzocmOv6dOnr176zrtDbVaLIJHISDj9csk6Szb8BlELQcbL5TI/FQIdqO+LPyb0JofywAuX08XKCccSlx2sBQm0IQE6eSkKMsoFc5NZHDig/58GDx78T9rM9fwUAIbU1NS3d3y58zkC72vsmZIwowPDv3PI0SYY0Yuu+fp/upF27mi7RknAlHC5XLh27ZpAr8xovykEHe3tbGePXk8piO4SioKH5NQ/fM0goaPVIU6f+tY2fvy4bDq1LUDt233+mAqxe6UKhWzm9u0730tN7aVwOJ2+GHYFEPAiPZBCLuNUBERKRlmtVly6dMlz5Ei+PScnx3L69Gmz0Ris+vWvs2MnTZqsj4iM5KgtJqNdosS3gRroXNkKT4qY6Eh8+OGKa7Nnz5pGz/j2x7wfYN+dAGa+/vrr67J/89sEi4XRiOqvj8+cDwytH2A0BFMCy2AyNaCw8JwjNy/Xlpeb21RaWlpP3mXviWl/HZU0qH1DRnR0dDpRM37qE9MM8fHdae+2A+3t7aJOp+NmvfB8TXV1dfu9994bUlRcXHAkP382/eaWDrSrwbeNQBfECWPHjl3x8cpVDxEAL1FColKqoCBOezxuei1UK5w9W9Cem5PTSpWykb7X0uTXaVxmhsvl8mu0i2xKSkqyVVRUKM6cOdODzg+ica/RaOgzecrU7gQmZODAQdJjx446R4964NNOwGwb5CqNTTSaf04EdOHh4Qty8/L/pNcHg95XoeLqVffx48fs+UfyLEWFRQ3Uo1TTQyqY0RT+KxSNKoPBYKa39O23Cy292VSQl+PpDWUGXR9CW5t9nn766VQ6V7tnz56/hoaGHqeIaCmnPCTnzTcvYG6e8045APYmksb0efPn/725uZnLy81puHSpzEQeYZQoZ0aTwRVEpdqUlBQLeZjq8/dHp+fYCZ8+BejHTgwYMEB28eLFWNrf6U9fh9EwUy6tpdy45U3l7RwROHdHAOwmMjCDtjGYGjDRLmVeply4rlarG2gXw3ZTj9J1vu/q620M+G5NS9fYsoe9GWHn6gnkdz3P3fxPIv8vAJqUlh2IocEoQdu37J3QD47AHHcy+LZOvBO37+T1rtfuBsAtc7EHs5N346G7MeTnzPd/kwOfrMq31sMAAAAASUVORK5CYII=");
   contextMenu.insertBefore(menu, copyimage);   
   menu.onclick =e=> { e.target.nodeName == 'menu' && search(array[0][2]); setTimeout(()=> contextMenu.hidePopup(), 20) };
   addEventListener("popupshowing", ()=> menu.hidden = copyimage.hidden, true, contextMenu);
   addDestructor(()=> menu.remove());

   var menuPopup = menu.appendChild(document.createXULElement("menupopup"));              
   array.forEach(m=> {
      var mItem = menuPopup.appendChild(document.createXULElement("menuitem"));
      mItem.setAttribute("label", m[0]);       
      mItem.setAttribute("image", m[1]);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.onclick =()=> search(m[2]);
   });
   
   var mItem = menuPopup.appendChild(document.createXULElement("menuitem"), copyimage);
   mItem.setAttribute("label", 'Искать во всех поисковиках');
   mItem.setAttribute("class", "menuitem-iconic");
   mItem.setAttribute("image", "data:image/png;base64,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");       
   mItem.onclick =()=> { array.forEach(m=> { search(m[2]) }) };
   
   function search(finder) {
      gBrowser.selectedTab = gBrowser.addTab(finder + encodeURIComponent(gContextMenu.mediaURL), {
                                             triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()});
   };
})();


Код в расширении:
скрытый текст

Выделить код

Код:

var SearchEngines = {
  Google: ["http://www.google.com/searchbyimage?image_url="],
  Bing: ["https://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl="],
  Yandex: ["https://yandex.com/images/search?rpt=imageview&img_url="],
  TinEye: ["http://www.tineye.com/search/?url="],
  SauceNao: ["https://saucenao.com/search.php?url="],
  IQDB: ["https://iqdb.org/?url="],
};

function openUrl(url) {
	browser.tabs.create({url:url, active: false});
}

// Create the Right Click Menus (and separator).

browser.menus.create({
	id : "All",
	title : "Искать во всех поисковиках",
	type : "normal",
	contexts : ["image"], 
	icons: {16: `i/All.png`}
	});

browser.menus.create({
	id : "separator",
	type : "separator",
	contexts : ["image"]
	})

/*
for (var Engine in SearchEngines) {
	browser.menus.create({
		id : Engine,
		title : Engine,
		type : "normal",
		contexts : ["image"],
       		});
	};	
*/

// https://forum.mozilla-russia.org/viewtopic.php?pid=801921#p801921
for(var id in SearchEngines) browser.menus.create({
	id, title: id, type : "normal", contexts : ["image"], icons: {16: `i/${id}.png`}
});

// Menu Actions:

browser.menus.onClicked.addListener((info, tab) => {
	search = encodeURIComponent(info.srcUrl);
	if (info.menuItemId == "All") {
		Object.keys(SearchEngines).map(key => {openUrl(SearchEngines[key]+search);});
	} else {
		openUrl(SearchEngines[info.menuItemId] + search);
		}
	});


Выложу тут расширения тоже, вдруг пригодится кому.
скрытый текст

Подписанная версия
Поиск изображения-1.0.6-fin-signed
Неподписанная версия (если кому захочется заменить иконки на свои)
Поиск изображения-1.0.6-fin-unsigned

upd Почему-то при клике на картинке двоит меню, это я где-то напортачил? Выяснил - это происходит после редактирования кнопки, в которой содержится в том числе и поиск по картинке. Похоже, после сохранения она повторно инициализируется.

скрытый текст
ryqjlptm.png

Отредактировано kazarin (10-10-2022 23:18:58)

Отсутствует

 

№1657210-10-2022 07:57:28

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 105.0

Re: Custom Buttons

Кн.Поиск изображений:
До 101 включительно

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname/%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJWQB9QgCGZACCSACPRgB1TwCDYgB+UQCMVwB3WgCNRQCBTgB2WACDagAAAACRSgD/mRf/pyj/pAr/mSD/nCL/ph//nBz/mhv/mhH/mRz/mhn/mif/oyH/nBxxUAD/jhP/hwr/jwX/hQH/iQj/fgD/hQv/ggH/jgftgwDofgD/iAP/iQb/fQH/igb/gwz/iAL/jxz/jxj/kA//jhH/zH7/15z/y5f/1Yv/6pT/nirVZwD/hQj/iAX0fwD/hgD/lg//mA7/kQ3/mBT/3YL/ulv7WQDJSQDfYQD/giD/zKX/ty7yhQD/hQf/gAD/ihD/oBX/nRr/lhP/t2P/wnyjQAC6UQC1VQC7UgDMZQD/dAv/3LjldQD/igL/hgv/kgD/nRf/oyf/mw3/0ZnfZQCGPACmQQDBSwC2RgDDTADTVQD/t3n/nDr/hAL8hQD/hQf/piL/ohv/nR//3m2sYAB/LACaKwC3QwCySACxRQDcUgD/tln/pCr/iwH/hgD/iQH/pB3/qS3/niL/y33kcAB0LwBnJwCEOgCfTACgSAC7TAD/uG7/nRz/hAj/iAP/iAD/rC//rS7/qxj/uTz/xpdhLQBwKgBsLABvOACXNwDnXQD/2qf/lgj/mET/t2r/gxP/tTf/tif/qTP/riD/1Hv/2Xa1WAB/KgBuJgD1cAD/3Zj/r03/mwP/x3f/+OT/jAwAAAD/wTn/ty3/rzv/syb/uV//4qX/6p//4q//24X/qzL/oBP/lwr/kQz/igIAAAAAAAAAAAAAAAAAAAD/tzT/oyf/sSn/sCL/pyj/mx7/mSX/lAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sSr/riX/qTj/qRf/oxH/pBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA8A8AAPgfAAD//wAA%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0A/*Initialization%20Code*/%0A//%20%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E%20%22%u041F%u043E%u0438%u0441%u043A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u0432%22%20%u0432%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u043C%20%u043C%u0435%u043D%u044E%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0439%2C%20%u043E%u0442%2031.05.2019.%20.............%0A%28%28%29%3D%3E%20%7B%0A%20%20%20var%20copyimage%20%3D%20document.getElementById%28%22context-copyimage-contents%22%29%3B%0A%20%20%20var%20contextMenu%20%3D%20copyimage.parentNode%3B%0A%0A%20%20%20%20var%20array%20%3D%20%5B%0A%20%20%20%20%20%20%5B%27Google%27%2C%20%27https%3A//www.google.lv/favicon.ico%27%2C%20%27http%3A//www.google.com/searchbyimage%3Fimage_url%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27%u042F%u043D%u0434%u0435%u043A%u0441%27%2C%20%27http%3A//yastatic.net/morda-logo/i/favicon_islands.ico%27%2C%20%27https%3A//yandex.com/images/search%3Frpt%3Dimageview%26img_url%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27Bing%27%2C%20%27https%3A//www.bing.com/s/a/bing_p.ico%27%2C%20%27https%3A//www.bing.com/images/searchbyimage%3FFORM%3DIRSBIQ%26cbir%3Dsbi%26imgurl%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27Tineye%27%2C%20%27http%3A//tineye.com/favicon.ico%27%2C%20%27http%3A//tineye.com/search%3Fpluginver%3Dbookmark_1.0%26url%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27SauceNao%27%2C%20%27https%3A//saucenao.com/favicon.ico%27%2C%20%27https%3A//saucenao.com/search.php%3Furl%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27IQDB%27%2C%20%27https%3A//iqdb.org/favicon.ico%27%2C%20%27https%3A//iqdb.org/%3Furl%3D%27%5D%2C%0A%20%20%20%5D%3B%0A%20%20%20var%20menu%20%3D%20contextMenu.insertBefore%28document.createXULElement%28%22menu%22%29%2C%20copyimage%29%3B%20%0A%20%20%20menu.setAttribute%28%22label%22%2C%20%22%u041F%u043E%u0438%u0441%u043A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u0432%20...%22%29%3B%0A%20%20%20menu.setAttribute%28%22class%22%2C%20%22menu-iconic%22%29%3B%0A%20%20%20%0A%20%20%20%0A%20%20%20menu.onclick%20%3De%3D%3E%20%7B%20e.target.nodeName%20%3D%3D%20%27menu%27%20%26%26%20search%28array%5B0%5D%5B2%5D%29%3B%20setTimeout%28%28%29%3D%3E%20contextMenu.hidePopup%28%29%2C%2020%29%20%7D%3B%0A%20%20%20addEventListener%28%22popupshowing%22%2C%20%28%29%3D%3E%20menu.hidden%20%3D%20copyimage.hidden%2C%20true%2C%20contextMenu%29%3B%0A%20%20%20%20addDestructor%28%28%29%20%3D%3E%20menu.remove%28%29%29%3B%0A%20%20%20var%20menuPopup%20%3D%20menu.appendChild%28document.createXULElement%28%22menupopup%22%29%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20array.forEach%28m%3D%3E%20%7B%0A%20%20%20%20%20%20var%20mItem%20%3D%20menuPopup.appendChild%28document.createXULElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22label%22%2C%20m%5B0%5D%29%3B%20%20%20%20%20%20%20%0A%20%20%20%20%20%20mItem.setAttribute%28%22image%22%2C%20m%5B1%5D%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20search%28m%5B2%5D%29%3B%0A%20%20%20%7D%29%3B%0A%20%20function%20search%28finder%29%20%7B%20gBrowser.selectedTab%20%3D%20gBrowser.addTrustedTab%28finder%20+%20encodeURIComponent%28gContextMenu.imageURL%29%29%20%7D%3B%0A%20%20%0A%20%20%20var%20mItem%20%3D%20menuPopup.appendChild%28document.createXULElement%28%22menuitem%22%29%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20%27%u0418%u0441%u043A%u0430%u0442%u044C%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0430%u0445%27%29%3B%0A%20%20%20%20%20mItem.setAttribute%28%22class%22%2C%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20%20%20mItem.setAttribute%28%22image%22%2C%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg%3D%3D%22%29%3B%20%20%20%0A%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20%7B%20array.forEach%28m%3D%3E%20%7B%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTrustedTab%28m%5B2%5D%20+%20encodeURIComponent%28gContextMenu.imageURL%29%29%20%7D%29%20%7D%3B%0A%20%20%0A%7D%29%28%29%3B%0A%0Avar%20style%20%3D%20custombutton.buttonGetHelp%28self%29.replace%28/id/g%2C%20_id%29%3B%0Avar%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28style%29%29%3B%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%20%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5Bmenu%5Blabel%3D%22%u041F%u043E%u0438%u0441%u043A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u0432%20...%22%5D%3A%3Abefore%20%7B%20%0Abackground%3A%20url%28%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJWQB9QgCGZACCSACPRgB1TwCDYgB+UQCMVwB3WgCNRQCBTgB2WACDagAAAACRSgD/mRf/pyj/pAr/mSD/nCL/ph//nBz/mhv/mhH/mRz/mhn/mif/oyH/nBxxUAD/jhP/hwr/jwX/hQH/iQj/fgD/hQv/ggH/jgftgwDofgD/iAP/iQb/fQH/igb/gwz/iAL/jxz/jxj/kA//jhH/zH7/15z/y5f/1Yv/6pT/nirVZwD/hQj/iAX0fwD/hgD/lg//mA7/kQ3/mBT/3YL/ulv7WQDJSQDfYQD/giD/zKX/ty7yhQD/hQf/gAD/ihD/oBX/nRr/lhP/t2P/wnyjQAC6UQC1VQC7UgDMZQD/dAv/3LjldQD/igL/hgv/kgD/nRf/oyf/mw3/0ZnfZQCGPACmQQDBSwC2RgDDTADTVQD/t3n/nDr/hAL8hQD/hQf/piL/ohv/nR//3m2sYAB/LACaKwC3QwCySACxRQDcUgD/tln/pCr/iwH/hgD/iQH/pB3/qS3/niL/y33kcAB0LwBnJwCEOgCfTACgSAC7TAD/uG7/nRz/hAj/iAP/iAD/rC//rS7/qxj/uTz/xpdhLQBwKgBsLABvOACXNwDnXQD/2qf/lgj/mET/t2r/gxP/tTf/tif/qTP/riD/1Hv/2Xa1WAB/KgBuJgD1cAD/3Zj/r03/mwP/x3f/+OT/jAwAAAD/wTn/ty3/rzv/syb/uV//4qX/6p//4q//24X/qzL/oBP/lwr/kQz/igIAAAAAAAAAAAAAAAAAAAD/tzT/oyf/sSn/sCL/pyj/mx7/mSX/lAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sSr/riX/qTj/qRf/oxH/pBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA8A8AAPgfAAD//wAA%22%29%21important%3B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

И для 102-105

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname/%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJWQB9QgCGZACCSACPRgB1TwCDYgB+UQCMVwB3WgCNRQCBTgB2WACDagAAAACRSgD/mRf/pyj/pAr/mSD/nCL/ph//nBz/mhv/mhH/mRz/mhn/mif/oyH/nBxxUAD/jhP/hwr/jwX/hQH/iQj/fgD/hQv/ggH/jgftgwDofgD/iAP/iQb/fQH/igb/gwz/iAL/jxz/jxj/kA//jhH/zH7/15z/y5f/1Yv/6pT/nirVZwD/hQj/iAX0fwD/hgD/lg//mA7/kQ3/mBT/3YL/ulv7WQDJSQDfYQD/giD/zKX/ty7yhQD/hQf/gAD/ihD/oBX/nRr/lhP/t2P/wnyjQAC6UQC1VQC7UgDMZQD/dAv/3LjldQD/igL/hgv/kgD/nRf/oyf/mw3/0ZnfZQCGPACmQQDBSwC2RgDDTADTVQD/t3n/nDr/hAL8hQD/hQf/piL/ohv/nR//3m2sYAB/LACaKwC3QwCySACxRQDcUgD/tln/pCr/iwH/hgD/iQH/pB3/qS3/niL/y33kcAB0LwBnJwCEOgCfTACgSAC7TAD/uG7/nRz/hAj/iAP/iAD/rC//rS7/qxj/uTz/xpdhLQBwKgBsLABvOACXNwDnXQD/2qf/lgj/mET/t2r/gxP/tTf/tif/qTP/riD/1Hv/2Xa1WAB/KgBuJgD1cAD/3Zj/r03/mwP/x3f/+OT/jAwAAAD/wTn/ty3/rzv/syb/uV//4qX/6p//4q//24X/qzL/oBP/lwr/kQz/igIAAAAAAAAAAAAAAAAAAAD/tzT/oyf/sSn/sCL/pyj/mx7/mSX/lAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sSr/riX/qTj/qRf/oxH/pBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA8A8AAPgfAAD//wAA%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0A%28%28%29%3D%3E%20%7B%0A%20%20%20var%20copyimage%20%3D%20document.getElementById%28%22context-copyimage-contents%22%29%3B%0A%20%20%20var%20contextMenu%20%3D%20copyimage.parentNode%3B%0A%0A%20%20%20%20var%20array%20%3D%20%5B%0A%20%20%20%20%20%20%5B%27Google%27%2C%20%27https%3A//www.google.lv/favicon.ico%27%2C%20%27http%3A//www.google.com/searchbyimage%3Fimage_url%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27%u042F%u043D%u0434%u0435%u043A%u0441%27%2C%20%27http%3A//yastatic.net/morda-logo/i/favicon_islands.ico%27%2C%20%27https%3A//yandex.com/images/search%3Frpt%3Dimageview%26img_url%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27Bing%27%2C%20%27https%3A//www.bing.com/s/a/bing_p.ico%27%2C%20%27https%3A//www.bing.com/images/searchbyimage%3FFORM%3DIRSBIQ%26cbir%3Dsbi%26imgurl%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27Tineye%27%2C%20%27http%3A//tineye.com/favicon.ico%27%2C%20%27http%3A//tineye.com/search%3Fpluginver%3Dbookmark_1.0%26url%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27SauceNao%27%2C%20%27https%3A//saucenao.com/favicon.ico%27%2C%20%27https%3A//saucenao.com/search.php%3Furl%3D%27%5D%2C%0A%20%20%20%20%20%20%5B%27IQDB%27%2C%20%27https%3A//iqdb.org/favicon.ico%27%2C%20%27https%3A//iqdb.org/%3Furl%3D%27%5D%2C%0A%20%20%20%5D%3B%0A%20%20%20var%20menu%20%3D%20contextMenu.insertBefore%28document.createXULElement%28%22menu%22%29%2C%20copyimage%29%3B%20%0A%20%20%20menu.setAttribute%28%22label%22%2C%20%22%u041F%u043E%u0438%u0441%u043A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u0432%20...%22%29%3B%0A%20%20%20menu.setAttribute%28%22class%22%2C%20%22menu-iconic%22%29%3B%0A%20%20%20%0A%20%20%20%0A%20%20%20menu.onclick%20%3De%3D%3E%20%7B%20e.target.nodeName%20%3D%3D%20%27menu%27%20%26%26%20search%28array%5B0%5D%5B2%5D%29%3B%20setTimeout%28%28%29%3D%3E%20contextMenu.hidePopup%28%29%2C%2020%29%20%7D%3B%0A%20%20%20addEventListener%28%22popupshowing%22%2C%20%28%29%3D%3E%20menu.hidden%20%3D%20copyimage.hidden%2C%20true%2C%20contextMenu%29%3B%0A%20%20%20%20addDestructor%28%28%29%20%3D%3E%20menu.remove%28%29%29%3B%0A%20%20%20var%20menuPopup%20%3D%20menu.appendChild%28document.createXULElement%28%22menupopup%22%29%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20array.forEach%28m%3D%3E%20%7B%0A%20%20%20%20%20%20var%20mItem%20%3D%20menuPopup.appendChild%28document.createXULElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22label%22%2C%20m%5B0%5D%29%3B%20%20%20%20%20%20%20%0A%20%20%20%20%20%20mItem.setAttribute%28%22image%22%2C%20m%5B1%5D%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20search%28m%5B2%5D%29%3B%0A%20%20%20%7D%29%3B%0A%20%20function%20search%28finder%29%20%7B%20gBrowser.selectedTab%20%3D%20gBrowser.addTrustedTab%28finder%20+%20encodeURIComponent%28gContextMenu.originalMediaURL%29%29%20%7D%3B%0A%20%20%0A%20%20%20var%20mItem%20%3D%20menuPopup.appendChild%28document.createXULElement%28%22menuitem%22%29%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20%27%u0418%u0441%u043A%u0430%u0442%u044C%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0430%u0445%27%29%3B%0A%20%20%20%20%20mItem.setAttribute%28%22class%22%2C%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20%20%20mItem.setAttribute%28%22image%22%2C%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg%3D%3D%22%29%3B%20%20%20%0A%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20%7B%20array.forEach%28m%3D%3E%20%7B%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTrustedTab%28m%5B2%5D%20+%20encodeURIComponent%28gContextMenu.originalMediaURL%29%29%20%7D%29%20%7D%3B%0A%20%20%0A%7D%29%28%29%3B%0Avar%20style%20%3D%20custombutton.buttonGetHelp%28self%29.replace%28/id/g%2C%20_id%29%3B%0Avar%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28style%29%29%3B%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%20%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5Bmenu%5Blabel%3D%22%u041F%u043E%u0438%u0441%u043A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u0432%20...%22%5D%20menupopup%20%20%7Bpadding%3A%204px%200px%203px%200px%20%21important%3B%20margin-left%3A%20-1px%20%21important%3B%7D%0Amenu%5Blabel%3D%22%u041F%u043E%u0438%u0441%u043A%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u0432%20...%22%5D%3A%3Abefore%20%7B%20%0Abackground%3A%20url%28%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJWQB9QgCGZACCSACPRgB1TwCDYgB+UQCMVwB3WgCNRQCBTgB2WACDagAAAACRSgD/mRf/pyj/pAr/mSD/nCL/ph//nBz/mhv/mhH/mRz/mhn/mif/oyH/nBxxUAD/jhP/hwr/jwX/hQH/iQj/fgD/hQv/ggH/jgftgwDofgD/iAP/iQb/fQH/igb/gwz/iAL/jxz/jxj/kA//jhH/zH7/15z/y5f/1Yv/6pT/nirVZwD/hQj/iAX0fwD/hgD/lg//mA7/kQ3/mBT/3YL/ulv7WQDJSQDfYQD/giD/zKX/ty7yhQD/hQf/gAD/ihD/oBX/nRr/lhP/t2P/wnyjQAC6UQC1VQC7UgDMZQD/dAv/3LjldQD/igL/hgv/kgD/nRf/oyf/mw3/0ZnfZQCGPACmQQDBSwC2RgDDTADTVQD/t3n/nDr/hAL8hQD/hQf/piL/ohv/nR//3m2sYAB/LACaKwC3QwCySACxRQDcUgD/tln/pCr/iwH/hgD/iQH/pB3/qS3/niL/y33kcAB0LwBnJwCEOgCfTACgSAC7TAD/uG7/nRz/hAj/iAP/iAD/rC//rS7/qxj/uTz/xpdhLQBwKgBsLABvOACXNwDnXQD/2qf/lgj/mET/t2r/gxP/tTf/tif/qTP/riD/1Hv/2Xa1WAB/KgBuJgD1cAD/3Zj/r03/mwP/x3f/+OT/jAwAAAD/wTn/ty3/rzv/syb/uV//4qX/6p//4q//24X/qzL/oBP/lwr/kQz/igIAAAAAAAAAAAAAAAAAAAD/tzT/oyf/sSn/sCL/pyj/mx7/mSX/lAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sSr/riX/qTj/qRf/oxH/pBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA8A8AAPgfAAD//wAA%22%29%21important%3B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано ВВП (11-10-2022 10:24:43)

Отсутствует

 

№1657310-10-2022 09:22:47

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

kazarin пишет

Похоже, после сохранения она повторно инициализируется.

Вот это новость.
Ну конечно же она повторно инициализируется, и не только после сохранения,
но и при посещении режима персонализации (или как он сейчас там назавается,
короче, где кнопки перетаскивать можно).


Поэтому в коде кнопок принято предусматривать деструктор.
И он там есть, но неправильный. Вместо addDestructor(()=> menuitem.remove());
нужно addDestructor(()=> menu.remove());


И это ещё не всё. Заметил что у дублката нет иконки?
Это, как говорится, «здесь вам не XBL». Вот так лучше уже не делать


var menu = contextMenu.insertBefore(document.createXULElement("menu"), copyimage);
menu.setAttribute(.....
menu.setAttribute(.....


Сначала создаём элемент, затем устанавливаем ему атрибуты, и только потом
вешаем на DOM-дерево, то есть


var menu = document.createXULElement("menu");
menu.setAttribute(.....
menu.setAttribute(.....
contextMenu.insertBefore(menu, copyimage);

Отсутствует

 

№1657410-10-2022 18:21:14

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 105.0

Re: Custom Buttons

Dumby
Настойка панелей . Короче, кнопку сделал, норм, и вкладка открывается и панель закладок(там кнопки прячу). Хотел по умолчанию также
<command id="cmd_CustomizeToolbars" oncommand="gCustomizeMode.enter(); "/>
Но код на открытие панели закладок не проходит...Если дам же дописать ? Типа,
CustomizableUI.setToolbarVisibility("PersonalToolbar", document.querySelector("#PersonalToolbar"));

Отредактировано ВВП (10-10-2022 18:37:13)

Отсутствует

 

№1657510-10-2022 19:19:21

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: Custom Buttons

ВВП пишет

Но код на открытие панели закладок не проходит...Если дам же дописать ? Типа,
CustomizableUI.setToolbarVisibility("PersonalToolbar", document.querySelector("#PersonalToolbar"));

Строка дурацкая, но, вобщем-то, рабочая.
Лучше CustomizableUI.setToolbarVisibility('PersonalToolbar', true);
или 'always' вместо true


А не работает, наверняка, из-за кавычек.
Следи за тем, чтобы если по краям "двойные" кавычки,
то внутри чтобы не было "двойных", а были, например, 'одинарные'.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]