Div. Skripte funktionieren im aktuellem Nightly nicht mehr

  • Sieht nicht einfach aus, da haste recht. ;)

    Sieht es nicht?

    Aus:

    JavaScript
    element.setAttribute('onEvent', 'function();');

    wird:

    JavaScript
    element.addEventListener('event', () => {
      function();
    });

    Das ist das ganze Prinzip, welches sich die ganze Zeit wiederholt. Manchmal entstehen wie gesagt Irritationen dadurch, dass es unterschiedliche Schreibweisen gibt. Oder der Code ist etwas „komplizierter“ dadurch, dass Attribute in einer Schleife gesetzt werden, ein Teil der Logik in eine eigene Methode ausgelagert ist und / oder Funktionen ineinander verschachtelt werden. Dann reicht es nicht mehr, nur zu kopieren. Dann muss man den Weg verstanden haben, genau hinsehen und das Gelernte unter abweichenden Voraussetzungen anwenden. Aber das Prinzip bleibt am Ende immer das Gleiche. ;)

  • Ich hab's, ich fress 'en Besen! Dharkness FuchsFan

    Danke, aber alle meine Bemühungen scheitern, weil Dein Script nicht identisch ist mit dem meinen.

    Das bei Endor gelistete wäre der Ursprung, aber das bekomme ich nicht gerichtet.:rolleyes:

    userChrome.js/Firefox 129/Appmenu.uc.js at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Grüße vom FuchsFan

  • aber das bekomme ich nicht gerichtet. :rolleyes:

    Auch hier immer das Gleiche:

    JavaScript
    ExternalAppBtn.setAttribute("onclick", "event.preventDefault();event.stopPropagation();");
    key.setAttribute('oncommand', 'document.getElementById("AMpopup").openPopup();');
    appItem.setAttribute('oncommand', "Appmenu.exec(this.path, this.args);");
    configItem.setAttribute('oncommand', config.command);

    =>

    Nachtrag: Nummer 4 korrigiert, ich hatte mir das Original-Script nicht gut genug angesehen. Das funktioniert tatsächlich etwas anders.

  • Sieht nicht einfach aus, da haste recht. ;)

    Sieht es nicht?

    Aus:

    JavaScript
    element.setAttribute('onEvent', 'function();');

    wird:

    JavaScript
    element.addEventListener('event', () => {
      function();
    });

    Das ist das ganze Prinzip, welches sich die ganze Zeit wiederholt. ;)

    Hab ich gesehen, aber wenn du dir hier Zeilen 282+, und 319+ anschaust, da hat Mia ein paar Dinge umgebastelt.

    z.B.:

    JavaScript
            if (item.command) {
            //  menuItem.setAttribute("oncommand", item.command);
              menuItem.addEventListener("command", function() {
                eval(item.command);
              });

    Ob oder wieso das so umgesetzt sein soll kann ich nicht einschätzen, das ist der komplizierte Teil für mich; vermutlich aus den Gründen die du gerade beschrieben hast, und halt wg. mangelden JS Kentnissen.

  • Du hast schon Recht. Das ist tatsächlich zur Abwechslung mal ein Fall, der sich nicht automatisch aus den anderen Fällen ergibt, sondern etwas Zusatzwissen benötigt.

    In den anderen Fällen hast du immer JavaScript-Funktionen, die innerhalb eines Strings angegeben sind, erkennbar an den Anführungszeichen. Zum Beispiel:

    JavaScript
    key.setAttribute('oncommand', 'document.getElementById("AMpopup").openPopup();');

    Die kannst du einfach aus den Anführungszeichen herausnehmen und dann ausführen:

    JavaScript
    key.addEventListener('command', () => {
      document.getElementById('AMpopup').openPopup();
    });

    In dem Fall hast du keine Anführungszeichen:

    JavaScript
    menuItem.setAttribute("oncommand", item.command);

    Das item.command ist quasi eine Variable, die das auszuführende Script beinhaltet. Nun könnte man meinen, das macht keinen Unterschied. Und es wäre, basierend auf den bisherigen Erkenntnissen, folgender Gedanke naheliegend:

    JavaScript
    menuItem.addEventListener('command', function () {
      item.command;
    });

    Also gleich, wie es die ganze Zeit mit den Funktionen geschieht. Aber das funktioniert so nicht. Eine Variable kann man nicht einfach so in den Raum stellen, damit etwas passiert.

    Die Funktion eval() führt einen Text, in dem Fall also den Inhalt von item.command als Script aus:

    JavaScript
    menuItem.addEventListener('command', function () {
      eval(item.command);
    });

    Folgendes würde auch funktionieren:

    JavaScript
    menuItem.addEventListener('command', function () {
      Function(item.command)();
    });

    Das ist sogar die bessere Variante, da deutlich performanter.

  • Die Funktion eval() führt einen Text, in dem Fall also den Inhalt von item.command als Script aus:

    Sollte eval eigentlich nicht mehr verwendet werden oder verwechsele ich da etwas? Vor Jahren haben wir deswegen auch Skripte umgeschrieben.

    Übersetzer für Obersorbisch und Niedersorbisch auf pontoon.mozilla.org u.a. für Firefox, Firefox für Android, Firefox für iOS, Firefox Klar/Focus für iOS und Android, Thunderbird, Pootle, Django, LibreOffice, LibreOffice Onlinehilfe, WordPress

  • eval() gilt vor allem aus Sicherheitsgründen als absolutes No-Go in JavaScript - auf Grund genau dieser Eigenschaft, die hier genutzt wird: aus einem String ausführbares JavaScript zu machen. In der Hinsicht ist der Weg über Function auch nicht besser. Die andere Sache ist, dass für eval() sämtliche Optimierungen der Engine außer Kraft gesetzt sind, was es sehr langsam macht.

    Was die Sicherheit betrifft: Wenn du das auf einer Website nutzt und dann möglicherweise noch Nutzer-Eingaben verarbeitest, kann das fatale Folgen haben. In dem Fall denke ich, dass das nicht so viel ausmacht, weil keine Fremdeingaben verarbeitet werden und die Kontrolle vollständig beim Anwender liegt. Würde jemand Drittes Zugriff auf das System haben und das Script manipulieren wollen, wäre das bei einem direkten Aufruf der Funktionen ohne eval() genauso möglich. Dann wird eben das manipuliert.

    Möchte man auf eval() oder Function() verzichten, muss man das Script umbauen und ähnlich lösen, wie in den anderen Fällen. Aus Performance-Sicht wäre das empfehlenswert. Und dass Mozilla früher oder später die Verwendung von eval() unterbindet, ist durchaus denkbar. Dafür gibt es ebenfalls eine CSP-Direktive. Zukunftssicherer wäre es definitiv ohne. Aber aktuell funktioniert es damit noch.

  • Danke :thumbup: Auf Anraten von

    Sören Hentzschel
    14. Januar 2025 um 12:05

    funktioniert dieses AppMenu.uc.js wieder

  • aber das bekomme ich nicht gerichtet. :rolleyes:

    Auch hier immer das Gleiche:

    JavaScript
    ExternalAppBtn.setAttribute("onclick", "event.preventDefault();event.stopPropagation();");
    key.setAttribute('oncommand', 'document.getElementById("AMpopup").openPopup();');
    appItem.setAttribute('oncommand', "Appmenu.exec(this.path, this.args);");
    configItem.setAttribute('oncommand', config.command);

    =>

    Nachtrag: Nummer 4 korrigiert, ich hatte mir das Original-Script nicht gut genug angesehen. Das funktioniert tatsächlich etwas anders.

    Ganz herzlichen Dank, funktioniert wieder, muss nur noch alles wieder hübsch machen. :thumbup::)

    Grüße vom FuchsFan

  • Die Frage hatte ich übersehen.

    Kein Problem...:)

    Man kann natürlich auch diesen Weg gehen. Dann muss man halt in dieser Funktion den Namen der Eigenschaft prüfen und für die on*-Eigenschaften den Listener ensprechend setzen statt das Attribut. Dann darf man nur nicht vergessen, den Namen dynamisch anzupassen, denn das on gehört ja nicht in den Event-Namen und der erste Buchstabe muss klein sein.

    Ja, so habe ich es ja in dem Beispielcode auch gemacht. Ganz verstehe ich nicht, was du meinst :/. 'oncommand' und 'onclick' werden nicht in die Attribute geschrieben, sondern stattdessen eben der entsprechende EventListener hinzugefügt mit 'command' und 'click'. Für alle anderen Eigenschaften des übergebenen Objekts wird die vorgegebene Standardzuweisung el.setAttribute(n, attr[n]);  verwendet.

    Wieso das $ verwendet wird, weiß ich nicht. Wenn ich so etwas sehe, vermute ich als erstes, dass der ursprüngliche Entwickler aus der jQuery-Entwicklung kommt und das daher hat. Aber vielleicht hatte der Entwickler auch eine ganz eigene Konvention, wann er das Dollar-Zeichen verwendet. Das müsste man den Entwickler mal fragen. Schlimmer finde ich, dass Funktionen als $, $A und $C benannt sind. Schön kurz, ja, aber nicht lesbar an den Stellen, an denen die Funktionen verwendet werden.

    Ja sehe ich auch so. In einigen Scriptsprachen wird auch dieses $ vor dem Variablennamen verwendet. Wahrscheinlich noch nicht ganz in der 'neuen' Sprache angekommen, da nutzt man dann immer wieder gerne gewohnte Strukturen aus der "Heimatsprache". Habe da auch so ein paar Baustellen...;)

    Würde mich schon interessieren, ob der Code auch funktioniert. Aber ich könnte Endor auch verstehen, wenn er es nicht nochmal testen möchte, wenn die andere Herangehensweise funktioniert hat.;)

    Gruß BrokenHeart

    "success has many fathers, failure is an orphan"

  • Ja, so habe ich es ja in dem Beispielcode auch gemacht. Ganz verstehe ich nicht, was du meinst :/ . 'oncommand' und 'onclick' werden nicht in die Attribute geschrieben, sondern stattdessen eben der entsprechende EventListener hinzugefügt mit 'command' und 'click'. Für alle anderen Eigenschaften des übergebenen Objekts wird die vorgegebene Standardzuweisung el.setAttribute(n, attr[n]); verwendet.

    Ich hatte nicht gesehen, dass du schon Code dafür hattest. Ich hatte mir nur den Teil des Beitrags angesehen, der an mich gerichtet war. In diesem Thema war so viel in so kurzer Zeit los und ich so beschäftigt, dass ich vermutlich nicht mal die Hälfte des gesamten Themas gelesen habe. 😬

    Die Umsetzung, die ich im Kopf hatte, hätte so ausgesehen, dass der Name des Attributs ausgelesen wird und wenn dieser mit „on“ beginnt, der entsprechende Code kommt und für den Event-Namen die ersten zwei Buchstaben gestrichen und der dritte klein geschrieben wird. Das wäre dann auch flexibel genug für andere Events als nur diese zwei. Wenn aber ohnehin nur „oncommand“ und „onclick“ verwendet werden, hast du mit deiner Umsetzung sowieso schon alle Fälle abgedeckt. Das passt also, wie es ist.

  • Danke Sören Hentzschel

    JavaScript
              menuItem.addEventListener('command', () => {
                Function(item.command)();
              });

    Das habe ich übernommen und eingepflegt!
    Aber bei der darauffolgenden Anpassung bleibt alles wie gehabt?


    PS: Der ganze Codeschnipsel.

    Mit <3lichem Gruß

    Mira

    Einmal editiert, zuletzt von Mira_Belle (14. Januar 2025 um 15:43)

  • Da das Skript in diesem Thread angepasst wurde, frage ich einfach gleich hier mal;)

    Das Problemchen ist aber nicht neu, sondern schon immer so gewesen.

    Ich nutze u.a. dieses Skript:

    Das sieht dann so nach einem Rechtsklick auf den erste Tab aus:

    Der Eintrag: Linke Tabs schließen wird als aktiv angezeigt, obwohl es keinen linken Tab gibt.

    Klicke ich auf den rechten Tab:

    ist der Eintrag: Rechte Tabs schließen ausgegraut.

    Meine Frage also.

    Bei nur einem offenen Tab müsste der Eintrag: Linke Tabs schließen ja eigentlich auch ausgegraut sein, bzw. gar nicht vorhanden sein:/

    Kann man das im Skript anpassen?

    Mir ist schon klar, das der Eintrag ja erst durch das Skript erstellt wird. Es müsste also ein Änderung sein wie z.B. aktiv/inaktiv im Skript.

    In meinem Hauptprofil sieht das so aus bei nur einem Tab:

    (alle anderen Einträge habe ich per CSS entfernt)

    Der Eintrag sollte dann gar nicht angezeigt werden.

    Wie immer danke für jegliche Hilfe:)

    Edit:

    Letztlich geht es nur darum, diese 3 Einträge nach links zu verschieben:

  • 2002Andreas Schau Dir dieses Skript einmal an, das nutze ich!
    Wenn Du daran Änderungen haben möchtest, gerne werde ich sie durchfahren.

    Mit <3lichem Gruß

    Mira

  • 2002Andreas Dieses Skript funktioniert korrekt

    Code
    (async (el, url) => {
       if (location != url) return;
       el.before(document.getElementById("context_closeTabsToTheStart"));
       el.before(document.getElementById("context_closeTabsToTheEnd"));
       el.before(document.getElementById("context_closeOtherTabs"));
       el.style.visibility="collapse";
    })(document.getElementById("context_closeTabOptions"), "chrome://browser/content/browser.xhtml"); 
  • Bitte mal helfen, im Appmenu-Script gibt es den Eintrag zum öffnen von Downloads. Der eingetragene Wert command reagiert nicht mehr. Wie müsste der jetzt richtig lauten?

    Code
    name: 'Downloads',
    command: "BrowserDownloadsUI();",
    id: 'AMdownloads',

    Danke, hat sich erledigt.

    command:"PlacesCommandHook.showPlacesOrganizer('Downloads');",

    Grüße vom FuchsFan

    Einmal editiert, zuletzt von FuchsFan (14. Januar 2025 um 18:10)