torsten: script invalid

moin!

ich habe folgendes javascript durch die jsFiddle geleiert:

window.onload = function()  
{  
// link mit id="bla" fokussieren  
var toFocus = document.getElementById(window.location.hash.substr(1));  
	if (toFocus)  
		toFocus.focus();  
// beim loesen der maustaste rahmen um link entfernen  
 for(i=0;i<document.links.length;i++)  
	{  
	document.links[i].onmouseup=function()  
		{  
		if(this.blur)  
			{  
			this.blur();  
			}  
		}  
	}  
};

und diese sagt mir:

Error:
Problem at line 6 character 9: Expected '{' and instead saw 'toFocus'.
toFocus.focus();
Problem at line 17 character 5: Don't make functions within a loop.
}
Problem at line 16 character 10: Missing semicolon.
}
Implied global: window 1,4, i 8,10

wäre nett wenn mir jemand verrät was das bedeutet und wie ich das gerade biegen kann? leider bin ich nicht der javascriptschlaubürger :(

mfg torsten

--
Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
  1. Hi,

    ich habe folgendes javascript durch die jsFiddle geleiert:

    Problem at line 6 character 9: Expected '{' and instead saw 'toFocus'.

    Das ist nur ein Hinweis, dass du die optionalen Klammern beim if setzen solltest.

    Problem at line 17 character 5: Don't make functions within a loop.

    Die anonyme Funktion, welche du in der Schleife definierst, hat gar keinen Bezug zur Schleifenvariable o.ä.. Du kannst diese also auch außerhalb der Schleife einer Variablen zuweisen und brauchst nur noch diese Variable nutzen.

    Problem at line 16 character 10: Missing semicolon.

    Im Gegensatz zu einer Funktionsdeklaration (bei der du kein Semikolon nach der schließenden geschweiften Klammer brauchst) ist ein Funktionsausdruck (und einen solchen beschreibst du dort) ein Ausdruck wie viele andere auch. Also brauchst du dort ein Semikolon.

    Implied global: window 1,4, i 8,10

    Wenn du Variablen nicht mit var bekannt machst, sind diese automatisch global. Dies sollte man i.d.R. vermeiden.

    Bis die Tage,
    Matti

    1. moin!

      danke für deine antwort und ne interessante homepage hast du da gelistet ;-)

      ein paar der fehler hab ich dank deiner erklärung und etwas rumspielen gefunden und das ganze sieht jetzt so aus:

      window.onload = function()  
      {  
      // link mit id="bla" fokussieren  
      var toFocus = document.getElementById(window.location.hash.substr(1));  
          if (toFocus)  
          {toFocus.focus();  
      // beim loesen der maustaste rahmen um link entfernen  
       for(i=0;i<document.links.length;i++)  
              {  
              document.links[i].onmouseup=function()  
                      {  
                      if(this.blur)  
                              {  
                                  this.blur();  
                              }  
                      };  
              }  
          }  
      };
      

      allerdings gibt sich die jsFiddle damit nicht zufrieden, ich habe gestern angefangen die self beschreibung für javascript zu lesen (ich komme wohl doch nicht drum'rum) würde mein problem aber gern schneller lösen als ich in der lage bin zu lernen...

      folgendes wirft mir die jsFiddle jetzt vor:

      Error:
      Problem at line 17 character 9: Don't make functions within a loop.
      }

      Die anonyme Funktion, welche du in der Schleife definierst, hat gar keinen Bezug zur Schleifenvariable o.ä.. Du kannst diese also auch außerhalb der Schleife einer Variablen zuweisen und brauchst nur noch diese Variable nutzen.

      welches ist die "anonyme Funktion"? wie bekomm ich die da raus ohne schaden anzurichten und wie bekomm ich die variable dann da rein mit positivem ausgang? iregnd wie sehe ich da nur einene methode den das lösen der maustaste zu definieren...

      Implied global: window 1,4, i 8,10

      Wenn du Variablen nicht mit var bekannt machst, sind diese automatisch global. Dies sollte man i.d.R. vermeiden.

      vermieden heißt ja nicht FALSCH oder? selfhtml sagt dazu "Sie ist im gesamten Dokument gültig und steht jederzeit zur Verfügung." was mir ja auch nur recht sein kann oder missverstehe ich hier was?

      auf wiederlesen ;-)

      mfg torsten

      --
      Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
      1. Hi,

        window.onload = function()

        {
        // link mit id="bla" fokussieren
        var toFocus = document.getElementById(window.location.hash.substr(1));
            if (toFocus)
            {toFocus.focus();
        // beim loesen der maustaste rahmen um link entfernen
        for(i=0;i<document.links.length;i++)
                {
                document.links[i].onmouseup=function()
                        {
                        if(this.blur)
                                {
                                    this.blur();
                                }
                        };
                }
            }
        };

          
        Ich bin mal direkt und sage, dass dein Klammerstil gewöhnungsbedürftig ist.  
        Ich erkenne nicht, warum die öffnende Klammer bei if(toFocus) auf der gleichen Höhe wie das if beginnt, dann aber kein Zeilenumbruch stattfindet, später bei if(this.blur) dann aber eins weiter eingerückt ist und ein Umbruch da ist (da wenigstens einheitlich mit dem for), ...  
          
        Entscheide dich, wo du öffnende und schließende Klammern haben willst. Weitverbreitet sind folgende Stile:  
        ~~~javascript
        for (...) {  
         // tue etwas  
        }
        

        und

        for (...)  
        {  
          // tue etwas  
        }  
        
        

        Du kannst dir natürlich etwas eigenes ausdenken, aber das da oben ist sehr schwer zu lesen.

        Error:
        Problem at line 17 character 9: Don't make functions within a loop.
        }

        Die anonyme Funktion, welche du in der Schleife definierst, hat gar keinen Bezug zur Schleifenvariable o.ä.. Du kannst diese also auch außerhalb der Schleife einer Variablen zuweisen und brauchst nur noch diese Variable nutzen.

        welches ist die "anonyme Funktion"? wie bekomm ich die da raus ohne schaden anzurichten und wie bekomm ich die variable dann da rein mit positivem ausgang? iregnd wie sehe ich da nur einene methode den das lösen der maustaste zu definieren...

        Die anonyme Funktion ist die Funktion, welches du dem onmouseup-Handler zuweist. Das gleiche Ergebnis wäre

          
        var myHandler = function() {  
          if(this.blur) {  
            this.blur();  
          }  
        };  
          
        for(var i=0;i<document.links.length;i++) {  
          document.links[i].onmouseup = myHandler;  
        }
        

        Da musst du dir aber immer sicher sein, was das "this" in diesem Zusammenhang ist. In diesem Beispiel bezieht sich "this" innerhalb von myHandler immer auf das Element, auf dem der Handler ausgelöst wurde. Wenn du da mehr wissen willst, lies dir die Artikel von molily zu dem Thema durch (Javascript: Event-Handling).

        Implied global: window 1,4, i 8,10

        Wenn du Variablen nicht mit var bekannt machst, sind diese automatisch global. Dies sollte man i.d.R. vermeiden.

        vermieden heißt ja nicht FALSCH oder? selfhtml sagt dazu "Sie ist im gesamten Dokument gültig und steht jederzeit zur Verfügung." was mir ja auch nur recht sein kann oder missverstehe ich hier was?

        In der Originalmeldung steht ja auch Problem und nicht Fehler. Das gleiche gilt im Übrigen für die Sache mit Funktionsdefinitionen innerhalb von Schleifen. Du hast gültiges JavaScript, du könntest also schon aufhören.

        Bei globalen Variablen ist es aber so, dass du damit zwar kurzfristig dein Problem löst, du dir aber gleichzeitig langfristige Probleme einhandelst.
        Einfaches Beispiel:

          
        // rufe zehnmal die Funktion do_something() auf, und übergib als Parameter die Zählvariable.  
        for (i=0; i < 10; ++i) {  
           do_something(i);  
        }  
          
        /*  
          Gib 3 alert()-Meldungen aus, welche den übergebenen Parameter und die fortlaufende Nummer der Meldung enthalten.  
        */  
        function do_something(v) {  
          for (i=0; i < 3; ++i) {  
            alert("Tue etwas für v=" + v + ", i=" + i);  
          }  
        }  
        
        

        Bevor du weiterliest, überlege dir, was du von dem Code erwartest und dann probier ihn aus.

        (Es wird nicht 10x3 = 30mal ein Alert ausgegeben, sondern du hast eine Endlosschleife. Warum?)

        Nun stehen hier die Schleife und die Funktion nahe beieinander und man kann den Fehler schon direkt ablesen. Aber stell dir mal vor, dass die Funktion irgendwo ganz anders ist (oder gar nicht von dir und du dir die Funktion gar nicht anschaust!).

        Wenn mindestens ein Auftreten (besser: beide) von i als lokal deklariert werden (indem du ein "var" davor stellst), tritt der Fehler nicht auf.

        Bis die Tage,
        Matti

        1. moin!

          schön, dass du nicht so leicht aufgiebst ;-)

          Ich bin mal direkt und sage, dass dein Klammerstil gewöhnungsbedürftig ist.

          das ist die art von direktheit gegen die niemad was einzuwenden haben kann, danke dafür!

          Ich erkenne nicht, warum die öffnende Klammer bei if(toFocus) auf der gleichen Höhe wie das if beginnt, dann aber kein Zeilenumbruch stattfindet, später bei if(this.blur) dann aber eins weiter eingerückt ist und ein Umbruch da ist (da wenigstens einheitlich mit dem for), ...

          ich verstehe anhand deiner erläuterung, dass die klammersetztung quasi die "verschachtelung" des codes kennzeichnet, obwoh ich erst http://de.selfhtml.org/javascript/sprache/regeln.htm@title=hier bin. die klemmer ist also das strukturmerkmal. allerdings sind mir schon scripte über den weg gelaufen, die einfach in einer reihe notiert waren, ähnlich der kommandozeile bei excel...

          Entscheide dich, wo du öffnende und schließende Klammern haben willst. Weitverbreitet sind folgende Stile:

          for (...) {

          // tue etwas
          }

          
          >   
          > und  
          > ~~~javascript
          
          for (...)  
          
          > {  
          >   // tue etwas  
          > }  
          > 
          
          

          ich les mal selfhtml weiter und werde mich für eine option entscheiden

          Du kannst dir natürlich etwas eigenes ausdenken, aber das da oben ist sehr schwer zu lesen.

          muss nicht unbedingt sein.

          Die anonyme Funktion ist die Funktion, welches du dem onmouseup-Handler zuweist. Das gleiche Ergebnis wäre

          var myHandler = function() {
            if(this.blur) {
              this.blur();
            }
          };

          for(var i=0;i<document.links.length;i++) {
            document.links[i].onmouseup = myHandler;
          }

            
          hm, erst mal vertau ich deinen worten, ich werde mal versuchen das zu verstehen... d.h. also, dass die festlegung der lokalen variable außerhalb der funktion statt findet und der zweite teil in die ursprüngliche funktion eingebastelt gehört... werd's versuchen.  
            
          
          > Da musst du dir aber immer sicher sein, was das "this" in diesem Zusammenhang ist. In diesem Beispiel bezieht sich "this" innerhalb von myHandler immer auf das Element, auf dem der Handler ausgelöst wurde. Wenn du da mehr wissen willst, lies dir die Artikel von molily zu dem Thema durch ([Javascript: Event-Handling](http://molily.de/js/event-handling-grundlagen.html)).  
            
          im laufe der nächsten jahre werde ich sicher die gesamte doku von molily durch gewurschtelt haben, sieht nämlich sehr interessant aus und scheint auch für laien gemacht (oder?) danke für den link.  
            
          
          > In der Originalmeldung steht ja auch Problem und nicht Fehler. Das gleiche gilt im Übrigen für die Sache mit Funktionsdefinitionen innerhalb von Schleifen. Du hast gültiges JavaScript, du könntest also schon aufhören.  
            
          nö  
            
          
          > Bei globalen Variablen ist es aber so, dass du damit zwar kurzfristig dein Problem löst, du dir aber gleichzeitig langfristige Probleme einhandelst.  
          > Einfaches Beispiel:  
          >   
          > ~~~javascript
            
          
          > // rufe zehnmal die Funktion do_something() auf, und übergib als Parameter die Zählvariable.  
          > for (i=0; i < 10; ++i) {  
          >    do_something(i);  
          > }  
          >   
          > /*  
          >   Gib 3 alert()-Meldungen aus, welche den übergebenen Parameter und die fortlaufende Nummer der Meldung enthalten.  
          > */  
          > function do_something(v) {  
          >   for (i=0; i < 3; ++i) {  
          >     alert("Tue etwas für v=" + v + ", i=" + i);  
          >   }  
          > }  
          > 
          
          

          Bevor du weiterliest, überlege dir, was du von dem Code erwartest und dann probier ihn aus.

          ich war schon mal in böhmen... da gibt es solche dörfer...

          werde mich dransetzen

          (Es wird nicht 10x3 = 30mal ein Alert ausgegeben, sondern du hast eine Endlosschleife. Warum?)

          n.k.a.! (= noch keine ahnung!)

          Nun stehen hier die Schleife und die Funktion nahe beieinander und man kann den Fehler schon direkt ablesen.

          wenn ich dazu fähig wär...

          Aber stell dir mal vor, dass die Funktion irgendwo ganz anders ist (oder gar nicht von dir und du dir die Funktion gar nicht anschaust!).

          verstehe, da ich (noch) immer auf fremdsripten angewiesen bin und das eine oder andere script echt übel aussieht (schau dir shadowbox.js in meinem wurzelverzeichnis an wenn du lust hast) kann man schnell über derartige macken stolpern. ich hoffe nur, dass ich mir mit dem "perfekten" javascript nicht einen gewünschten aber bisher unerklärlichen effekt auf meiner seite zermatsche.

          Wenn mindestens ein Auftreten (besser: beide) von i als lokal deklariert werden (indem du ein "var" davor stellst), tritt der Fehler nicht auf.

          um nicht immer wie ein vollhonk da zu stehen und um zu verstehen was gesagt wird wenn mir leute wie du helfen werde ich mich jetzt ernsthaft mit js beschäftigen... das dauert aber, ich bin nicht sonderlich begabt mit sowas umzugehen und habe auch nicht allzu viel zeit dafür übrig (immerhin hab ich's neun jahre geschafft drum herum zu kommen, so lange betreibe ich schon eine eigene seite, die nur dasnk javascript und vielen helferlein, die kostenlos ihr knoff hoff zur verfügung stellen) leider kann ich erst nächsten dienstag wieder richtig rumbasteln, ich hoffe bis dahin ist diese diskussion noch nicht im archiv.

          mfg torsten

          --
          Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
          1. moin!

            das hier ist auf jeden fall auch flasch:

              
            var myHandler = function()  
            {  
              if(this.blur)  
              {  
                  this.blur();  
              }  
            };  
              
            window.onload = function()  
            {  
                // link mit id="bla" fokussieren  
                var toFocus = document.getElementById(window.location.hash.substr(1));  
                    if (toFocus)  
                    {  
                        toFocus.focus();  
                            // beim loesen der maustaste rahmen um link entfernen  
                            for(var i=0;i<document.links.length;i++)  
                            {  
                                document.links[i].onmouseup = myHandler;  
                            }  
                    }  
            };  
            
            

            Error:

            Problem at line 17 character 25: this is undefined

            Implied global: window 9,12

            :(

            mfg torsten

            --
            Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
            1. Mahlzeit torsten,

              Könntest Du bitte mal auf Dein komisches jsFiddle verzichten? Das verwirrt - gerade Dich als Anfänger - nur unnötig, da es etwas zu pingelig ist (ob das daran liegt, dass es sich noch im Alpha-Stadium befindet, vermag ich nicht zu sagen).

              das hier ist auf jeden fall auch flasch:

              Nein, ist es definitiv nicht. Lass das Javascript doch einfach mal laufen - es wird voraussichtlich problemlos funktionieren.

              Error:

              Problem at line 17 character 25: this is undefined

              Zeile 17 ist wahrscheinlich folgende?

              if(this.blur)

              Natürlich ist "this" dort undefiniert, wenn man die Funktion losgelöst betrachtet. Da die Funktion allerdings nur als Event-Handler verwendet wird, ist "this" zur Laufzeit sehr wohl definiert.

              Implied global: window 9,12

              Damit ist vermutlich folgendes gemeint?

              var toFocus = document.getElementById(window.location.hash.substr(1));

              Natürlich ist das das globale "window"-Objekt. Was sollte es sonst sein?

              Du solltest IMHO nicht allzu viel auf irgendwelche halbfertigen und amerikanisch[1] reagierenden Tools geben ...

              MfG,
              EKKi

              [1] Erst schießen - dann fragen.

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

                Könntest Du bitte mal auf Dein komisches jsFiddle verzichten?

                klar :)

                Das verwirrt - gerade Dich als Anfänger - nur unnötig,

                ist nicht auszuschließen, allerdings habe ich schon in vergangenheit versucht mein problem zu klären, habe aber außer lebenshilfe keine für meinen wissenstand verwertbaren infos bekommen. irgendwas musste ich doch machen... in etwa nach dem motto: "er war jung und brauchte das geld"

                Nein, ist es definitiv nicht. Lass das Javascript doch einfach mal laufen - es wird voraussichtlich problemlos funktionieren.

                ohne aufmüpfig wirken zu wollen: das script lief auch in der "falschen" version (s.o.) allerdings bin ich gern kompromissbereit, ein mögliches problem ist eben noch keins, gell. trotzdem stimme ich matti zu, wenn er meint das es beim js ähnlich ist wie im straßenverkehr. man muss halt mit den fehlern der anderen rechnen...

                Error:

                Problem at line 17 character 25: this is undefined

                Zeile 17 ist wahrscheinlich folgende?

                if(this.blur)

                wenn ich richtig gezählt habe ist das "i" in diesem teil gemeint: for(var i=0;i<document.links.length;i++)

                allerdings schließe ich (m)eine fehlinterpretation nicht aus.

                Implied global: window 9,12

                Damit ist vermutlich folgendes gemeint?

                var toFocus = document.getElementById(window.location.hash.substr(1));

                Natürlich ist das das globale "window"-Objekt. Was sollte es sonst sein?

                verstehe was du sagen willst... weiß aber nicht ob das gemeint ist

                [1] Erst schießen - dann fragen.

                :) dazu haben die bald keine kohle mehr allerdings darf ich "die amerikaner" nicht unterschätzen die wollen sich jetzt für weitere geliehene 450 miliarden dollar arbeitsplätze schaffen mein tipp: rüstung (gabs schon mal)

                ALSO: das script funktioniert ABER mein altes neues problem ist wieder da. ich weiß immer noch nicht warum das script wenn ich einen link mit sprungmarke benutze wie zum beilpiel #nopuresw den effekt erzeugt (bitte warten bis die seite vollständig geladen ist... ca 500kb plus durchrattern der scripte... dauert etwas)

                ich vermute das bis hier hin:

                  
                    var toFocus = document.getElementById(window.location.hash.substr(1));  
                        if (toFocus)  
                        {  
                            toFocus.focus();  
                ...  
                
                

                der link focussiert wird und der rest nicht weiter von bedeutung ist weil's kein mouseup gibt.

                wenn diese schlussfolgerung nicht völlig falsch ist verstehe ich nicht wiso der effekt nicht auftritt wenn ich folgendes notiere:

                  
                window.onload = function() {  
                    // class="resize" for normal picz  
                    Shadowbox.setup("a.resize", {  
                                handleOversize: "resize",  
                    });  
                    // class="drag" for panoramic picz  
                    Shadowbox.setup("a.drag", {  
                                handleOversize: "drag",  
                    });  
                };  
                  
                window.onload = function()  
                {  
                // link mit id="bla" fokussieren  
                var toFocus = document.getElementById(window.location.hash.substr(1));  
                	if (toFocus)  
                		toFocus.focus();  
                // beim loesen der maustaste rahmen um link entfernen  
                 for(i=0;i<document.links.length;i++)  
                	{  
                	document.links[i].onmouseup=function()  
                		{  
                		if(this.blur)  
                			{  
                			this.blur();  
                			}  
                		};  
                	}  
                };  
                
                

                folgendes geht aber wiederum:

                  
                window.onload = function()  
                {  
                // link mit id="bla" fokussieren  
                var toFocus = document.getElementById(window.location.hash.substr(1));  
                	if (toFocus)  
                		toFocus.focus();  
                // beim loesen der maustaste rahmen um link entfernen  
                 for(i=0;i<document.links.length;i++)  
                	{  
                	document.links[i].onmouseup=function()  
                		{  
                		if(this.blur)  
                			{  
                			this.blur();  
                			}  
                		};  
                	}  
                    // class="resize" for normal picz  
                    Shadowbox.setup("a.resize", {  
                                handleOversize: "resize",  
                    });  
                    // class="drag" for panoramic picz  
                    Shadowbox.setup("a.drag", {  
                                handleOversize: "drag",  
                    });  
                };  
                
                

                wobei der zusätzliche teil ein stup für ein fremdscript zur bilddarstellung ist, es ist aber unerheblich ob dieses fremdscript im HEAD bereich gelistet ist oder nicht. das problem ist imho in der o.a. notation zu suchen**

                ** ohne gewähr

                fragen über fragen
                mfg torsten

                --
                Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                1. mist, hab in der eile des gefechts mit der falschen (alten) fünktion gepostet, ist aber mit der ausgelagerten variablen (myHandler) genau das gleiche...

                2. Hallo torsten,

                  window.onload = function() {
                     ...

                  window.onload = function()
                     ...

                  der zweite Eventhandler überschreibt hier den ersten. Schau dir mal an, wie Events hinzugefügt werden, Stichwort addEvent.

                  Gruß, Jürgen

                  1. moinmoin jürgen,

                    window.onload = function() {
                       ...

                    window.onload = function()
                       ...

                    der zweite Eventhandler überschreibt hier den ersten. Schau dir mal an, wie Events hinzugefügt werden, Stichwort addEvent.

                    bedeutet das automatisch, dass das:

                      
                    window.onload = function()  
                    {  
                    // link mit id="bla" fokussieren  
                    var toFocus = document.getElementById(window.location.hash.substr(1));  
                            if (toFocus)  
                                    toFocus.focus();  
                    // beim loesen der maustaste rahmen um link entfernen  
                     for(i=0;i<document.links.length;i++)  
                            {  
                            document.links[i].onmouseup=function()  
                                    {  
                                    if(this.blur)  
                                            {  
                                            this.blur();  
                                            }  
                                    };  
                            }  
                        // class="resize" for normal picz  
                        Shadowbox.setup("a.resize",  
                        {  
                                    handleOversize: "resize",  
                        });  
                        // class="drag" for panoramic picz  
                        Shadowbox.setup("a.drag",  
                        {  
                                    handleOversize: "drag",  
                        });  
                    };  
                    
                    

                    nicht nur funktioniert, sondern auch korrekt ist?

                    mfg torsten

                    --
                    Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                    1. Hallo torsten,

                      du sprichst hier zwei Probleme an:

                      1. Sinnvoller Einsatz von Unterprogrammen
                      2. Hinzufügen von Eventhandlen

                      Zu 1.
                      Fasse Programmteile zu Unterprogrammen zusammen, die zusammen gehören. Dadurch wird dein Code übersichtlicher und die Teile lassen sich besser wieder verwerten.

                      Zu 2.
                      Das Notieren von Eventhandlern nach dem Schema

                      element.onevent = function() { ... } ;

                      hat den Nachteil, das evtl. von anderen Scripten gesetzte Eventhandler überschrieben werden. Daher ist es langfristig sinnvoller, mit "addEvent" zu arbeiten. Leider müssen hier Browserunterschiede berücksichtigt werden. Z.Zt. benutze ich folgende Funktion:

                      function addEvent(obj, type, fn) {  
                        type = type.replace("on","");  
                        if (obj.addEventListener) {  
                          obj.addEventListener(type, fn, false);  
                        }  
                        else if (obj.attachEvent) {  
                          obj.attachEvent('on' + type, function () {  
                            return fn.call(obj, window.event);  
                          });  
                        }  
                      } // addEvent
                      

                      die ich im Netz gefunden und angepasst habe.

                      Statt

                      window.onload = function() {  
                        Aufgabe_1();  
                        Aufgabe_2();  
                      }
                      

                      schreibst du dann

                      addEvent(window,"onload",Aufgabe_1);  
                      addEvent(window,"onload",Aufgabe_2);
                      

                      Gruß, Jürgen

                      1. [latex]Mae  govannen![/latex]

                        type = type.replace("on","");

                        hier wird "on" generell entfernt ...

                        obj.attachEvent('on' + type, function () {

                        und hier ggf. wieder hinzugefügt. Nicht, daß das schlimm wäre, insbesondere bei der Leistungsfähigkeit heutiger JS-Engines und Computer, aber irgendwie überflüssig.

                        Also sollte "on" nur da entfernt werden, wo es notwendig ist: Im Zweig

                        if (obj.addEventListener) {

                        ...

                        }

                        allerdings dann richtig. Bei dir wird "on" irgendwo im übergebenene Parameter "type" ersetzt, kann also im schlimmsten Fall dazu führen, daß der Name des Events verstümmelt wird, wenn man den Namen so übergibt, wie es für addEvent üblich ist: ohne führendes "on". Übergebe ich also "DOMContentLoaded" macht deine Funktion "DOMCtentLoaded" daraus.

                        Ich sehe zwar keinen Sinn darin, entgegen den Gepflogenheiten fast(?) aller addEvent-Hilfsfunktionen, die man im Netz findet, den Event-Typ mit führendem "on" übergeben zu müssen, aber wenn du das schon tust, dann muß das zu ersetzende "on" am Anfang der Zeichenkette festgemacht werden.

                        Stur lächeln und winken, Männer!
                        Kai

                        --
                        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
                        in Richtung "Mess up the Web".(suit)
                        SelfHTML-Forum-Stylesheet
                        1. Hallo Kai345,

                          type = type.replace("on","");

                          "DOMContentLoaded" macht deine Funktion "DOMCtentLoaded" daraus.

                          du hast recht. Diese Zeile hat historische Gründe: meine alte addEvent benötigte zwingend "on", bei der Originalversion der neuen addEvent darf kein "on" vorangestellt werden. Als ich dann beim Aufräumen die alte Version durch die neue ersetzt habe, gab es ein Problem. Daher funktioniert meine Version mit und ohne "on". Dass das "on" überall stehen darf, war bisher bei mir noch kein Problem, da ich bisher nur die "alten" Events wie "onload", onmouseover, ... verwende. Von dem "neu-modischen Zeugs" wie "DOMContentLoaded" habe ich bisher Abstand gehalten, da ich es bisher nicht benötigt habe. Außerdem bin ich beim Einsatz von für mich neuen Techniken sehr zurückhaltend, da ich von der unterschiedlichen Unterstützung durch die Browser weiß und mangels Testmöglichkeiten (ich habe von den verbreiteten Browsern nur die aktuellen installiert) die Funktion von Alternativen nicht richtig testen kann.

                          Eine bessere Entfernung des "on" nur am Anfang steht aber auf der Todo-Liste. Daher danke für deine Anmerkungen.

                          Gruß, Jürgen

                          1. moinmoin!

                            @all

                            eure tipps waren sehr hilfreich und ich habe http://de.selfhtml.org/dhtml/modelle/dom.htm#event_handling@title=dies und das und jenes (letzteres zumindest teilweise) gelesen, meine verwirrung hat sich nicht im geringsten entwirrt, allerdings ist die eine oder andere kleinigkeit hängen geblieben...

                            onread function (){
                            @matti
                            @ekki
                            @kai
                            @jürgen
                            }

                            =)

                            was ich allerdings nicht herausgefunden oder verstanden habe ist WARUM das:

                              
                            window.onload = function() {  
                              Aufgabe_1();  
                              Aufgabe_2();  
                            }
                            

                            nicht gemacht werden soll oder darf obwohl es funktioniert. kann eiener von euch mal bitte DAU-tauglich dieses WARUM NICHT erläutern oder mir einen link senden oder mich auf den textteil hinweisen in dem die erklärung zu finden ist, die ich vermutlich nicht verstanden habe?

                            unterdessen habt ihr in meinem kopf folgendes zusammen gebastelt, was auch prima zu funktionieren scheint:

                            function addEvent(obj, type, fn) {  
                              type = type.replace("on","");  
                              if (obj.addEventListener) {  
                                obj.addEventListener(type, fn, false);  
                              }  
                              else if (obj.attachEvent) {  
                                obj.attachEvent('on' + type, function () {  
                                  return fn.call(obj, window.event);  
                                });  
                              }  
                            } // addEvent  
                              
                            var myHandler = function() {  
                              if(this.blur) {  
                                  this.blur();  
                              }  
                            };  
                              
                            function killFrame() {  
                                // link mit id="bla" fokussieren  
                                var toFocus = document.getElementById(window.location.hash.substr(1));  
                                    if (toFocus)  
                                    {  
                                        toFocus.focus();  
                                            // beim loesen der maustaste rahmen um link entfernen  
                                            for(var i=0;i<document.links.length;i++)  
                                            {  
                                                document.links[i].onmouseup = myHandler;  
                                            }  
                                    }  
                            };  
                              
                            function normalPic() {  
                                // class="resize" for normal picz  
                                Shadowbox.setup("a.resize", {  
                                            handleOversize: "resize",  
                            		overlayColor: "#fff",  
                            		initialWidth: 700,  
                            		initialHeight: 550,  
                            		overlayOpacity: 0.8,  
                            		continuous: true,  
                            		fadeDuration: 0.5,  
                            		resizeDuration: 0.5,  
                            		slideshowDelay: 15,  
                            		counterType: "skip",  
                            		counterLimit: 19,  
                            		viewportPadding: 5  
                                });  
                            }  
                              
                            function panoPic() {  
                                // class="drag" for panoramic picz  
                                Shadowbox.setup("a.drag", {  
                                            handleOversize: "drag",  
                            		overlayColor: "#fff",  
                            		initialWidth: 700,  
                            		initialHeight: 550,  
                            		overlayOpacity: 0.8,  
                            		continuous: true,  
                            		fadeDuration: 0.5,  
                            		resizeDuration: 0.5,  
                            		slideshowDelay: 15,  
                            		counterType: "skip",  
                            		counterLimit: 19,  
                            		viewportPadding: 5  
                                });  
                            }  
                              
                            window.onload = function() {  
                            addEvent(window,"onload",killFrame);  
                            addEvent(window,"onload",normalPic);  
                            addEvent(window,"onload",panoPic);  
                            }
                            

                            Eine bessere Entfernung des "on" nur am Anfang steht aber auf der Todo-Liste. Daher danke für deine Anmerkungen.

                            betseht eigentlich die möglichkeit, das dieser kleine fopas auswirkungen auf das eventhandling in fremdscriten (die ich ausreichend verwende) hat?

                            mfg torsten

                            --
                            Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                            1. moin!

                              Eine bessere Entfernung des "on" nur am Anfang steht aber auf der Todo-Liste. Daher danke für deine Anmerkungen.

                              betseht eigentlich die möglichkeit, das dieser kleine fopas auswirkungen auf das eventhandling in fremdscriten (die ich ausreichend verwende) hat?

                              außerdem müsste doch aus meinem "continuous: true," (sie oben) "ctinuous: true," werden, was die eigenschaften der darstellung der shadowbox ändern müsste... tut es aber nicht...

                              hm....

                              mfg torsten

                              --
                              Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                              1. Hallo torsten,

                                außerdem müsste doch aus meinem "continuous: true," (sie oben) "ctinuous: true," werden, was die eigenschaften der darstellung der shadowbox ändern müsste... tut es aber nicht...

                                wie kommst du denn darauf? Der Funktion addEvent wird u.A. der Parameter type als String übergeben, und in diesem String wird das on entfernt. Wie kommst du auf die Idee, dadurch würde der Code des Eventhandlers verändert?

                                Gruß, Jürgen

                                1. moin!

                                  wie kommst du denn darauf?

                                  ganz einfach: schneller schreiben als denken...

                                  Der Funktion addEvent wird u.A. der Parameter type als String übergeben, und in diesem String wird das on entfernt. Wie kommst du auf die Idee, dadurch würde der Code des Eventhandlers verändert?

                                  da denk ich mal drüber nach... da ich den urschleim noch nicht verinnerlicht hab kannst du ja versuchen das posting zu vergessen.

                                  danke

                                  vielleicht kannst du mir noch einen hinweis zu dem posting davor und der frage nach dem WARUM NICHT geben.

                                  mfg torsten

                                  --
                                  Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                                  1. Hallo torsten,

                                    vielleicht kannst du mir noch einen hinweis zu dem posting davor und der frage nach dem WARUM NICHT geben.

                                    hab ich doch: window.onload = ... kann den onload-Eventhandler eines anderen davor eingebundenen Scripts überschreiben. Daher sollte man diesen Weg zum Setzen von Eventhandlern nur nutzen, wenn sichergestellt ist, dass keine anderen Scripte dieses auch tun.

                                    Gruß, Jürgen

                                    1. moin!

                                      vielleicht kannst du mir noch einen hinweis zu dem posting davor und der frage nach dem WARUM NICHT geben.

                                      hab ich doch: window.onload = ... kann den onload-Eventhandler eines anderen davor eingebundenen Scripts überschreiben. Daher sollte man diesen Weg zum Setzen von Eventhandlern nur nutzen, wenn sichergestellt ist, dass keine anderen Scripte dieses auch tun.

                                      das hab ich auch verstanden weil ich:

                                        
                                      window.onload = ...  
                                      window.onload = ...  
                                      
                                      

                                      zwei mal aufgerufen habe aber was ich nicht verstanden habe ist, ob das ganze auch für diese form gilt:

                                        
                                      window.onload = function() {  
                                        Aufgabe_1();  
                                        Aufgabe_2();  
                                      }  
                                      
                                      

                                      oder verstehe ich das mal wieder miß?

                                      mfg torsten

                                      --
                                      Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                                      1. Hallo torsten,

                                        window.onload = function() {

                                        diese Zeile überschreibt  möglicherweise den Onloadhandler, den schon ein anderes davor eingebundenes Script gesetzt hat. Sonst ist das OK.

                                        Aufgabe_1();
                                          Aufgabe_2();
                                        }

                                          
                                          
                                          
                                        Gruß, Jürgen  
                                        
                                        
                                        1. moin!

                                          an dieser stelle klinke ich mich für ne weile aus, weil ich gleich die wand hoch gehe das hier zeigt den gewünschten effekt wenn ein link wie http://www.jungmann.net/#gletsch im adressfeld steht und das hier nicht.

                                          siehe:

                                          gut

                                          und:

                                          böse

                                          grrrrrrrrrrr

                                          mfg torsten

                                          --
                                          Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                                          1. [latex]Mae  govannen![/latex]

                                            und das hier nicht.

                                            Weil da immer noch der Fehler drin ist, den Jürgen hier bereits bemängelt hat.

                                            Stur lächeln und winken, Männer!
                                            Kai

                                            --
                                            Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
                                            in Richtung "Mess up the Web".(suit)
                                            SelfHTML-Forum-Stylesheet
                                            1. moin!

                                              autsch!

                                              Weil da immer noch der Fehler drin ist, den Jürgen hier bereits bemängelt hat.

                                              das posting mit der bemängelung hab ich komplett überlesen, sorry dafür und danke für den wiederholten hinweis :) ich merke schon dass ich eure nerven ziemlich starpaziere...

                                              das js hab ich nochmal angepasst, aber ich verlinkes hier nicht um euch weiteres zu ersparen, außerdem dürfte das inzwischen warscheinlich sogar peinlich sein, ich habs in den aktuellen versionen von FF/IE/O/GC getestet und sollte mit dem ergebnis zufrieden sein :) vielleicht seid ihr's jetzt auch.

                                              eine anmerkung von jürgen lässt mich außerdem noch grübeln:

                                              Ob das überhaupt funktioniert, möchte ich anzweifeln, da erst nach dem Laden der Seite weitere onload-Handler hinzugefügt werden.

                                              wie meint er das mit dem "nach dem Laden der Seite" das script steht doch im HEAD bereich der seite und die shadowbox funktioniert eh nur wenn die seite vollständig geladen wurde (zumindest beschreibt das der verfasser so, ähnlich wie bei der lightbox) wenn sich das "seite" auf das script an sich bezieht hab ich einfach mal beim ritzelrechner in den quelltext geschaut... hier ist das addEvent zwar am ende einer funktion innerhalb des HEAD bereichs, habe dem aber keine bedeutung beigemessen...

                                              war meine vermutung wieder falsch?

                                              mfg torsten

                                              --
                                              Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                                              1. Hallo torsten,

                                                eine anmerkung von jürgen lässt mich außerdem noch grübeln:

                                                Ob das überhaupt funktioniert, möchte ich anzweifeln, da erst nach dem Laden der Seite weitere onload-Handler hinzugefügt werden.

                                                das Ereignis "Seite geladen" tritt genau einmal ein, nämlich dann, wenn die Seite vollständig einschließlich HTML, CSS, JS, Bilder, ... geladen ist. Wenn du auf dieses Ereignis reagieren willst, musst du das dem Browser mitteilen, bevor es eintritt.

                                                Gruß, Jürgen

                                                1. moinmoin jürgen!

                                                  Hallo torsten,

                                                  eine anmerkung von jürgen lässt mich außerdem noch grübeln:

                                                  Ob das überhaupt funktioniert, möchte ich anzweifeln, da erst nach dem Laden der Seite weitere onload-Handler hinzugefügt werden.

                                                  das Ereignis "Seite geladen" tritt genau einmal ein, nämlich dann, wenn die Seite vollständig einschließlich HTML, CSS, JS, Bilder, ... geladen ist. Wenn du auf dieses Ereignis reagieren willst, musst du das dem Browser mitteilen, bevor es eintritt.

                                                  diese schlussfolgerung erklärt den satz der drüber steht, nennt aber nicht den grund deines zweifels (ich behaupte nicht der wär unberechtigt und ich verstehe, dass ich dem browser dieses ereigniss wohl verheimliche) für meinen "newbie" verstand ist das windows.onload ereignis (um das es geht, oder?) teil der von dir aufgeführten bestandteile (HTML, CSS, JS, Bilder) und wenn es teil des ganzen ist, dann wird es doch behandelt bevor das ganze beendet ist?

                                                  das ist lediglich meine schlußfolgerung und somit mit an sicherheit grenzender warscheinlichkeit nicht richtig. aber ich versteh mal wieder nicht wie's zusammengehört.

                                                  ich lese einfach die doku weiter und finde mglw eines tages selbst heraus was noch zu wissen nötig scheint um das zu begreifen.

                                                  danke für eure hilfe! das soll nicht heißen ich klinke mich aus, würde aber versehen wenn ihr das macht ;-)

                                                  mfg torsten

                                                  --
                                                  Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                                                  1. Hallo torsten,

                                                    diese schlussfolgerung erklärt den satz der drüber steht, nennt aber nicht den grund deines zweifels ...

                                                    ganz einfach, ich habe es ausprobiert.

                                                    Gruß, Jürgen

                                                    1. moin!

                                                      lecko mio! is ja irre! jetzt hab ich sogar beim falsch machen noch was falsch gemacht...

                                                      hab den alten zustand wieder hergestellt...

                                                      mfg torsten

                                                      --
                                                      Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                                                      1. moinmoin jürgen (wenn du noch da draußen bist)!

                                                        imho könnte es sein, dass ich's heraus gefunden habe...

                                                        das addEvent hab ich innerhalb einer window.onload funktion abgefeuert, das wahr wohl so falsch wie's nur sein kann.

                                                        das Ereignis "Seite geladen" tritt genau einmal ein, nämlich dann, wenn die Seite vollständig einschließlich HTML, CSS, JS, Bilder, ... geladen ist. Wenn du auf dieses Ereignis reagieren willst, musst du das dem Browser mitteilen, bevor es eintritt.

                                                        vielleicht wolltest du mir sagen, dass ich das ereignis komplett versteckt hatte? wenn das so ist hat sich mir dieser inhalt erst erschlossen nachdem ich den fehler (wenn er's denn war) gefunden habe, dachtest du es wär nicht angemessen den fehler auf grund der beschreibung finden zu können?

                                                        das kann ich nicht ausschließen, dass du damit recht hattest =) ... danke nochmal!

                                                        mfg torsten

                                                        --
                                                        Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
                                          2. Hallo torsten,

                                            an dieser stelle klinke ich mich für ne weile aus,

                                            ich auch, da ich nicht mehr weiß, wie ich es noch erklären soll.

                                            Gruß, Jürgen

                            2. Hallo torsten,

                              was ich allerdings nicht herausgefunden oder verstanden habe ist WARUM das:

                              window.onload = function() {
                                Aufgabe_1();
                                Aufgabe_2();
                              }

                              
                              >   
                              > nicht gemacht werden soll oder darf obwohl es funktioniert. kann eiener von euch mal bitte DAU-tauglich dieses WARUM NICHT erläutern oder mir einen link senden oder mich auf den textteil hinweisen in dem die erklärung zu finden ist, die ich vermutlich nicht verstanden habe?  
                                
                              das ist nicht falsch, aber wenn ein anderes Script ebenfalls ein onload-Event setzt, kommt es zur Kollision. Der spätere gewinnt.  
                                
                              
                              > unterdessen habt ihr in meinem kopf folgendes zusammen gebastelt, was auch prima zu funktionieren scheint:  
                              >   
                              > ~~~javascript
                              
                              function addEvent(obj, type, fn) {  
                                
                                if(type.search("on")==0) type = type.substr(2); // Korrekturvorschlag  
                                
                              
                              >   if (obj.addEventListener) {  
                              >     obj.addEventListener(type, fn, false);  
                              >   }  
                              >   else if (obj.attachEvent) {  
                              >     obj.attachEvent('on' + type, function () {  
                              >       return fn.call(obj, window.event);  
                              >     });  
                              >   }  
                              > } // addEvent  
                              >   
                                
                              
                              > window.onload = function() {  
                              > addEvent(window,"onload",killFrame);  
                              > addEvent(window,"onload",normalPic);  
                              > addEvent(window,"onload",panoPic);  
                              > }
                              
                              

                              das ist aber jetzt nicht dein Ernst? Der einzige Sinn des addEvent ist der Verzicht auf element.onevent = ..., also hier auf window.onload = ...

                              Ob das überhaupt funktioniert, möchte ich anzweifeln, da erst nach dem Laden der Seite weitere onload-Handler hinzugefügt werden.

                              Eine bessere Entfernung des "on" nur am Anfang steht aber auf der Todo-Liste. Daher danke für deine Anmerkungen.

                              betseht eigentlich die möglichkeit, das dieser kleine fopas auswirkungen auf das eventhandling in fremdscriten (die ich ausreichend verwende) hat?

                              keine Ahnung, bei mir hat es geklappt ... :). Aber oben ist ein Korrekturvorschlag. Du kannst das Entfernen des "on" auch ganz weglassen, musst dann aber beim Aufruf das "on" weglassen.

                              Der Einsatz von mehreren Fremdscripten ist allerdings immer kritisch, z.B. weil sie sich gegenseitig globale Variablen und Funktionen überschreiben können, und Wechselwirkungen sollten immer sorgfältig überprüft werden.

                              Gruß, Jürgen