Ergebnis 1 bis 6 von 6
  1. #1
    solirocks ist offline Eroberer
    registriert
    18-03-2010
    Beiträge
    52

    Schleife bricht ab, ohne Fehlermeldung

    Hallo Leute,

    ich habe ein, meiner Meinung nach, seltsames Problem. Ich entwickle gerade eine einfache Funktion, um Elemente per CSS Selektor zu finden.

    Allerdings ist es so, dass, wenn ich ein Objekt per Klasse suche, die Schleife abgebrochen wird, ich aber keine Fehlermeldung (Firebug) erhalte und auch keinen Befehl erteilt habe, die Schleife abzubrechen.

    Bis jetzt sieht die Funktion so aus:
    HTML-Code:
    <div id="test">
      <div>
        <div class="test">
          <div>Test1</div>
        </div>
        <div>Test2</div>
      </div>
      <div>
        <div class="test">Test3</div>
      </div>
    </div>
    
    <script type="text/javascript">
    var efwDom = function(selector, context) {
      var selectors = selector.split(/\s+/);
      var resultArray = [];
      var currentSelector = null;
      var parts = null;
      var search = null;
      var tag = null;
      
      for(i = 0, max = selectors.length; i < max; i++) {
        currentSelector = selectors[i];
        if(currentSelector.match(/\#/g)) {
          search = currentSelector.replace(/\#/g, '');
          resultArray.push({type: 'id', search: search, tag: null});
        }
        else if(currentSelector.match(/\./g)) {
          parts = currentSelector.split('.');
          search = parts[1];
          tag = parts[0] == "" ? "*" : parts[0];
          resultArray.push({type: 'class', search: search, tag: tag});
        }
        else {
          resultArray.push({type: 'tag', search: currentSelector, tag: null});
        }
      }
      
      var getByClassName = function(tag, className, context) {
        var elements = context.getElementsByTagName(tag);
        var result = [];
        for(i = 0, max = elements.length; i < max; i++) {
          if(elements[i].className == className) {
            result.push(elements[i]);
          }
        }
        return result;
      }
      
      var element = null;
      var contextElements = null;
      for(i = 0, max = resultArray.length; i < max; i++) {
        resultObj = resultArray[i];
        // Get Element By Id
        if(resultObj.type == 'id') {
          context = context.getElementById(resultObj.search);
        }
        // Get Elements By ClassName
        else if(resultObj.type == 'class') {
          if(context[0] == undefined) {
            context = getByClassName(resultObj.tag, resultObj.search, context);
          }
          else {
            contextElements = [];
            for(n = 0, n_max = context.length; n < n_max; n++) {
              element = getByClassName(resultObj.tag, resultObj.search, context[n]);
              if(element[0] != undefined) {
                contextElements.push(element[0]);
              }
            }
            context = contextElements;
          }
        }
        // Get Elements By TagName
        else if(resultObj.type == 'tag') {
          if(context[0] == undefined) {
            context = context.getElementsByTagName(resultObj.search);
          } 
          else {
            contextElements = [];
            for(n = 0, n_max = context.length; n < n_max; n++) {
              element = context[n].getElementsByTagName(resultObj.search);
              if(element[0] != undefined) {
                contextElements.push(element[0]);
              }
            }
            context = contextElements;
          }
        }
      }
      return context;
    }
    
    var result = efwDom('#test .test div', document);
    alert(result.length)
    for(i = 0, max = result.length; i < max; i++) {
      //alert(result[i].innerHTML);
    }
    </script>
    Ich müsste 1 erhalten. Erhalte aber 2.

    Wenn ich ein Alert in die Schleife einbaue, wird dieses auch nur 2x gefeuert. Wenn ich den Teil mit dem Klassenselektor rausnehme, dann erhalte ich alle 3 Ausgaben.

    Kann mir jemand helfen und sagen, woran es liegen könnte?

    Gruß


    Edit fügt hinzu:

    Das hier funktioniert:

    HTML-Code:
    var result = efwDom('#test div div', document);
    Geändert von solirocks (25-12-2011 um 17:27 Uhr)

  2. #2
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.311

    AW: Schleife bricht ab, ohne Fehlermeldung

    um welche der Schleifen handelt es sich? ich würde ja mit document.querySelectorAll() anfangen …

  3. #3
    solirocks ist offline Eroberer
    registriert
    18-03-2010
    Beiträge
    52

    AW: Schleife bricht ab, ohne Fehlermeldung

    Ist nicht crossbrowser-kompatibel und wird später eingefügt. Es geht wirklich nur um einen ganz einfachen Selektor.

    HTML-Code:
    for(i = 0, max = resultArray.length; i < max; i++) {
        resultObj = resultArray[i];
        // Get Element By Id
        if(resultObj.type == 'id') {
          context = context.getElementById(resultObj.search);
        }
        // Get Elements By ClassName
        else if(resultObj.type == 'class') {
          if(context[0] == undefined) {
            context = getByClassName(resultObj.tag, resultObj.search, context);
          }
          else {
            contextElements = [];
            for(n = 0, n_max = context.length; n < n_max; n++) {
              element = getByClassName(resultObj.tag, resultObj.search, context[n]);
              if(element[0] != undefined) {
                contextElements.push(element[0]);
              }
            }
            context = contextElements;
          }
        }
        // Get Elements By TagName
        else if(resultObj.type == 'tag') {
          if(context[0] == undefined) {
            context = context.getElementsByTagName(resultObj.search);
          } 
          else {
            contextElements = [];
            for(n = 0, n_max = context.length; n < n_max; n++) {
              element = context[n].getElementsByTagName(resultObj.search);
              if(element[0] != undefined) {
                contextElements.push(element[0]);
              }
            }
            context = contextElements;
          }
        }
      }
    Diese Schleife bricht ab. Testet das Script mal. Copy & Paste und mit dem Browser öffnen. Nach dem Klassenselektor wird die Schleife unterbrochen und ich weiß nicht wieso. Wenn ich mit den Context ausgeben lasse, erhalte ich das, was ich will. Die Schleife müsste weiterlaufen. Tut sie aber seltsamer Weise nicht.

  4. #4
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.311

    AW: Schleife bricht ab, ohne Fehlermeldung

    Zitat Zitat von solirocks Beitrag anzeigen
    Ist nicht crossbrowser-kompatibel und wird später eingefügt.
    abgesehen von IE 6+7, allen anderen Browsern machst du es mit querySelectorAll() um Größenordnungen leichter.

    Zitat Zitat von solirocks Beitrag anzeigen
    Testet das Script mal.
    heute nicht mehr …

  5. #5
    Avatar von miniA4kuser
    miniA4kuser ist offline Lounge-Member
    registriert
    12-07-2006
    Beiträge
    3.034

    AW: Schleife bricht ab, ohne Fehlermeldung

    Die Schleife bricht ab weil die Bedingung erfüllt ist und nicht weil ein JavaScript-Fehler passiert.
    Das Problem liegt auch nicht in der zweiten for-Schleife, sondern in deiner Funktion getByClassName:
    Code:
      var getByClassName = function(tag, className, context) {
        var elements = context.getElementsByTagName(tag);
        var result = [];
        for(i = 0, max = elements.length; i < max; i++) {
          if(elements[i].className == className) {
            result.push(elements[i]);
          }
        }
        return result;
      }
    Wenn du innerhalb deiner zweiten for-Schleife das erste mal deine Funktion getByClassName aufrufst, wird deine dortige Zählervariable i, in deinem Fall mit dem Wert 6, überschrieben und ist fortan beim nächsten Schleifendurchlauf (6 + 1 = 7) grösser als dein ebenso überschriebener Wert von max (7 < 6). Folglich reagiert die zweite for-Schleife korrekt und steigt aus...
    Dies ist also ein Paradebeispiel für das fehlerhafte/unachtsame Verwenden von globalen Variablen.
    Füge in deiner Funktion getByClassName ein var ein und das Problem sollte vom Tisch sein:
    Code:
    for(var i = 0, max = elements.length; i < max; i++) {
    Hoffe ich konnte helfen

  6. #6
    solirocks ist offline Eroberer
    registriert
    18-03-2010
    Beiträge
    52

    AW: Schleife bricht ab, ohne Fehlermeldung

    Ich danke dir. Genau daran ist es gescheitert.

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 06-04-2011, 13:36
  2. Mootools Scroll in einer Schleife (ohne gehts)
    Von lomex im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 02-02-2011, 12:05
  3. timeout bricht ab.
    Von ToM80 im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 25-06-2009, 11:54
  4. If Schleife zweite Teil ohne Funktion
    Von Gissmo im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 30-01-2008, 14:33
  5. Fehler ohne fehlermeldung
    Von JTB im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 06-05-2007, 22:17

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •