Deus Figendi: Opera (JAVASCRIPT) Unerwarteter Fehler: Expected '}'

Guten Abend,
ich schrieb ein kleines GreaseMonkey-JavaScript, welches mich (und andere) bei der Eingabe von Daten ins CMS unterstützt. (Ich hatte dazu hier im Forum auch eine Frage gestellt, bei der mir gut geholfen wurde)
Das Script läuft soweit gut und erfolgreich, aber nicht nur ich, sondern auch die anderen Redakteure sollen davon profitieren, wie gesagt läuft es in GreaseMonkey problemlos und FireFox meldet auch keine Fehler (inzwischen ^^).
Nun ist es aber so, dass manche Redakteure auch Opera benutzen, naja, "kein Problem" dachte ich, denn ich hatte gelesen, dass Opera auch GM-Scripts verarbeitet. Also flux Opera herunter geladen, installiert, ein wenig umgeschaut, wie man da GM-Scripts zum Laufen bringt und... Fehler!
Opera-Fehlerkonsole meldet:

JavaScript
User JS compilation
Syntax error C:\Dokumente und Einstellungen\Deus Figendi\Anwendungsdaten\Mozilla\Firefox\GeaseMonkeyScripts\Rezidaten.user.js: line 195 of User JS script :
Expected token: '}'
n(e) { fill_value(this,e,name_prefix); } ,false);
-------------------------------------------------^

Aber ich kann diesen Fehler beim Besten Willen nicht nachvollziehen. Es scheint keinen Klammer-Fehler zu geben... der zutreffende Code ab Zeile 187 (an dieser Stelle ist keine Klammer offen, oberste Ebene) lautet:

if (document.getElementsByName(name_prefix+"[rating]_hr")[0] && document.getElementsByName(name_prefix+"[ISBN]")[0] && document.getElementsByName(name_prefix+"[price]")[0]) {  
 //Wir haben es mit Rezension-Dateneingabe zu tun  
 if (document.getElementsByName(name_prefix+"[title]_hr")[0].value == "") {  
  var rezi_title = get_rezititle_from_headline (document.getElementById("typo3-inner-docbody").childNodes[5].firstChild.firstChild.childNodes[1].childNodes[6].firstChild.data);  
  document.getElementsByName(name_prefix+"[title]_hr")[0].value = rezi_title;  
  document.getElementsByName(name_prefix+"[title]")[0].value = rezi_title;  
 }  
 document.getElementsByName(name_prefix+"[rating]_hr")[0].addEventListener("keyup", function(e) { check_dot2(this,e,name_prefix); } ,false);  
 document.getElementsByName(name_prefix+"[rating]_hr")[0].addEventListener("blur", function(e) { fill_value(this,e,name_prefix); } ,false);  
}

Bei bedarf kann ich die Zeilen auch kommentieren.
Das komplette Script kann man außerdem unter http://www.dnd-gate.de/~deus/Tech_Help/Rezidaten.user.js einsehen.

Wie gesagt, mir ist der Fehler nicht erklärlich und das Script läuft leider auch nicht trotz Fehler oder so... ist das Problem vielleicht bekannt? Übersehe ich etwas? Gibt es ein Workaround?

Gruß und vielen Dank Deus Figendi

--
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
  1. Hallo,

    Hast du ne Online-Demo (nachgebautes Form ,ganz einfach gehalten) und das eingebundene Skript, damit mans mal mit dragonfly durchgehen kann? wenn nicht, benutz du doch dragonfly (firebog a la opera) oder bau firebug lite in die seite ein, das funktioniert auch unter Opera...

    mfg, Flo

    --
    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
    1. Hallo,

      Hallo

      Hast du ne Online-Demo (nachgebautes Form ,ganz einfach gehalten) und das eingebundene Skript, damit mans mal mit dragonfly durchgehen kann? wenn nicht, benutz du doch dragonfly (firebog a la opera) oder bau firebug lite in die seite ein, das funktioniert auch unter Opera...

      Von hinten nach vorne :)
      Firebug lite: Geht nicht, bin nicht Administrator und Admin hat chronischen Zeitmangel.
      Dragonfly: Das einzige was ich dazu gefunden habe ist ein OS... meinst du das? Ansonsten wäre ein Link hilfreich.
      Demo: Joa, mach' ich, Moment bitte :)

      --
      sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
      1. Hallo,
        Hallo

        Hallo,

        Firebug lite: Geht nicht, bin nicht Administrator und Admin hat chronischen Zeitmangel.

        aso ok.

        Dragonfly: Das einzige was ich dazu gefunden habe ist ein OS... meinst du das? Ansonsten wäre ein Link hilfreich.

        hier

        Demo: Joa, mach' ich, Moment bitte :)

        gut.

        mfg, Flo

        --
        sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
        1. Demo: Joa, mach' ich, Moment bitte :)
          gut.

          Demo
          In FireFox läuft es wie erwartet
          _in Opera erscheint jetzt ein anderer Fehler_

          --
          sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
          1. _in Opera erscheint jetzt ein anderer Fehler_

            get_rezititle_from_headline (document.getElementById("typo3-inner-docbody").childNodes[5].firstChild.firstChild.childNodes[1].childNodes[6].firstChild.data);

            Die siebenunddreißig Annahmen, die du in dieser Zeile stillschweigend über den DOM-Knotenbaum machst, gehen an irgendeiner Stelle fehl. Vermutlich ist irgendein Whitespace-Textknoten (nicht) dort, wo du ihn (nicht) vermutest.
            Wenn man solche DOM-Baum-Hangel-Monster notiert, ist das eigentlich kein Wunder. Opera kann z.B. XPath (document.evaluate), damit ist ein Ansprechen von Elementen im Baum genauer möglich.

            Mathias

            1. Oh Mist, hatte eben wohl auf nur auf Vorschau detippt...

              Die siebenunddreißig Annahmen, die du in dieser Zeile stillschweigend über den DOM-Knotenbaum machst, gehen an irgendeiner Stelle fehl. Vermutlich ist irgendein Whitespace-Textknoten (nicht) dort, wo du ihn (nicht) vermutest.
              Wenn man solche DOM-Baum-Hangel-Monster notiert, ist das eigentlich kein Wunder.

              Da hast du natürlich Recht, ich habe es in der Demo komplett entfernt (durch statischen Text ersetzt) und im Original-Script greife ich jetzt über getElementsByTagName zu, was ja präziser sein sollte.

              Die Demo arbeitet jetzt auch fehlerfrei, aber das User-Script...
              In meiner Verzweiflung habe ich das komplette Script auskommentiert und dann Stück für Stück wieder rein genommen. Entweder zeigte mir Opera keinen Fehler oder "Expected statement". Alles sehr verwirrend.
              Jetzt habe ich das komplette Script auskommentiert, es schaut jetzt so aus:

              // ==UserScript==  
              // @name           Typo3-Hilfe  
              // @namespace      http://www.dnd-gate.de  
              // @description    Hilfe bei der Eingabe der Rezidaten, News und Seiteneinstellungen  
              // @include        http://www.dnd-gate.de/gate3/page/typo3/alt_doc.php?*  
              // @author         Deus Figendi  
              // @version        0.2  
              // @copyright      GPL  
              // ==/UserScript==  
                
              // CONFIGURATION:  
                
              var user_nickname = "Deus Figendi";  
              /*  
              DER GESAMTE SCRIPT-CODE  
              */  
              alert (user_nickname);
              

              Und man glaubt es nicht, _ich erhalte einen Fehler!_
              Expected token: ')'
              alert (user_nickname
              --------------------^
              Aber die erwartete Klammer steht doch da!? Ich werde aus diesem Browser nicht schlau :(

              --
              sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
              1. Und man glaubt es nicht, _ich erhalte einen Fehler!_

                Kapsel das mal weg und notiere keine globale Variablen.

                (function () {
                   //dein code
                })();

                http://www.opera.com/browser/tutorials/userjs/using/

                Mathias

  2. JavaScript
    User JS compilation
    Syntax error C:\Dokumente und Einstellungen\Deus Figendi\Anwendungsdaten\Mozilla\Firefox\GeaseMonkeyScripts\Rezidaten.user.js: line 195 of User JS script :
    Expected token: '}'
    n(e) { fill_value(this,e,name_prefix); } ,false);
    -------------------------------------------------^

    Da narrt dich Opera sicher.

    Notiere die Funktionen mal mit normalen Funktionsdeklarationen (benannten Funktionen), und schreibe dann
    el.addEventListener("eventtype", funktionsname, false);
    Wenn du den Quellcode so strukturierst, kommst du dem Teil, der den Fehler tatsächlich auslöst, eher auf die Spur.

    if (document.getElementsByName(name_prefix+"[rating]_hr")[0] && document.getElementsByName(name_prefix+"[ISBN]")[0] && document.getElementsByName(name_prefix+"[price]")[0]) {

    //Wir haben es mit Rezension-Dateneingabe zu tun
    if (document.getElementsByName(name_prefix+"[title]_hr")[0].value == "") {
      var rezi_title = get_rezititle_from_headline (document.getElementById("typo3-inner-docbody").childNodes[5].firstChild.firstChild.childNodes[1].childNodes[6].firstChild.data);
      document.getElementsByName(name_prefix+"[title]_hr")[0].value = rezi_title;
      document.getElementsByName(name_prefix+"[title]")[0].value = rezi_title;
    }
    document.getElementsByName(name_prefix+"[rating]_hr")[0].addEventListener("keyup", function(e) { check_dot2(this,e,name_prefix); } ,false);
    document.getElementsByName(name_prefix+"[rating]_hr")[0].addEventListener("blur", function(e) { fill_value(this,e,name_prefix); } ,false);
    }

      
    Himmel! Wenn du dich nicht ständig wiederholen würdest und alle Befehle siebenmal ausführen würdest, wäre der Code auch lesbar. Führe getElementById, getElementsByName(...)[x] usw. einmal aus und speichere den Rückgabewert in einer Variablen, die du immer wieder nutzt.  
      
    Dann lass dir bei der Gelegenheit auch gleich mal die Variablen ausgeben, mit alert() oder [opera.postError()](http://dev.opera.com/articles/view/how-to-debug-javascript-problems-with-op/).  
      
    Mathias
    
    -- 
    [JavaScript-Erweiterung für das SELFHTML-Forum](http://forum.de.selfhtml.org/js/doku/)
    
    1. Hallo

      Himmel! Wenn du dich nicht ständig wiederholen würdest und alle Befehle siebenmal ausführen würdest, wäre der Code auch lesbar. Führe getElementById, getElementsByName(...)[x] usw. einmal aus und speichere den Rückgabewert in einer Variablen, die du immer wieder nutzt.

      Ein sehr guter Tipp, den ich künftig beherzigen werde.
      Ich konnte das Problem inzwischen lokalisieren, wenn auch noch nicht lösen (da setze ich mich gleich dran). Dazu schreibe ich aber noch ein Extra-Posting.

      --
      sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
  3. Guten Morgen,
    dank aufwändigen entfernen, auskommentieren, hinzufügen, umlagern und was weiß ich noch alles im Code konnte ich das Problem jetzt auf die Funktion "check_dot2" festnageln.

    function check_dot2 (cd_object,cd_event,cd_prename) {  
     cd_object.value=cd_object.value.replace(/,/,".");  
     cd_object.value=cd_object.value.replace(/q/,"1");  
     cd_object.value=cd_object.value.replace(/w/,"1");  
     cd_object.value=cd_object.value.replace(/e/,"2");  
     cd_object.value=cd_object.value.replace(/r/,"3");  
     cd_object.value=cd_object.value.replace(/t/,"4");  
     cd_object.value=cd_object.value.replace(/z/,"5");  
     cd_object.value=cd_object.value.replace(/u/,"6");  
     cd_object.value=cd_object.value.replace(/i/,"7");  
     cd_object.value=cd_object.value.replace(/o/,"8");  
     cd_object.value=cd_object.value.replace(/p/,"9");  
     cd_object.value=cd_object.value.replace(/ü/,"0");  
     cd_object.value=cd_object.value.replace(/\+/,"0");  
     cd_object.value=cd_object.value.replace(/ß/,"0");  
     cd_object.value=cd_object.value.replace(/[^0-9\.]/,"");  
     document.getElementsByName(name_prefix+"[rating]")[0].value = cd_object.value;  
    }
    

    Was genau Opera daran stört und warum Opera sich sogar daran stört wenn ich es auskommentiere weiß ich noch nicht, aber wenn ich die Funktion entferne funktioniert das Script... naja also nicht wirklich, denn die Funktion fehlt ja, aber Opera schmeißt keine Fehler mehr.

    --
    sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
    1. Das ging schneller als erwartet...

      function check_dot2 (cd_object,cd_event,cd_prename) {

      cd_object.value=cd_object.value.replace(/,/,".");
      cd_object.value=cd_object.value.replace(/q/,"1");
      cd_object.value=cd_object.value.replace(/w/,"1");
      cd_object.value=cd_object.value.replace(/e/,"2");
      cd_object.value=cd_object.value.replace(/r/,"3");
      cd_object.value=cd_object.value.replace(/t/,"4");
      cd_object.value=cd_object.value.replace(/z/,"5");
      cd_object.value=cd_object.value.replace(/u/,"6");
      cd_object.value=cd_object.value.replace(/i/,"7");
      cd_object.value=cd_object.value.replace(/o/,"8");
      cd_object.value=cd_object.value.replace(/p/,"9");
      cd_object.value=cd_object.value.replace(/ü/,"0");
      cd_object.value=cd_object.value.replace(/+/,"0");
      cd_object.value=cd_object.value.replace(/ß/,"0");
      cd_object.value=cd_object.value.replace(/[^0-9.]/,"");
      document.getElementsByName(name_prefix+"[rating]")[0].value = cd_object.value;
      }

        
      Opra stört sich wohl am ü und am ß. Entferne ich diese Zeilen läuft das Script ohne Fehlermeldungen. Die beiden sind in diesem Falle nicht wichtig, also lasse ich sie einfach weg.  
      Ich hoffe mal Personen, die künftig auf } stoßen, welche erwartet werden geholfen zu haben, sucht nach Umlauten :)  
        
      Schönen Samstag noch und vielen Dank für die Tipps an alle.
      
      -- 
      sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ\_de:] zu:) fl:( ss:| ls:[ js:(
      
      1. Hi,

        cd_object.value=cd_object.value.replace(/ü/,"0");
        cd_object.value=cd_object.value.replace(/ß/,"0");

        Opra stört sich wohl am ü und am ß. Entferne ich diese Zeilen läuft das Script ohne Fehlermeldungen.

        In welcher Kodierung hast du das Script abgespeichert?
        Mit welcher Charset-Angabe liefert der Server die Scriptressource aus (sofern ausgelagert)?
        Hast du mal versucht, die Kodierung per charset-Attribut im Script-Element mit anzugeben?

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. In welcher Kodierung hast du das Script abgespeichert?

          ANSI glaube ich (sorry, habs gelöscht und neu angelegt, daher kann ichs nicht mit Bestimmtheit sagen).

          Mit welcher Charset-Angabe liefert der Server die Scriptressource aus (sofern ausgelagert)?

          Gar keine... hast du das OP nicht gelesen? Kein Server liefert irgendwas aus, die Datei liegt lokal vor und wird lokal ausgelesen und wird lokal vom Browser angewendet.

          Hast du mal versucht, die Kodierung per charset-Attribut im Script-Element mit anzugeben?

          Geht nicht, kein Script-Element vorhanden.

          Aber wie gesagt benötige ich die beiden Zeilen, welche Umlaute enthielten nicht. Im Gegenteil, ich hatte sie dort unnötigerweise eingetragen und ggf. in einer späteren Version des Scripts ohnehin gelöscht.
          Ein anderer Zeichensatz ist aber sicherlich auch ein Lösungsversuch.

          --
          sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
      2. Opra stört sich wohl am ü und am ß.

        Nimm UTF-8 als Kodierung oder maskiere diese Zeichen als Escape-Sequenzen mit der hexadezimalen Unicode-Zeichennummer:
        ü > \u00FC
        ß > \u00DF
        http://www.sql-und-xml.de/unicode-database/latin-1-supplement.html

        Mathias

        1. Opra stört sich wohl am ü und am ß.

          Nimm UTF-8 als Kodierung oder maskiere diese Zeichen als Escape-Sequenzen mit der hexadezimalen Unicode-Zeichennummer:
          ü > \u00FC
          ß > \u00DF
          http://www.sql-und-xml.de/unicode-database/latin-1-supplement.html

          Mathias

          Hätte ich gleich gewusst, dass es an den Umlauten liegt hätte ich das sicherlich probiert. Ich schreibe standard-mäßig in ANSI oder ISO-8859 um größtmögliche Kompatibilität zu erreichen. Nicht jede Software kann mit Unicode umgehen. Normalerweise benutze ich ja auch in keiner Sprache derartige Sonderzeichen... außer in Kommentaren und da stört sich normalerweise kein Interpreter oder Compiler dran, weil einfach alles ignoriert wird, was den Kommentar nicht beendet. In diesem Fall missfiel das Opera allerdings und auch die Validatoren würden auch falsche Zeichen in Kommentaren bemängeln (da kann man dann aber problemlos auf ue zurückgreifen).

          Wie man ein Sonderzeichenproblem behebt ist mir durchaus bekannt, dennoch vielen Dank euch beiden. Das Problem liegt hier vielmehr darin dass Opera eine falsche Fehlermeldung ausgibt (und daran, dass ich nicht an die Kodierung gedacht habe). Hätte da gestanden "unknown/invalid character in line 46" (oder wo das war) oder "non ANSI character: ???" oder sowas, dann wäre ja klar gewesen welche Art von Fehler das ist.
          Aber wie gesagt, ich bin auch gewohnt, dass auch Codierungs-Fehler in Kommentaren ignoriert werden, insofern war eben seltsam, dass der Fehler trotz Auskommentierung erhalten blieb, ich musste die Stellen tatsächlich entfernen, die ich sonst zur Fehlersuche eben nur auskommentiert hätte.

          --
          sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
          1. Yerf!

            Das Problem liegt hier vielmehr darin dass Opera eine falsche Fehlermeldung ausgibt (und daran, dass ich nicht an die Kodierung gedacht habe). Hätte da gestanden "unknown/invalid character in line 46" (oder wo das war) oder "non ANSI character: ???" oder sowas, dann wäre ja klar gewesen welche Art von Fehler das ist.

            Evtl. passieren da ähnlich seltsame Sachen wie beim IE. Der "verschluckt" nach einem falsch kodierten Umlaut ein paar nachfolgende Zeichen. Das ist besonders dann übel, wenn dadurch das Zeilenende mit verschwindet...

            Gruß,

            Harlequin

            --
            <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
            1. Das Problem liegt hier vielmehr darin dass Opera eine falsche Fehlermeldung ausgibt (und daran, dass ich nicht an die Kodierung gedacht habe). Hätte da gestanden "unknown/invalid character in line 46" (oder wo das war) oder "non ANSI character: ???" oder sowas, dann wäre ja klar gewesen welche Art von Fehler das ist.

              Evtl. passieren da ähnlich seltsame Sachen wie beim IE.

              Genau das Problem hatte ich auch, bei der Umstellung auf utf-8. Seltsame Fehlermeldungen wegen Umlauten in Kommentare. Offensichtlich gerät der Parser aus dem Tritt, daher auch keine entsprechenden Fehlermeldungen. Zumal woher soll der Interpreter Wissen, dass das illegale Zeichen sind? Wenn der Autor sagt, das Dokument ist in ISO und enthält in Wirklichkeit UTF Zeichen, ist das nicht erkennbar.

              Struppi.

              1. Yerf!

                Genau das Problem hatte ich auch, bei der Umstellung auf utf-8. Seltsame Fehlermeldungen wegen Umlauten in Kommentare. Offensichtlich gerät der Parser aus dem Tritt, daher auch keine entsprechenden Fehlermeldungen. Zumal woher soll der Interpreter Wissen, dass das illegale Zeichen sind? Wenn der Autor sagt, das Dokument ist in ISO und enthält in Wirklichkeit UTF Zeichen, ist das nicht erkennbar.

                Vor allem muss man hier noch zwischen dem JavaScript-Interpreter und dem Parser für die Zeichencodierung unterscheiden, da der Fehler in letzterem entsteht. Das sieht man ganz gut wenn man das VisualStudio[1] als JavaScript-Debugger zur Verfügung hat. Wenn man dort einen Haltepunkt setzt sieht man dann wärend dem Debuggen den *tatsächlichen* Code, wie ihn der JS-Interpreter verarbeitet. Ansonsten wär ich auch nie drauf gekommen worin das Problem liegt.

                Ein

                //Kommentar mit Umlautän  
                if (false)  
                {  
                 tuwas();  
                }
                

                wird dann zu

                //Kommentar mit Umlautif (false)  
                {  
                 tuwas();  
                }
                

                (wobei evtl. noch mehr Zeichen verschwinden, die genaue Anzahl hab ich nicht ermittelt)

                Gruß,

                Harlequin

                [1] keine Ahnung ob es da auch was billigeres zum JS-Debuggen im IE gibt...

                --
                <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                1. Ein

                  //Kommentar mit Umlautän

                  if (false)
                  {
                  tuwas();
                  }

                  
                  >   
                  > wird dann zu  
                  > ~~~javascript
                  
                  //Kommentar mit Umlautif (false)  
                  
                  > {  
                  >  tuwas();  
                  > }
                  
                  

                  Super, das erklärt dann auch die Fehlermeldungen von Deus.

                  Struppi.

                2. Das sieht man ganz gut wenn man das VisualStudio[1] als JavaScript-Debugger zur Verfügung hat.

                  [1] keine Ahnung ob es da auch was billigeres zum JS-Debuggen im IE gibt...

                  Microsoft Visual Web Developer 2008 Express Edition
                  http://www.microsoft.com/express/download/

                  Mathias