Allgemeine Frage(n) zu JavaScript

  • Firefox-Version
    108.01 (64Bit)
    Betriebssystem
    Windows 10 Version 22H2 (Build 19045.2364)

    Ich habe so ein Problem mit einem Script.

    Normalerweise schreibe ich die Variablen ganz an den Anfang,

    das ist m.M. übersichtlicher und funktioniert auch meist.

    Hier ein Beispiel:

    Nun gibt es Variablen, die funktionieren nicht, wenn man sie aus der Funktion heraus nimmt und an den Anfang verschiebt,

    z.B. let toolbaritem = aDocument.createXULElement('toolbarbutton');,

    aber auch let props = ... kann man nicht "rausnehmen".

    Warum ist das so?

    Noch konfuser macht mich ein anders Script!

    Da kann ich gar keine Variable an den Anfang verschieben und aus der Fuktion nehmen.

    Dieses:

    Das ist doch nur eine Abwandlung des Skiptes Button_PersonalToolbar.uc.js!

    Baue ich es aber genau so auf, bzw. um, funktioniert es nicht mehr!

    Warum?

    Beißen sich etwa bestimmte Einträge beider Scripts und vertragen sich nicht?

    Mit <3lichem Gruß

    Mira

  • Nun gibt es Variablen, die funktionieren nicht, wenn man sie aus der Funktion heraus nimmt und an den Anfang verschiebt,

    z.B. let toolbaritem = aDocument.createXULElement('toolbarbutton'); […]


    Warum ist das so?

    Das sollte recht deutlich werden, wenn du deinen Blick nur auf diese Zeile und die darüber wirfst:

    JavaScript
    onBuild: function(aDocument) {
      let toolbaritem = aDocument.createXULElement('toolbarbutton');

    Du befindest dich in einer Funktion, welcher du den Parameter aDocument übergibst. In der Funktion wendest du

    createXULElement() auf eben dieses übergebene Element an. Wohin möchtest du die Zeile also verschieben? Außerhalb dieser Funktion existiert aDocument doch gar nicht.

    aber auch let props = ... kann man nicht "rausnehmen".

    Funktioniert bei mir. Da du dort allerdings auf currentProfileDirectory zugreifst, darf das natürlich auch erst nach dessen Definition folgen.

    Ob das wirklich etwas für die Übersichtlichkeit macht, sei mal hingestellt. Zum einen ist das für mich etwas Internes, was für die Funktionsweise des Scripts benötigt wird, und nicht wirklich der Konfiguration des Scripts dient. Da würde ich verstehen, wieso man das am Anfang haben will. Zum anderen nimmst du damit auseinander, was logisch zusammengehört. Denn du kannst weder den Code darüber noch den darunter, der genau das nutzt, verschieben.

    Noch konfuser macht mich ein anders Script!

    Da kann ich gar keine Variable an den Anfang verschieben und aus der Fuktion nehmen.

    Bitte präzisiere, was genau du verschieben möchtest. Die Erklärung dürfte ansonsten vermutlich eh die gleiche wie beim ersten Script sein.

  • Danke für Deine Erklärungen.

    Ich hatte mir in etwa so etwas schon gedacht, dass es da Abhängigkeiten gibt.

    Nur mangels Wissen was JavaScript betrifft mir nicht genau erkären können.

    Jetzt weiß ich es. Danke.

    Noch konfuser macht mich ein anders Script!

    Da kann ich gar keine Variable an den Anfang verschieben und aus der Fuktion nehmen.

    Bitte präzisiere, was genau du verschieben möchtest. Die Erklärung dürfte ansonsten vermutlich eh die gleiche wie beim ersten Script sein.

    Nun, die Funktion steht in diesem Script gleich zu Anfang!

    Zeile 2 (function nbbut() {

    Wenn ich diese ((function nbbut() {) aber wie im anderen Script erst in Zeile 11 aufrufe, funktioniert das ganze Script nicht mehr!

    Vergleiche:

    So funktioniert das Script!

    Und so ...

    ... nicht mehr! :/

    Aber es ist doch genau so aufgebaut wie das Script Button_PersonalToolbar.uc.js

    welches ja genauso einwandfrei funktioniert!

    Wobei ich anmerken muss, dass das Javascript Button_PersonalToolbar.uc.js zum Testzeitpunkt

    auch aktiv war.

    Könnte es also sein, dass sich beide Scripts ins Gehege kommen?

    Mit <3lichem Gruß

    Mira

  • OK.

    So funktioniert das Script.

    Und so dann nicht mehr!

    Mit <3lichem Gruß

    Mira

    Einmal editiert, zuletzt von Mira_Belle (14. Januar 2023 um 15:26)

  • OK.

    So funktioniert das Script.

    Und so dann nicht mehr!

    Beide Skript-Versionen funktionieren hier. Warum eine Version bei dir funktioniert und die andere nicht, weiß ich nicht? Wenn es bei dir nicht geht, dann liegt das aber wahrscheinlich an deiner 'userChrome.css' oder einem anderen Skript und an den dortigen Einstellungen für die Nav-Bar.

    Wenn du die Variablen-Definitionen in den globalen Skript-Gültigkeitsbereich ziehst, dann ändert sich an der Funktionalität erst mal nichts, außer, dass es schlechter Programmierstil ist, überhaupt globale Variablen zu verwenden, wenn man sie auch lokal in einer Funktion oder einem Block{} definieren kann. Der Interpreter arbeitet einfach das Skript sequentiell beginnend mit der ersten Anweisung ab, es wird also kein Einstiegspunkt (z.B. main() in C/C++) vorausgesetzt, da schon die Skriptdatei als eigener, globaler Block definiert ist. Bei der Größe und Komplexität der hier üblicherweise geschriebenen Skripte ist das egal, aber wenn ein Skript umfangreicher wird, dann können globale Variablen gerade bei der Fehlersuche durchaus problematisch werden...

    Gruß BrokenHeart

    "success has many fathers, failure is an orphan"

  • @ BrokenHeart

    Danke für Deine Mühe mir es zu erklären, aber ich verstehe nur Bahnhof!

    Sollten die Variablen nun so wie im ersten Beispiel vor der Funktion stehen,

    oder eher in der Funktion?

    Wenn ich Dich richtig verstanden habe, dann wohl eher in der Funktion, oder?

    Und wie ich dann vermute, ist es so, wie ich oben schon schrieb, beide Scripte kommen sich mit ihren Variablen ins Gehege.

    Z.b.

    Das wären dann gleich drei Stolpersteine, richtig?

    Denn wenn ich mir überlege beide Scripte in eine Datei zuschreiben, ...

    Das kann ja dann nicht gut gehen.

    Mit <3lichem Gruß

    Mira

    Einmal editiert, zuletzt von Mira_Belle (4. Januar 2023 um 22:04)

  • Sollten die Variablen nun so wie im ersten Beispiel vor der Funktion stehen,

    oder eher in der Funktion?

    Wenn ich Dich richtig verstanden habe, dann wohl eher in der Funktion, oder?

    Du kannst grundsätzlich alles machen, was funktioniert. Mein persönlicher Ansatz wäre aber, dass ich den Gültigkeitsbereich von Variablen immer so eng halte wie möglich. Das vermeidet am besten unerwünschte Nebeneffekte und ist aus meiner Sicht auch übersichtlicher. Eine Ausnahme für Optionen, welche das Script konfigurieren und die man zentral am Anfang des Scripts sammeln möchte, würde ich aber verstehen.

  • Also ich glaube, Ihr wollt mir verklickern, dass mein Ansatz die Variablen vor die Funktion zu stellen,

    nicht so prickelnd war.

    Ist es denn dann besser den Code so:

    oder so:

    ... zu schreiben?

    Mit <3lichem Gruß

    Mira

  • Danke Sören.

    Wieder etwas gelernt, so hoffe ich. ;)

    1.) Die Prüfung auf browser.xul werde ich so dann in all meinen Scripten entfernen. Erledigt.

    2.) Und das mit den Variablen dann auch gleich umsetzen. Auch erledigt.

    Mit <3lichem Gruß

    Mira

    2 Mal editiert, zuletzt von Mira_Belle (4. Januar 2023 um 23:42)

  • Hi,

    ich habe weitere Fragen!

    In diesem Script bekomme ich es nicht hin, mein neues Wissen um die Pfadangaben umzusetzen!

    Das JavaScript:

    Wie man unschwer erkennen kann, gibt es hier einen absoluten Pfad!

    button.style.listStyleImage = 'url("file:///C:/Users/Mira/AppData/Roaming/Mozilla/Firefox/Profiles/iff60u96.default-release/chrome/icons/UpDate.png")';

    Diesen hätte ich aber gerne mittels Variablen umgestaltet.

    Entweder so ...

    JavaScript
    let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
    let buttonicon = "UpDate.png";
    button.style.listStyleImage = "url('" + ProfilePath + buttonicon + "');"

    oder so ...

    JavaScript
    let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/"); 
    let buttonicon = "UpDate.png";
    button.style.listStyleImage = 'url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',

    Aber, es funktioniert nicht!

    D.h. das Symbol wird nicht angezeigt, ein Button aber erstellt.

    Was ist Falsch? Warum wird das Symbol nicht angezeigt?

    Ich habe auch schon beide Varianten so abgeändert, dass der Dateiname verwendet wurde,

    also so: button.style.listStyleImage = "url('" + ProfilePath + "UpDate.png" + "'));"

    und so: button.style.listStyleImage = 'url("' + ("file:" + currentProfileDirectory + "/chrome/icons/UpDate.png" ) + '");',

    Gleiches Resultat!

    Button ja, aber ohne Symbol.

    PS:

    Auch ...

    button.style.listStyleImage = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB9klEQVR42o2TP2gTURzHvwcRXqDDCzi8gww+cfACBRsoJAWXji0KzZFBxUELDoouOmnG6JQiWOogVAcpHUpvKDRLQbekoKRDJXHyLYHLIOQNhXtgBt+7u+SSpkq+w93xu9/vw++vhVj0MiUOyzicEo5LuFh/ACGV6PT6HflbKmOyzINnGdt5kPOKnBYxg5pCNu99apdEt9cLAYdPi4cr8+kVDGYJ10oB3mlQdzebqxZnlLZf5vsEwYzRkRTSyL1pZSznCuPtZ/zXlMcNV9e2FH2LBvCjDrAFoNsYueTeiashoPV4EkDWNrSzA/ltP2rwohumjZ9foI5qI7/8+yHgkT0CkGvLwK0q5KYLovzIWK6BXNf2754GVBPABz8GPEwAithQKQJ6JmJiBmqOQekGEyUTqAF8HALuJwDML4OY2gcK6us2EPQj+811Xf+J7kcrAXwOAZS37oyVcLsCFO5CHXvAQSWyLZaist6ugvRFAtg1gOw0QJrGFXTQmYyMcxRytwJyWp8YVAIoj/eAhoHh24nH2GmADHT95yad39MApm+gUbZ9OwVq1mNyWeKsppaEwB9ALu35drjKzwvs1YuFdHXa8V9bCNROgsrGce91CDCX6GbJkxJPr9sE9v+CfQXfE8H2fldtmYu0xn8a0IUZn0tgeMpGfwErbLqeHktDngAAAABJRU5ErkJggg==)';

    ... funktioniert.

    Mit <3lichem Gruß

    Mira

    Einmal editiert, zuletzt von Mira_Belle (7. Januar 2023 um 00:06)

  • Meine Version sieht so aus:

    Vielleicht kannst du daraus etwas ableiten.

  • Vielleicht kannst du daraus etwas ableiten.

    Sehr gute Idee, das mit der customisation area :!:

    Habe ich genau so mal übernommen.

    Aber leider ändert sich am Ergebnis bei beiden Varianten nichts. X(

    Button ist vorhanden, aber ohne Symbol :!:

    || ;(

    Mit <3lichem Gruß

    Mira

  • Ein Fehler könnten die auskommentierten Zeilen 29+30 sein.

    Habe deine Vers. getestet, funzt tatsächlich bei mir auch nicht.

    Da muss noch irgendwo ein anderer Fehler in deinem Script stecken.

    Viel spaß bei der Suche, oder eben noch einmal ganz von vorne anfangen.

    So, nun habe ich selber einen Fehler gemacht und vergessen deinen Pfad zu ersetzen.

    Bei mir funktioniert deine Version genauso wie meine! Ich tippe mal auf die Schreibweise des Namens des Icons?

    4 Mal editiert, zuletzt von visoer (7. Januar 2023 um 12:29) aus folgendem Grund: Noch nicht ganz wach

  • Bin der Sache einen Schritt näher gekommen!

    Ein Fehler ist das Semikolon am Ende der Variablendefinition.

    Diese Version funktioniert.


    Und diese entgüldige, nach einigen Tests, auch :!:

    Jetzt muss ich nur noch schauen, was ich versehentlich so verändert habe,

    dass es plötzlich funktioniert. :D

    Mit <3lichem Gruß

    Mira

    2 Mal editiert, zuletzt von Mira_Belle (7. Januar 2023 um 14:07)

  • AH :!:

    Wieder einmal die Zeichensetzung.

    Siehe: button.style.listStyleImage = "url('" + ProfilePath + buttonicon + "');"

    und: button.style.listStyleImage = "url('" + profilePath + buttonIcon + "')";

    So etwas passiert, wenn man keine Ahnung von JavaScript hat.

    Mira, also besser gugge!

    Mit <3lichem Gruß

    Mira

  • Und wieder eine Frage zu JavaScript, bzw. zu dem Ort, wo sie stehen sollen.

    Z.Z. befinden sich bei mir in chrome nur noch JavaScript-Dateien.

    Ist es möglich diese in ein Unterverzeichnis zu verschieben und in chrome

    nur ein Script welches auf dieses Unterverzeichnis "verlinkt"?

    Es sind natürlich userChrome.css, userChromeShadow.css, userContent.css noch in chrome,

    und die müssen da auch bleiben.

    Ich vermute, dass auch userChrome.js und userChromeShadow.uc.js dort verbleiben müssen.

    Mit <3lichem Gruß

    Mira

  • Hallo Mira_Belle

    Erstmal toller Avatar, klasse Bild!!!!

    Zu deiner Frage was Scripte betrifft, hängt es davon ab was Du
    in der Datei userChrome.js stehen hast.

    Wenn Du nur, wie hier, den einzeiler verwendest,

    userChrome.import("*", "UChrm");

    dann müsste man nur den Pfad anpassen auf den gewünschten Unterordner.
    Dann kannst Du alle Scripte, also alles mit .uc.js am Ende, dort hin verschieben.

    userChrome.css, userChromeShadow.css, userContent.css und userChrome.js

    Müssen aber immer in Ordner Chrome bleiben.

    Hoffe, das hilft dir weiter.

    Mfg.
    Endor

    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0
    OS: Windows 10 pro 64 bit und Windows 10 Home 64 bit
    Meine Scripte Sammlung: https://github.com/Endor8/userChrome.js
    Kein Support per PN. Fragen bitte im Forum stellen!

  • userChrome.import("*", "UChrm");

    (Wie) Kann man auch (wie in der userChrome.css) die einzelnen zu importierenden Files benennen?

    Dann könnte man nämlich dafür sorgen, daß die Scripte "in der richtigen Reihenfolge" nach und nach abgearbeitet werden und sich nicht in die Quere kommen können.

    :/ Nur so eine Idee, die mir beim Lesen dieses Threads kam...

    W11 Home 64bit - FF133.x