Eintrag im (Tab)Kontextmenü verschieben

  • Auf ein Neues!

    JavaScript
    (function() {
      if (location != 'chrome://browser/content/browser.xhtml')
        return;
      let cs_undoTabs = document.getElementById("context_undoCloseTab");
      let cs_closeTabs = document.getElementById("context_closeOtherTabs");
      tabContextMenu.insertBefore(cs_closeTabs), cs_undoTabs);
    })();

    'nabend Mira_Belle ...

    Wie sieht das denn bei Dir aus?

    ...

    "Andere Tabs schließen" hatte ich vorher garnicht... :/

    Wie gewünscht!

    Der Eintrag "Andere Tabs schließen" befand sich vorher einen Klick weiter

    unter "Mehrere Tabs schließen".

    Durch das Script wurde dieser eine "Ebene" höher verschoben.

    Mit <3lichem Gruß

    Mira

    3 Mal editiert, zuletzt von Mira_Belle (7. Oktober 2022 um 21:41) aus folgendem Grund: Ein Beitrag von Mira_Belle mit diesem Beitrag zusammengefügt.

  • Tja, meinereiner sollte vorm Testen mal alles lesen :huh:

    Vielleicht schaffe ich es ja mit Deiner Vorlage "In neues Fenster verschieben" aus "Tab verschieben" hochzuholen.

    Schönes Wochenende, ich widme mich jetzt primär der Damen-Nationalelf gegen die Französinnen...

    W11 Home 64bit - FF120.x

  • Wow, ich scheine es begriffen zu haben!

    Teste mal.

    JavaScript
    (function() {
      if (location != 'chrome://browser/content/browser.xhtml')
        return;
      let cs_AllTabs = document.getElementById("context_selectAllTabs");
      let cs_openTabs = document.getElementById("context_openTabInWindow");
      tabContextMenu.insertBefore(cs_openTabs), cs_AllTabs);
    })();

    Wenn Du den Eintrag an andere Stelle haben möchtest, gib Bescheid.

    Mit <3lichem Gruß

    Mira

    Einmal editiert, zuletzt von Mira_Belle (7. Oktober 2022 um 21:41)

  • Um das noch zu beantworten:

    mit oder ohne ' , oder eher mit " ?

    Ob einfache oder doppelte Anführungszeichen kannst du dir aussuchen. Aus meiner Sicht sind einfache Anführungszeichen vorzuziehen, aber das ist eine Geschmacksfrage. Nur sollte man sich entscheiden. Beides zu mischen, ist nicht hübsch.

    PS: In deiner letzten Version hast du in den Zeilen 5 und 6 noch jeweils überflüssige Klammern. Und let kann vermutlich durch const ersetzt werden.

  • ...

    Ob einfache oder doppelte Anführungszeichen kannst du dir aussuchen. Aus meiner Sicht sind einfache Anführungszeichen vorzuziehen, aber das ist eine Geschmacksfrage. Nur sollte man sich entscheiden. Beides zu mischen, ist nicht hübsch.

    Habe ich auch gelesen! Niemals mischen, sonst funktioniert es nicht.

    PS: In deiner letzten Version hast du in den Zeilen 5 und 6 noch jeweils überflüssige Klammern. Und let kann vermutlich durch const ersetzt werden.

    Ist korrigiert, Danke für den Hinweis.

    Den Fehler habe ich auch in meinem anderen Script (gehabt).

    Was die Variablen angeht, ist mir immer noch nicht klar wann und warum man mal let

    und mal const benutzt.

    var sollte man nicht mehr verwenden, zu alt, zu fehleranfällig, weil Fehlerausgabe ausbleiben kann.

    Kannst Du mir noch zeigen, wie man das Label, also den angezeigten Text eines Eintrags ändert?

    Bei #context_openTabInWindow wird ja "In neues Fenster verschieben" angezeigt.

    Es macht aber Sinn, wenn der Eintrag eine Ebene nach Oben verschoben wurde,

    daraus "Tab in neues Fenster verschieben" zu machen.

    Mit <3lichem Gruß

    Mira

    2 Mal editiert, zuletzt von Mira_Belle (7. Oktober 2022 um 21:55)

  • Habe ich auch gelesen! Niemals mischen, sonst funktioniert es nicht.

    Du musst natürlich mit dem gleichen Anführungszeichen schließen, wie du geöffnet hast, richtig. Ich meinte aber auch, dass man im gesamten Script konsistent sein sollte, damit es nicht so willkürlich ist. In Zeile 2 verwendest du einfache Anführungszeichen, in den Zeilen 5 und 6 doppelte. Das macht funktional überhaupt nichts, meinte ich aber mit nicht hübsch.

    Was die Variablen angeht, ist mir immer noch nicht klar wann und warum man mal let

    und mal const benutzt.

    Wenn du eine Variable nach der Deklaration nicht noch einmal überschreibst, kannst du const verwenden, sonst muss es let sein (oder eben var). Es ist aber nicht so, dass es falsch wäre, immer let zu verwenden. Mein Ansatz ist halt, so restriktiv wie möglich zu starten und dann zu lockern, wo notwendig. Die Idee dahinter ist es, unerwartetes Verhalten durch versehentliches Überschreiben von Variablen bestmöglich zu vermeiden. Bei nur so wenigen Zeilen Code wird das zugegeben kein Thema sein. Andererseits kann man sich ja beim kleinen Code schon ein paar Dinge angewöhnen, über die man dann später bei komplexeren Aufgaben gar nicht mehr bewusst nachdenkt, sondern schon verinnerlicht hat. ;)

    Kannst Du mir noch zeigen, wie man das Label, also den angezeigten Text eines Eintrags ändert?

    Bei #context_openTabInWindow wird ja "In neues Fenster verschieben" angezeigt.

    Es macht aber Sinn, wenn der Eintrag eine Ebene nach Oben verschoben wurde,

    daraus "Tab in neues Fenster verschieben" zu machen.

    JavaScript
    cs_openTabs.setAttribute('label', 'Tab in neues Fenster verschieben');
  • ...

    JavaScript
    cs_openTabs.setAttribute('label', 'Tab in neues Fenster verschieben');

    Vielen Dank für Deine ausführlichen Erklärungen.

    Auch für den Code.


    Mh, ....

    Code
    (function() {
      if (location != 'chrome://browser/content/browser.xhtml')
        return;
    (1)
      let cs_AllTabs = document.getElementById('context_selectAllTabs');
      let cs_openTabs = document.getElementById('context_openTabInWindow');
    (2)
      tabContextMenu.insertBefore(cs_openTabs, cs_AllTabs);
    (3)
    })();

    ..

    an (1) den Code eingefügt, funktioniert das ganze Script nicht (mehr).

    An (2) oder (3), funktioniert zwar grundsätzlich das Script,

    aber der Text wird nicht geändert.

    Mit <3lichem Gruß

    Mira

    Einmal editiert, zuletzt von Mira_Belle (7. Oktober 2022 um 22:51) aus folgendem Grund: Ein Beitrag von Mira_Belle mit diesem Beitrag zusammengefügt.

  • Teste mal.

    :love: klappt... :thumbup:

    Wenn Du den Eintrag an andere Stelle haben möchtest, gib Bescheid.

    Selbst ist der Mann, habbich hinbekommen...

    an (1) den Code eingefügt, funktioniert das ganze Script nicht (mehr).

    An (2) oder (3), funktioniert zwar grundsätzlich das Script,

    aber der Text wird nicht geändert.

    Hier auch.

    Sieht aktuell bei mir noch so aus:

    Ich hab dann mal per zusätzlichem .css versucht, den Text zu ersetzen, bekomme das aber auch nicht hin.

    Vielleicht hat 2002Andreas ja einen Vorschlag/eine Idee ;)

    W11 Home 64bit - FF120.x

  • an (1) den Code eingefügt, funktioniert das ganze Script nicht (mehr).

    Logisch. Wie willst du auf etwas zugreifen, was an der Stelle noch überhaupt nicht definiert ist? Das steht dann aber eh in der Konsole, weil das ein Script-Fehler ist.

    An (2) oder (3), funktioniert zwar grundsätzlich das Script,

    aber der Text wird nicht geändert.

    Dann wird das ein Timing-Problem sein, weil das Script den Text vermutlich setzt, bevor Firefox das macht. Versuch es mit etwas Verzögerung:

  • Habe auch etwas gebastelt!

    1. Das Script um den Eintrag zuverschieben.

    JavaScript
    (function() {
      if (location != 'chrome://browser/content/browser.xhtml')
        return;
        let cs_AllTabs = document.getElementById('context_selectAllTabs');
        let cs_openTab = document.getElementById('context_openTabInWindow');
        tabContextMenu.insertBefore(cs_openTab, cs_AllTabs);
    })();

    2. Ein Script um das "Label" zu ändern. (Habe 2002Andreas Code in ein JavsScript eingebettet, ist nur ein Test!)


    Wenn mir jetzt noch jemand verraten könnte, wie man das 2. Script a. optimieren und b. beide zusammen bringen kann,

    wäre ich häppy


    Dann wird das ein Timing-Problem sein, weil das Script den Text vermutlich setzt, bevor Firefox das macht. Versuch es mit etwas Verzögerung:

    Hatte den Wert setTimeout(() => { ... sogar auf 50000 erhöht, passierte aber nichts.

    Mit dem CSS-Code von 2002Andreas klappt es aber.


    Und eine letzte Frage!

    Um einen Eintrag zu kopieren (klonen)

    muss = document.getElementById( durch was ersetzt werden?

    Mit <3lichem Gruß

    Mira

    2 Mal editiert, zuletzt von Mira_Belle (8. Oktober 2022 um 12:21) aus folgendem Grund: Ein Beitrag von Mira_Belle mit diesem Beitrag zusammengefügt.

  • wie man das 2. Script a. optimieren und b. beide zusammen bringen kann,

  • Glaube Dir ja, aber bei mir funktioniert es so nicht!

    Deshalb habe ich ja das zweite Script erstellt,

    im Übrigen von dem Scrollbar.us.js inspiriert.

    Es bleiben also weiterhin meine obigen Fragen offen.

    Wie man das 2. Script a. optimieren und b. beide zusammen bringen kann

    und durch was = document.getElementById( ersetzt werden muss,

    damit Eintrag nicht verschoben, sondern kopiert (geklont) wird.

    Mit <3lichem Gruß

    Mira

    Einmal editiert, zuletzt von Mira_Belle (8. Oktober 2022 um 13:30)

  • Weder var noch const oder auch let ändert den Eintrag.

    Einzig das (eingebettete) CSS ändert das Label.

    Ist ja auch nicht schlimm. Es funktioniert hat auf andere weise.

    Und mir sind die obigen Fragen wichtiger.

    Aber Danke für Deine Mühen.

    Wie kann man das 2. Script a. optimieren und b. beide zusammen bringen

    und durch was muss = document.getElementById( ersetzt werden,

    damit der Eintrag nicht verschoben, sondern kopiert (geklont) wird.

    Mit <3lichem Gruß

    Mira

  • Script a. optimieren und b. beide zusammen bringen

  • Hatte den Wert setTimeout(() => { ... sogar auf 50000 erhöht, passierte aber nichts.

    (Das Script von Sören aus Beitrag Nr.29 funktioniert hier nicht)

    Mein Fehler. Ich hatte mein Script mehrfach erfolgreich getestet und dann nach dem Testen die location-Prüfung auf eine strikte Prüfung (!== statt !=) geändert und das dann nicht mehr getestet. Ich hatte übersehen, dass location kein String ist. Wenn man strikt prüft (was man eigentlich immer tun sollte; ich verbiete in meinen Scripts per Linter nicht strikte Vergleiche), muss man location.href prüfen.

    Hier also das korrigierte Script:

    Und eine letzte Frage!

    Um einen Eintrag zu kopieren (klonen)

    muss = document.getElementById( durch was ersetzt werden?

    Meine Script-Erklärungen in Beitrag #16 waren wohl nutzlos. ;( Dabei muss man sogar nur den Namen der Funktion Document.getElementById() lesen, der ja auch nur normales Englisch ist, um zu sehen, was an dieser Stelle passiert: Man gibt eine ID an und erhält das Element dafür zurück. Da wird weder etwas verschoben noch in sonst einer Weise geändert. Der Teil muss also überhaupt nicht ersetzt werden.

    Wie ich bereits schrieb, findet das Verschieben als Teil der Node.insertBefore()-Methode statt, wenn ein existierendes statt ein neu erstelltes Element als erster Parameter übergeben wird. Verwende Node.cloneNode() zum Duplizieren des Original-Elements:

    JavaScript
    tabContextMenu.insertBefore(cs_openTabs.clondeNode(), cs_AllTabs);

    Zu beachten ist, dass das Original und Duplikat nicht automatisch synchron gehalten werden. Damit:

    JavaScript
    cs_openTabs.setAttribute('label', 'Tab in neues Fenster verschieben');

    … wird also nur der Original-Eintrag umbenannt. Die Komplettlösung sieht dementsprechend beispielsweise so aus: