Luggi: scope in switch-konstrukt?!?

hallo,

ich habe ein objekt entworfen, das private- und public-member hat (closure).
dabei gibt es eine private eigenschaft testArray, die folgendermaßen definiert ist:
  var testArray = new Array (27 string-Werte);

außerdem gibt es eine routine, die den inhalt des arrays ändern soll. in dieser routine soll der neue inhalt des arrays von einer fallunterscheidung mit switch abhängig gemacht werden.

das problem:
wenn ich den inhalt des array in dem switch-konstrukt ändern will, kommt folgende fehlermeldung:
 NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7

wenn ich den inhalt testeshalber außerhalb von switch verändere, funktioniert es?

meine frage: wie ist das zu erklären, gibt es da irgendwelche scope-besonderheiten, von denen ich nichts weiss?

danke im voraus,
luggi

  1. meine frage: wie ist das zu erklären, gibt es da irgendwelche scope-besonderheiten, von denen ich nichts weiss?

    Das läßt sich so nicht erklären und auch nicht nachvollziehen.

    Struppi.

  2. Hallo,
    ich habe die Ursache des Problems selbst rausgefunden und man wäre auch so nicht draufgekommen (da ich euch keinen code gegeben habe):
    Ich habe dem Array strings zugewiesen, die &szlig, ä etc. enthalten haben, da ich dachte, so die charset-Unabhängigkeit zu erreichen.

    Allerdings habe ich noch zwei Fragen:
    1. was bewirkt & in einem string, bzw. wie ist das Phänomen jetzt zu erklären
    2. bekomme ich Probleme mit unterschiedlichen charsets, wenn ich ä,ö,ü,etc. in meinen strings in document...innerHTML schreibe

    danke schonmal,
    Luggi

    1. Allerdings habe ich noch zwei Fragen:

      1. was bewirkt & in einem string, bzw. wie ist das Phänomen jetzt zu erklären

      Gar nichts, es ist einfach ein kaufmännisches-und Zeichen.

      1. bekomme ich Probleme mit unterschiedlichen charsets, wenn ich ä,ö,ü,etc. in meinen strings in document...innerHTML schreibe

      Ja, bekommst du.

      Struppi.

      1. Hallo Struppi,

        Gar nichts, es ist einfach ein kaufmännisches-und Zeichen.

        Der Fehler liegt definitiv am &-Zeichen! Wenn ich alle &s entferne, funktioniert mein Code einwandfrei. Füge ich das &-Zeichen ein, kommt besagte Fehlermeldung!

        jetzt endlich mal ein Code-Auszug vom Script und meiner Testseite:

          
        var TestObject = (function() {  
        //--- private part ---  
          var testArray = new Array('Text 1', 'Text 2', 'Text 3', 'Text 4',  
                                    'Text 5', 'Text 6', 'Text 7');  
        //--- public part ---  
        return {  
        //public methods  
          //getter-routine for the array  
          getTestArray: function() {return testArray;},  
          
          switchTestArray: function(Param) {  
            switch(Param) {  
              case 'Typ 1':  
        	var test = new Array('1', 'a', 'H', '>', 'ä', '"', '#');  
        	testArray = test;  
        	break;  
              case 'Typ 2':  
                var test = new Array('&', 'ö', 'ä', 'ü', 'e', 'f', 'G');  
        	testArray = test;  
                break;  
              default:  
                break;  
            }	  
            return true;  
          }}  
        })();  
        
        
          
        <html>  
        <head>  
        <!-- andere scripts werden hier eingebunden -->  
        <script type="text/javascript">  
        /*testSwitchTestArray*/  
            function testSwitchTestArray() {  
              if (!TestObject) {  
                document.getElementById("test_Switch").innerHTML = "Error: TestObject does not exist!";  
                return false;  
              }  
              document.getElementById("before_Switch").innerHTML = "Old Array: " + TestObject.getTestArray();  
        		  
              if (TestObject.switchTestArray('Typ 1') == false)  
        	document.getElementById("after_Switch1").innerHTML = "New array 1: Error";  
              else  
                document.getElementById("after_Switch1").innerHTML = "New array 1: " + TestObject.getTestArray();  
              if (TestObject.switchTestArray('Typ 2') == false)  
        	document.getElementById("after_Switch2").innerHTML = "New array 2: Error";  
              else  
                document.getElementById("after_Switch2").innerHTML = "New array 2: " + TestObject.getTestArray();  
        	  return true;  
            }  
        </script>  
          
        </head>  
        <body>  
         <div>  
         <p class="TestName">Test der SwitchTestArray-Methode:</p>  
         <p>Bei diesem Test sollten sich die Eigenschaften zweimal &auml;ndern!</p>  
         <input type="button" name="Test" onclick="testSwitchTestArray();" value="Testen" />  
         <p class="TestData" id="test_Switch">  
           <span id="before_Switch"></span><br />  
           <span id="after_Switch1"></span><br />  
           <span id="after_Switch2"></span><br />  
         </p>  
         </div>  
        </body>  
        </html>  
          
        
        
        1. Hi,

          Der Fehler liegt definitiv am &-Zeichen! Wenn ich alle &s entferne, funktioniert mein Code einwandfrei. Füge ich das &-Zeichen ein, kommt besagte Fehlermeldung!

          Dein Problem ist nicht nachvollziehbar.

          Wenn ich deine Code-Schnippsel in ein XHTML-Gerüst einbaue, dann bekomme ich beim Klicken des Buttons folgende Ausgabe:

          Old Array: Text 1,Text 2,Text 3,Text 4,Text 5,Text 6,Text 7
          New array 1: 1,a,H,>,ä,",#
          New array 2: &,ö,ä,ü,e,f,G

          Von Fehlermeldungen keine Spur. (Getestet in Firefox 3.0.4 mit Firebug unter Vista.)

          MfG ChrisB

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
          1. Hi

            Dein Problem ist nicht nachvollziehbar.

            Mein Fehler, meine Angaben waren einfach zu unpräzise, da ich den Fehler wo anders vermutet habe und die eigentliche Fehlerquelle nicht gepostet habe.

            Wenn ich deine Code-Schnippsel in ein XHTML-Gerüst einbaue...

            Das Problem ist, dass ich den Namensraum meiner Testumgebung folgendermaßen definiert habe und die Datei als .xhtml gespeichert habe:

              
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
              
            <html xmlns="http://www.w3.org/1999/xhtml">  
            
            

            Wenn ich den Namensraum nur <html> nenne und die Datei als .html speichere, funktioniert es, ansonsten tritt der anfangs genannte Fehler in Safari auf, in Firefox kommt folgende Meldung:
            Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMNSHTMLElement.innerHTML]"  nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"  location: "JS frame :: file:///C:/Documents%20and%20Settings/ludwig/Desktop/test.xhtml :: testSwitchTestArray :: line 50"  data: no]

            weiss jemand Rat? Wenn ich zu wenig Informationen gebe, fragt mich bitte - ich kann die logische Ursache des Problems einfach nicht finden und es fällt mir daher schwer, w/r-ichtige Infos zu geben...

            danke vielmals,
            Luggi

            1. Hi,

              Das Problem ist, dass ich den Namensraum meiner Testumgebung folgendermaßen definiert habe und die Datei als .xhtml gespeichert habe:

              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

              <html xmlns="http://www.w3.org/1999/xhtml">

              
              >   
              > Wenn ich den Namensraum nur <html> nenne und die Datei als .html speichere, funktioniert es, ansonsten tritt der anfangs genannte Fehler in Safari auf, in Firefox kommt folgende Meldung: [...]  
                
              Und wie hast du deinen JavaScript-Code dort eingebunden?  
              So, wie es sich für XHTML gehört?  
                
              MfG ChrisB  
                
              
              -- 
              Light travels faster than sound - that's why most people appear bright until you hear them speak.
              
              1. Abend,

                Und wie hast du deinen JavaScript-Code dort eingebunden?
                So, wie es sich für XHTML gehört?

                So:
                <script src="testObject.js" type="text/javascript">
                </script>

                ist das falsch, oder richtig? application/javascript hab ich auch getestet...

                danke fürs Aufklären,
                Luggi

                1. Hi,

                  Und wie hast du deinen JavaScript-Code dort eingebunden?
                  So, wie es sich für XHTML gehört?

                  So:
                  <script src="testObject.js" type="text/javascript">
                  </script>

                  Du hast es also komplett ausgelagert?
                  In deinem Beispiel vorhin war auch noch ein SCRIPT-Element im HEAD.

                  ist das falsch, oder richtig?

                  http://de.selfhtml.org/html/xhtml/unterschiede.htm

                  MfG ChrisB

                  --
                  Light travels faster than sound - that's why most people appear bright until you hear them speak.
                  1. Nacht,

                    Du hast es also komplett ausgelagert?
                    In deinem Beispiel vorhin war auch noch ein SCRIPT-Element im HEAD.

                    Nein, ich habe ihn nicht komplett ausgelagert, sondern lediglich das script (den ersten code-schnipsel, wie durch den kommentar angedeutet). das zweite script befindet sich nach der einbindung des ersten scripts im head-teil.
                    und ja ich habe

                    http://de.selfhtml.org/html/xhtml/unterschiede.htm

                    gelesen, sogar lange bevor ich hier gepostet habe und lange bevor ich das problem hatte (ich hoffe ich habe nichts überlesen). allerdings hat das setzten von <![CDATA[... auch nichts zur lösung beigetragen.

                    ich steh echt auf der leitung, helft mir runter,

                    Luggi

                    1. ich steh echt auf der leitung, helft mir runter,

                      Tja, wenn du uns nicht hilfst, dann wird das nichts. Zeig uns ein Beispiel wo dein Problem deutlich wird.

                      Struppi.

                      1. Mittach,

                        Tja, wenn du uns nicht hilfst, dann wird das nichts. Zeig uns ein Beispiel wo dein Problem deutlich wird.

                        meine testumgebung 'test.xhtml':

                          
                        <?xml version="1.0" encoding="UTF-8"?>  
                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
                           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
                        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" dir="ltr">  
                        <head>  
                          <meta http-equiv="content-language" content="de" />  
                          <meta http-equiv="ontent-script-type" content="text/javascript" />  
                          <meta http-equiv="content-style-type" content="text/css" />  
                          <title>Test der Objekt-Arbeitsweise</title>  
                          <script src="testObjects.js" type="application/javascript">  
                          </script>  
                          <script type="text/javascript">  
                          /* <![CDATA[ */	  
                        /*testSwitchTestArray*/  
                            function testSwitchTestArray() {  
                              if (!TestObject)  
                        	  {  
                        	    document.getElementById("test_Switch").innerHTML = "Error: TestObject does not exist!";  
                                return false;  
                        	  }  
                        	  document.getElementById("before_Switch").innerHTML = "Old Array: " + TestObject.getTestArray();  
                        		  
                        	  if (TestObject.switchTestArray('Typ 1') == false)  
                        	    document.getElementById("after_Switch1").innerHTML = "New array 1: Error";  
                              else  
                            	document.getElementById("after_Switch1").innerHTML = "New array 1: " + TestObject.getTestArray();  
                              if (TestObject.switchTestArray('Typ 2') == false)  
                        	    document.getElementById("after_Switch2").innerHTML = "New array 2: Error";  
                              else  
                            	document.getElementById("after_Switch2").innerHTML = "New array 2: " + TestObject.getTestArray();  
                        	  return true;  
                            }  
                            /* ]]> */  
                         </script>  
                        </head>  
                        <body>  
                         <div>  
                         <p class="TestName">Test der SwitchTestArray-Methode:</p>  
                         <p>Bei diesem Test sollten sich die Eigenschaften zweimal &auml;ndern!</p>  
                         <input type="button" name="Test" onclick="testSwitchTestArray();" value="Testen" />  
                         <p class="TestData" id="test_Switch">  
                           <span id="before_Switch"></span><br />  
                           <span id="after_Switch1"></span><br />  
                           <span id="after_Switch2"></span><br />  
                         </p>  
                         </div>  
                        </body>  
                        </html>  
                        
                        

                        mein script 'testObjects.js':

                        var TestObject = (function() {  
                          var testArray = new Array('Text 1', 'Text 2', 'Text 3', 'Text 4',  
                                                    'Text 5', 'Text 6', 'Text 7');  
                          return {  
                          getTestArray: function() {return testArray;},  
                          
                          switchTestArray: function(Param) {  
                            if (!Param)  
                        	  return false;  
                        	if ((Param != 'Typ 1') && (Param != 'Typ 2'))  
                        	  return false;  
                        	  
                        	switch(Param) {  
                        	  case 'Typ 1':  
                        	    var test = new Array('1', 'a', 'H', '>', 'ä', '"', '#');  
                        		testArray = test;  
                        	    break;  
                        	  case 'Typ 2':  
                        	    var test = new Array('&amp;', '&ouml;', '&auml;', '&uuml;', 'e', 'f', 'G');  
                        		testArray = test;  
                        	    break;  
                        	  default:  
                        	    break;  
                        	}  
                        	  
                        	return true;  
                          }  
                          } //return-ende  
                        }) ();
                        
                        1. Tja, wenn du uns nicht hilfst, dann wird das nichts. Zeig uns ein Beispiel wo dein Problem deutlich wird.

                          meine testumgebung 'test.xhtml':

                          Mir ist ehrlich gesagt nicht klar, was da deutlich werden soll. Ich hab zwei Fehlermeldungen, die ich aber nicht deuten kann:

                          Fehler: Nicht definierte Entität
                          Quelldatei:
                          Zeile: 1, Spalte: 231
                          Quelltext:
                          <html xmlns="http://www.w3.org/1999/xhtml"><body xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p xmlns="http://www.w3.org/1999/xhtml"><span xmlns="http://www.w3.org/1999/xhtml">New array 2: &amp;,&ouml;,&auml;,&uuml;,e,f,G</

                          Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMNSHTMLElement.innerHTML]"  nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"  location: "JS frame :: http://localhost/projekte/Javascript/tmp.xhtml :: testSwitchTestArray :: line 30"  data: no]

                          Aber ansonsten, wo ist das Problem?

                          Struppi.

                          1. Tach,

                            Aber ansonsten, wo ist das Problem?

                            hier:

                            Fehler: Nicht definierte Entität
                            Quelldatei:
                            Zeile: 1, Spalte: 231
                            Quelltext:
                            <html xmlns="http://www.w3.org/1999/xhtml"><body xmlns="http://www.w3.org/1999/xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p xmlns="http://www.w3.org/1999/xhtml"><span xmlns="http://www.w3.org/1999/xhtml">New array 2: &amp;,&ouml;,&auml;,&uuml;,e,f,G</

                            Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMNSHTMLElement.innerHTML]"  nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"  location: "JS frame :: http://localhost/projekte/Javascript/tmp.xhtml :: testSwitchTestArray :: line 30"  data: no]

                            oder wird bei dir im browser New Array 2:... angezeigt?
                            bei mir nicht und ich weiss nicht warum, bzw. warum die entität nicht definiert ist. außerdem ist mir nicht klar, woher der pointer-fehler kommt.
                            warum heißt der fehler in safari anders?

                            verwirrt von deiner frage,
                            Luggi

                            1. verwirrt von deiner frage,

                              Ich war verwirrt von deinem Code.
                              Ich kenn mich mit XML nicht aus, aber soweit ich das recherchiert habe, gibt es keine Entenities in XML, solange du sie nicht definierst. Wie und ob das geht weiß ich nicht, hier ein klleiner Hinweis:
                              http://forum.de.selfhtml.org/archiv/2006/3/t126535/,

                              Du hast also kein JS Problem sondern es ist ein XML Problem.

                              Struppi.