Matti Mäkitalo: script invalid

Beitrag lesen

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