Habe gerade mal mit Deinem (doch sehr unwahrscheinlichem) Szenario getestet. Hier funzt damit kein Button (Release +Linux)!
Beiträge von Mitleser
-
-
wenn das zuerst (bei Programmstart) geöffnete Fx Fenster geschlossen wurde - falls man mit mehreren Fenstern arbeitet - funktioniert dieser Scriptaufbau nicht mehr, jedenfalls hier.
Was hier klappt:
Hier funzt Dein gerade gepostetes Script unter den von Dir geschilderten Bedingungen auch nicht (Linux).
-
ich war mal so frei, und habe das für ihn gemacht
Aus kosmetischen Gründen (beeinflußt die Funktion nicht) könnte man in Zeile 33 noch ein ';' anhängen. Der Code ist dann einfach bessser lesbar (
).
onCommand();
Und um Verwirrungen mit 'Inline Event Handlers' aus dem Weg zu gehen könnte die Funktion auch einen anderen Namen erhalten.
-
Und hier meins:
Icon: 16synchronization_moz.svg
JavaScript
Alles anzeigen// JavaScript Document // B_RestartFirefox.uc.js // Das Script erstellt einen Button, der Firefox neu startet. Linksklick: Neustart MIT löschen Js-Cache \ Mittelklick: Neustart OHNE löschen Js-Cache \ Rechtsklick: Neustart OHNE löschen Js-Cache. Das .svg-Icon kann - je nach Hover-Zustand - mit zwei unterschiedlichen Farben gefüllt werden [fill]. // Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'. (function() { if (!window.gBrowser) return; // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const id = 'restart-button'; // Id des neuen Buttons const label = 'Restart - Quicklink'; // Bezeichnung des neuen Buttons const tooltiptext = 'Restart - Quicklink\n\nLinksklick: Neustart MIT löschen Js-Cache\nMittelklick: Neustart OHNE löschen Js-Cache\nRechtsklick: Neustart OHNE löschen Js-Cache'; // Icon------------------------------------------------------- const icon = '16synchronization_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet const iconColOu = 'red'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOu keine Funktion) const iconColOv = 'currentColor'; // Farbe des Icons beim Überfahren des Buttons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOv keine Funktion) // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); const cl = '.toolbarbutton-icon'; //---- if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) { Services.prefs.setBoolPref('svg.context-properties.content.enabled', true ); } //---- CustomizableUI.createWidget({ id: id, type: 'button', defaultArea: CustomizableUI.AREA_NAVBAR, label: label, tooltiptext: tooltiptext, onCreated: (button) => { button.style.MozContextProperties = 'fill, stroke, fill-opacity'; button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")'; button.style.fill = iconColOu; //over button.addEventListener('mouseover', () => { button.style.fill = iconColOv; button.querySelector(cl).style.rotate = '90deg'; }); //out button.addEventListener('mouseout', () => { button.style.fill = iconColOu; button.querySelector(cl).style.rotate = '0deg'; }); //click button.addEventListener('click', () => { if (event.button == 0) { Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); } else if (event.button == 1 || event.button == 2) { Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); } }); } }); //---- })();
-
Ich habe in einigen Beiträgen (UserPref betreffende Button-) Scripte angeboten. Post
BeitragRE: Div. Skripte funktionieren im aktuellem Nightly nicht mehr
Speravir Als Sören Hentzschel die kommenden Änderungen an den Inline-Eventhandlern publiziert hat, habe ich angefangen einige Button-Scripte umzuschreiben, darunter auch einige Scripte die Userprefs betreffen
(setIntPref/setBoolPref oder setCharPref). Bei mir befinden sich diese Buttons in einer zusätzlichen Seitenleiste am rechten Rand. Hier mein Script um den 'image.animation_mode' zu schalten. Aber ob das auch auf Nightly 136 läuft?
Hier die Icons: icons.zip
(Quelltext, 100 Zeilen)
Mitleser10. Januar 2025 um 04:09 und Folgende
Bug: Die Buttons wurden in einem neuen Fenster nicht angezeigt. Dieser Fehler ist jetzt behoben. Download mit Icons als gepackte Datei: UserPrefScripte.zip -
Vielleicht bringt dich das weiter:
Aber bei deinem Vorhaben einzelne Ordner oder Lesezeichen in der Sidebar anzusprechen, sehe ich keine Möglichkeit.
-
Bei mir ist die Schaltfläche "Alle Tabs wieder öffnen" oberhalb der Liste, auch in einem neuen Profil...
Quelle:userChrome.js/Firefox 135/UndoListInTabmenuToo.uc.js at master · Endor8/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.github.com -
-
Es geht jedoch so etwas
In der Tat wäre dies etwas kürzer, aber auch wieder etwas schlechter lesbar.
Schrägstrich im Pfad sind wichtig für die Funktionalität, so dass man darauf hinweisen könnte, sie nicht zu entfernen
Kann man machen aber 'copy and paste' aus einem Dateimanager sollte man dann schon voraussetzen können.
-
Und ich habe noch eine weitere Variante:
Das funzt?
Zeile 18 = 25 ? -
Ich nutze dieses Skript, funktionierte nicht mehr in Nightly
Ich hätte nur ein Alternativ-Script:
Icon: 16_library-big_moz.svgJavaScript
Alles anzeigen// JavaScript Document // B_Bookmarks-manager.uc.js // Das Script erstellt einen Button, der die Bibliothek öffnet. Das .svg-Icon kann - je nach Hover-Zustand - mit zwei unterschiedlichen Farben gefüllt werden [fill]. // Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'. (function() { if (!window.gBrowser) return; // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const id = 'bookmarks-manager-button'; // Id des neuen Buttons const label = 'Bibliothek'; // Bezeichnung des neuen Buttons const tooltiptext = 'Bibliothek'; // Icon------------------------------------------------------- const icon = '16_library-big_moz.svg' // [Name.Dateiendung] des anzuzeigenden Symbols const iconPath = '/chrome/icons/' // Pfad zum Ordner der das Icon beinhaltet const iconColOu = 'teal'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOu keine Funktion) const iconColOv = 'currentColor'; // Farbe des Icons beim Überfahren des Buttons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOv keine Funktion) // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); //---- if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) { Services.prefs.setBoolPref('svg.context-properties.content.enabled', true ); } //---- CustomizableUI.createWidget({ id: id, defaultArea: CustomizableUI.AREA_NAVBAR, label: label, tooltiptext: tooltiptext, onCreated: (button) => { button.style.MozContextProperties = 'fill'; button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")'; } }); const el = document.getElementById(id); const cl = '.toolbarbutton-icon'; //start el.querySelector(cl).style.fill = iconColOu; //over el.addEventListener('mouseover', () => { el.querySelector(cl).style.fill = iconColOv; }); //out el.addEventListener('mouseout', () => { el.querySelector(cl).style.fill = iconColOu; }); //click el.addEventListener('click', () => { if (event.button == 0) { // PlacesCommandHook.showPlacesOrganizer('History'); openTrustedLinkIn('chrome://browser/content/places/places.xhtml', 'tab'); } }); //---- })();
-
(hätte ich auch vor ewigen Zeiten schon mal nachfragen können)
Oder ich hätte das (vor äonen von Jahren) mal korrigieren sollen
-
Ich nutze u.a. dieses Skript:
Genau dieses Script geändert und ungetestet im Nightly!
JavaScript
Alles anzeigen(function() { if (location != 'chrome://browser/content/browser.xhtml') return; let menuitem = document.createXULElement('menuitem'); menuitem.id = 'context_closeLeftTabs'; menuitem.setAttribute('label', 'Linke Tabs schließen'); let tabContextMenu = document.getElementById('tabContextMenu'); let refItem = document.getElementById('context_undoCloseTab'); tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheEnd'), refItem); tabContextMenu.insertBefore(document.getElementById('context_closeTabsToTheStart'), refItem); tabContextMenu.insertBefore(document.getElementById('context_closeOtherTabs'), refItem); //tabContextMenu.removeChild(document.getElementById('context_closeTabOptions')); //click menuitem.addEventListener('click', () => { if (event.button == 0) { for (let i = TabContextMenu.contextTab._tPos - 1; i >= 0; i--)gBrowser.removeTab(gBrowser.tabs[i], {animate: true}); } }); })();
-
Tab schließen + Kontextmenü auch in dem Einstellungsfenster
Vielleicht reicht das schon aus; ungetestet! Zeile 19 ersetzen mit:
?
Eins hab ich noch..
Auch nur wieder ein Alternativ-Script aus meiner Sammlung (Icons aus #23):
JavaScript
Alles anzeigen// JavaScript Document // B_UserPrefToolbarTip.uc.js // Das Script erstellt einen Button, der in about:config boolsche Werte ändert. In der UserConfiguration unter 'const boolPref' kann die zu ändernde Einstellung festgelegt werden. Das icon/label/tooltiptext kann in der UserConfiguration dem jeweiligen Zustand angepasst werden (true/false). // Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'. (function() { if (!window.gBrowser) return; // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const id = 'UserPref-t_t-button'; // Id des neuen Buttons const boolPref = 'browser.chrome.toolbar_tips'; // Einstellung in about:config deren boolesche Variable geschaltet werden soll const labelT = 'Tooltips aktiviert'; // Bezeichnung des neuen Buttons bei boolPref=true const labelF = 'Tooltips deaktiviert'; // Bezeichnung des neuen Buttons bei boolPref=false const tooltiptextT = 'Tooltips aktiviert'; const tooltiptextF = 'Tooltips deaktiviert'; // Icon------------------------------------------------------- const iconT = '16-control-panel-20_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols für boolPref=true const iconF = '16-control-panel-18_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols für boolPref=false const bgImage = 'greenyellow'; // Farbe des Indikators (zur Unterscheidung mehrerer UserPref-buttons;) const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet const iconColorT = 'forestgreen'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties] für boolPref=true, bei anderen Icons hat const iconColorT keine Funktion) const iconColorF = 'firebrick'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties] für boolPref=false, bei anderen Icons hat const iconColorF keine Funktion) // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); //---- if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) { Services.prefs.setBoolPref('svg.context-properties.content.enabled', true ); } //---- CustomizableUI.createWidget({ id: id, defaultArea: CustomizableUI.AREA_NAVBAR, onCreated: function(button) { button.style.MozContextProperties = 'fill'; //bgImage button.style = 'background-image:linear-gradient('+bgImage+','+bgImage+'); background-repeat: no-repeat; background-size: 4px 4px; background-position: left 2px top calc(50% - 8px);'; } }); const el = document.getElementById(id); const cl = '.toolbarbutton-icon'; //start if (Services.prefs.getBoolPref(boolPref) == false ) { el.querySelector(cl).style.fill = iconColorF; el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconF + '")'; el.setAttribute('label', labelF); el.setAttribute('tooltiptext', tooltiptextF); } else if (Services.prefs.getBoolPref(boolPref) == true ) { el.querySelector(cl).style.fill = iconColorT; el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconT + '")'; el.setAttribute('label', labelT); el.setAttribute('tooltiptext', tooltiptextT); } //click el.addEventListener('click', () => { if (event.button == 0) { if (Services.prefs.getBoolPref(boolPref) == false ) { el.querySelector(cl).style.fill = iconColorT; Services.prefs.setBoolPref(boolPref, true); el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconT + '")'; el.setAttribute('label', labelT); el.setAttribute('tooltiptext', tooltiptextT); } else if (Services.prefs.getBoolPref(boolPref) == true ) { el.querySelector(cl).style.fill = iconColorF; Services.prefs.setBoolPref(boolPref, false); el.style.listStyleImage = 'url("' + curProfDir + iconPath + iconF + '")'; el.setAttribute('label', labelF); el.setAttribute('tooltiptext', tooltiptextF); } } }); //---- })();
-
Wie Du vielleicht bemerkt hast, ist mir die 'ConfigArea' in meinen Scripten sehr wichtig. Es gibt Menschen, die kaum Ahnung von JavaScript haben die Möglichkeit einfach ein Script zu konfigurieren. Deshalb gibt es z.B. die Möglichkeit den Pfad einzustellen (const iconPath = '/chrome/icons/';). Außerdem nutze ich meist mehrere Icons in den Pfaden zu den ListStylImages. Wenn ein 'switch' besser als ein 'if' sein sollte, benutze ich diesen auch. Aber trotzdem: Danke für Deine Anmerkungen!
-
Ich hätte dies:
Translate_DeepL.uc.js
16_deepl_logo_moz.svgJavaScript
Alles anzeigen// JavaScript Document // M_Translate_DeepL.uc.js // Das Script erstellt einen neuen Menüeintrag. Beim Klick auf den Eintrag öffnet die Seite https://www.deepl.com/...in einem neuen Tab und der vorher markierte Text wird übernommen. // Bug: Sprache erkennen funktioniert nicht. // Das .svg-Icon kann - je nach Hover-Zustand - mit zwei unterschiedlichen Farben gefüllt werden [fill]. Beim Überfahren des Menuitems vergrößert sich das Icon [scale: 1.1]. // Das Menü für den Menüeintrag kann selektiert werden (Seitenkontextmenü oder Tabkontextmenü). // Die Position des Menüeintrags innerhalb des Menüs kann bestimmt werden. // Darstellung des Menüeintrags mit/ohne Icon kann gewählt werden. // Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script - bei gewählter Iconanzeige [const isIcon = 1;] - die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'. (function() { if (!window.gBrowser) return; // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const id = 'contextDeepletranslate'; // ID des neuen menuitems const label = 'Deepl Translate'; // Bezeichnung des neuen menuitems const tooltiptext = 'Mit DeeplTranslate übersetzen'; // Icon------------------------------------------------------- const isIcon = 1; // const isIcon = 1; mit Icon // const isIcon = 0; ohne Icon; die Konstanten icon, iconPath, iconColOu und iconColOv haben dann keine Funktion und sollten unberührt bleiben const icon = '16_deepl_logo_moz.svg'; // [Name.Dateiendung] des anzuzeigenden Symbols const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet const iconColOu = 'steelblue'; // Farbe des Icons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOu keine Funktion) const iconColOv = 'currentColor'; // Farbe des Icons beim Überfahren des Items (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOv keine Funktion) // Menü------------------------------------------------------- const isMenu = 1; // const isMenu = 1; für Seitenkontextmenü; // const isMenu = 2; für Tabkontextmenü'; const isPos = 'context-translate-selection'; // Option A: // const isPos = 12; [Zahlen von -5 bis 20] // Menuitem an einer bestimmten Position im Menü einfügen // wie in CSS: [order:12!important;] // Option B: // const isPos = 'context-translate-selection'; [String] // Menuitem auf diesen Menüpunkt folgend einfügen // wie in CSS: [#context-translate-selection] // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); const cl = 'image'; const menu1 = document.getElementById('contentAreaContextMenu'); const menu2 = document.getElementById('tabContextMenu'); const menuitem = document.createXULElement('menuitem'); menuitem.id = id; menuitem.setAttribute('label', label); menuitem.setAttribute('tooltiptext', tooltiptext); //mit Icon if (isIcon === 1) { //---- if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) { Services.prefs.setBoolPref('svg.context-properties.content.enabled', true ); } //---- menuitem.classList.add('menuitem-iconic'); menuitem.style.MozContextProperties = 'fill'; menuitem.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")'; //Icon start switch (isMenu) { case 1: menu1.addEventListener('popupshowing', () => { menuitem.querySelector(cl).style.fill = iconColOu; }); break; case 2: menu2.addEventListener('popupshowing', () => { menuitem.querySelector(cl).style.fill = iconColOu; }); break; } //Icon over menuitem.addEventListener('mouseover', () => { menuitem.querySelector(cl).setAttribute('style','fill:'+iconColOv+';scale: 1.1;transition: scale 0.2s ease-in-out 0.0s;'); }); //Icon out menuitem.addEventListener('mouseout', () => { menuitem.querySelector(cl).setAttribute('style','fill:'+iconColOu+';scale: 1.0;transition: scale 0.2s ease-in-out 0.0s;'); }); } //Icon end //click menuitem.addEventListener('click', () => { if (event.button == 0) { translate(); } }); //Position order if (isPos > -6 && isPos < 21) { if (isMenu === 1) { menu1.append(menuitem); } else if (isMenu === 2) { menu2.append(menuitem); } menuitem.style.order = isPos; } //Position reference else { const refItem = document.getElementById(isPos); refItem.parentNode.insertBefore(menuitem, refItem.nextSibling); } //---- function translate() { const browserMM = gBrowser.selectedBrowser.messageManager; browserMM.addMessageListener('getSelection', function listener(message) { const t = (message.data !== ''); const e = (document.charset || document.characterSet); if (t) { openTrustedLinkIn('https://www.deepl.com/translator#en/de/' + encodeURIComponent(message.data), 'tab'); } else { openTrustedLinkIn('https://www.deepl.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab'); }; browserMM.removeMessageListener('getSelection', listener, true); }); browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true); }; //---- })();
-
Mitleser Die Inline-Eventhandler sind ja schon lange nur eine Altlast nebenher, die Variante mit addEventListener und seinem Gegenstück removeEventListener gibt es ja schon seit einer Ewigkeit.
Ach so
, Danke!,
-
Brauchst du auch gar nicht. Wenn du das angepasste Skript in der Release-Version testest und es genau das macht, was das Skript vorher gemacht hat, dann wird es auch in der Nightly funktionieren.
Getestet in Release und funzt!
Danke!!
-
Funktioniert das angepasste Script aus #91 bei dir nicht?
Habe leider kein Nightly zum testen...
-
Schade. war einen Versuch wert. Da ich das nicht testen kann gebe ich auf. Danke für die Rückmeldungen.