Slapshot: Schleife wird nicht gestartet

Hallo zusammen,

ich bin relativ neu in JS und habe folgendes Problem. Ich will in einer Funktion eine Schleife durchlaufen. Allerdings bricht die gesamte Funktion bereits ab, sobald er das erste Mal die Bedingung abfragt. Hier der Funktionscode:

  
function changeFilter(){  
 var ownerFilter = document.getElementById("ownerFilter").value;  
 var statusFilter = document.getElementById("statusFilter").value;  
 var milestoneFilter = document.getElementById("milestoneFilter").value;  
 var rowID = 1;  
  
 while(document.getElementsByName("del"+rowID)[0]){  
  var hoursField = document.getElementsByName("hour"+rowID)[0];  
  if(hoursField != null && hoursField == ""){  
   var currentTask = document.getElementsByName("task_id"+rowID)[0].value;  
   changeTask(currentTask,rowID);  
  }  
  rowID++;  
 }  
}

Der Teil in der while-Schleife ist eigentlich irrelevant(denke ich zumindest), da nie in die Schleife hinein gegangen wird. Ich hab das mit FindBugs debugt. In der Fehlerkonsole des Firefox wird auch nichts angezeigt. Nachdem er an die Zeile kommt, wo die Schleife beginnt, kehrt er aus der Funktion zurück. Ich habe natürlich auch überprüft, ob er überhaupt ein Element mit dem Namen "del1" findet. Das tut er allerdings, was auch zu erwarten war.
Ich habe zum Debuggen auch schon die while-Schleife mit einer for-Schleife ausgetauscht, die solange läuft, bis rowID einen bestimmten Wert hat, aber da war es das gleiche Problem. Erstaunlicherweise hat es funktioniert, wenn ich nach der Schleife noch etwas eingefügt habe. In meinem Beispiel hab ich einfach rowID ein weiteres Mal inkrementiert.

Allerdings finde ich das unschön, da so einen unnützen Code zu haben. Die Funktion sollte nach der Schleife einfach beendet werden. Es sind keine weiteren Zuweisungen oder Methoden-Aufrufe nötig. Außerdem will ich halt auch verstehen, warum das Problem überhaupt auftritt.

Vielen Dank im Voraus,
Slapshot

  1. Ist nur ein Gedanke - falls ich das Problem richtig verstanden habe, dass die Schleife zumindest 1x jedenfalls abgearbeitet werden soll (?): http://de.selfhtml.org/javascript/sprache/schleifen.htm#dowhile@title=do-while

    falls nicht - vergiss es ;-)

    1. Ist nur ein Gedanke - falls ich das Problem richtig verstanden habe, dass die Schleife zumindest 1x jedenfalls abgearbeitet werden soll (?): http://de.selfhtml.org/javascript/sprache/schleifen.htm#dowhile@title=do-while

      falls nicht - vergiss es ;-)

      Nein, das ist nicht das Problem. Verstehe aber, dass man bei meiner Erklärung das verstehen könnte. Also Ergänzung ;) : Die Schleife muss nicht zwingend abgearbeitet werden, im Gegenteil, wenn das Element "del1" schon nicht existiert, soll ja eben nichts passieren. Das Element "del1" ist für mich ein Indikator, dass noch weitere Tabellenzeilen kommen(Es geht hier um einen Kalender, dessen Zeilen durchlaufen werden soll, wobei ein Tag mehrere Zeilen haben kann. Zuerst bekommt jede erste Zeile eines Tages als Index (rowID) den Tag im Monat, danach jede weitere Zeile eines Tages die aktuell indizierte Zeilenanzahl + 1.) Das Problem ist, dass die Schleife gar nicht abgearbeitet wird, selbst wenn das Element "del1" existiert.

  2. Hallo Slapshot,

    ~~~javascript

    while(document.getElementsByName("del"+rowID)[0]){

      
    gibt es denn ein Element mit diesem Namen? "rowID" lässt eher auf eine ID schließen. Vielleicht zeigst du uns noch etwas relevanten html-Code oder einen Link auf die (Test-)Seite.  
      
    Gruß, Jürgen  
    
    
    1. Hallo Slapshot,

      »»  while(document.getElementsByName("del"+rowID)[0]){

      
      >   
      > gibt es denn ein Element mit diesem Namen? "rowID" lässt eher auf eine ID schließen. Vielleicht zeigst du uns noch etwas relevanten html-Code oder einen Link auf die (Test-)Seite.  
      >   
      > Gruß, Jürgen  
      >   
        
      Ja, es gibt so ein Element. Ich lege es selber an, wenn ich die Tabellenzeile erstelle:  
        
      `var deletionElement = "<input type=text name=del"+rowID+" value="+0+" style=display:none>";`{:.language-javascript}  
        
      Das füge ich hinten an die Zeile mit an.  
        
      @Hopsel: Das Array ist nicht das Problem. Um genau zu sein, gibt es eh nur ein Element pro Namen, womit das Array auch nur einen Eintrag hat. Ich weiß, dass hier eine ID statt eines Namens angebrachter wäre, allerdings hab ich das erstmal als sekundär zurückgeschoben. Ich überarbeite nämlich nur den Code eines anderen nach und nach. Und ich will auch kein Array durchiterieren, sondern sozusagen von allen Arrays das erste Element verwenden, wobei die Arrays 1 bis n die Namen "del1" bis "deln" haben.  
        
      @all: Ich probiere es jetzt einfach mal mit id statt name. Mal schauen... :)
      
      1. Hallo Slapshot,

        Ja, es gibt so ein Element. Ich lege es selber an, wenn ich die Tabellenzeile erstelle:

        var deletionElement = "<input type=text name=del"+rowID+" value="+0+" style=display:none>";

        nein, da ist die Quotierung falsch: versuch mal

        "<input type=text name='del"+rowID+"' value="+0+" style='display:none'>";
                               ^            ^                   ^            ^

        Du kannst dir übrigens im FF mit dem Kontextmenü "Auswahlquelltext anzeigen" auch dynamisch erzeugten Quelltext ansehen.

        Gruß, Jürgen

        1. Hallo Slapshot,

          »» Ja, es gibt so ein Element. Ich lege es selber an, wenn ich die Tabellenzeile erstelle:
          »»
          »» var deletionElement = "<input type=text name=del"+rowID+" value="+0+" style=display:none>";

          nein, da ist die Quotierung falsch: versuch mal

          "<input type=text name='del"+rowID+"' value="+0+" style='display:none'>";
                                 ^            ^                   ^            ^

          Du kannst dir übrigens im FF mit dem Kontextmenü "Auswahlquelltext anzeigen" auch dynamisch erzeugten Quelltext ansehen.

          Gruß, Jürgen

          Das hat leider auch nicht geholfen. Das seltsame ist ja, es funktioniert (auch mit "meiner" Quotierung), wenn ich nach der Schleife noch eine Anweisung einsetz, z.B. eine Wertzuweisung. Erst wenn nach der Schleife direkt die schließende, geschweifte Klammer für die Methode kommt(siehe Ausgangspost), funktioniert es nicht.

          Und den Quelltext untersuche ich ja bereits mit FindBugs. Oder gibt "Auswahlquelltext anzeigen" noch was anderes aus? Zudem finde ich diesen Menüpunkt nicht oder ist der äquivalent mit "Seitenquelltext anzeigen"? Sorry, falls das jetzt total unwissend klingt, aber ich frage lieber öfter nach, damit beide Seiten auch von der gleichen Annahme ausgehen. :)

          1. Hallo Slapshot,

            zu deinem Problem: jetzt wäre ein Link auf eine Testseite  nicht schlecht.

            Zu "Auswahlquelltext anzeigen": Stelle mit der Maus markieren -> rechte Maustaste -> "Auswahlquelltext ...". So siehst du, was du dynamisch erzeugt hast, einschließlich der Attribute.

            Gruß, Jürgen

            1. Hallo Slapshot,

              zu deinem Problem: jetzt wäre ein Link auf eine Testseite  nicht schlecht.

              Zu "Auswahlquelltext anzeigen": Stelle mit der Maus markieren -> rechte Maustaste -> "Auswahlquelltext ...". So siehst du, was du dynamisch erzeugt hast, einschließlich der Attribute.

              Gruß, Jürgen

              Leider ist die Seite nicht offen zugänglich. Sie soll hier nur im Intranet benutzt werden und benötigt auch eine LDAP-Authentifizierung.

              Vielleicht sollte ich noch erwähnen, dass die Methode nur über ein onChange-Event in einem select-Tag aufgerufen wird.

  3. Hi Slapshot!

    while(document.getElementsByName("del"+rowID)[0]){

    Anstatt jedesmal ein neues Array mit getElementsByName() anzufordern, würde ich einmal dieses Array in einer Variablen ablegen und dann mit einer for-Schleife abarbeiten.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  4. Der Teil in der while-Schleife ist eigentlich irrelevant(denke ich zumindest), da nie in die Schleife hinein gegangen wird. Ich hab das mit FindBugs debugt. In der Fehlerkonsole des Firefox wird auch nichts angezeigt. Nachdem er an die Zeile kommt, wo die Schleife beginnt, kehrt er aus der Funktion zurück. Ich habe natürlich auch überprüft, ob er überhaupt ein Element mit dem Namen "del1" findet. Das tut er allerdings, was auch zu erwarten war.

    Dann kann deine Beobachtung nicht stimmen, wenn es ein Element mit dem Namen gibt, dann wird die Schleife auch mindestens einmal ausgeführt.

    <form action="">  
    <input name="del1">  
    </form>  
    <script type="text/javascript">  
    var rowID = 1;  
    while(document.getElementsByName("del"+rowID)[0]){  
       alert(rowID);  
       rowID++;  
     }  
    </script>  
      
    
    

    Allerdings finde ich das unschön, da so einen unnützen Code zu haben. Die Funktion sollte nach der Schleife einfach beendet werden. Es sind keine weiteren Zuweisungen oder Methoden-Aufrufe nötig. Außerdem will ich halt auch verstehen, warum das Problem überhaupt auftritt.

    Das läßt sich ohne den dazugehörigen HTML Code nicht sagen.

    Struppi.