2017-02-25 4 views
0

Ich kam zu dem Punkt mit meinem Projekt, wo ich beschlossen, einige der js-Funktionen zu vereinfachen, wo ich nach einem Elternteil in einem DOM-Baum suchen, dann Drilldown auf die Elemente viele Male in einer Funktion. stattdessen werde ich Instanzen einer Funktion machen, die einige Daten behalten wird, dann kann ich auf Objekte auf einfache Weise verweisen und operieren. Ich habe es funktioniert, aber während ich ging, entschied ich mich, Funktionalität zu erweitern und einige zusätzliche Funktionen wie getElementsByClassNameThenTagName hinzuzufügen. Ich Schleife durch die Arrays und wenn passende Elemente zum Array hinzufügen. Ich habe bemerkt (leider nur jetzt), dass ich ein Array mit Elementen anstelle von HTML-Sammlung erstellen. Als Ergebnis kann ich nicht auf die Objekte in meinen Ergebnissen verweisen, indem ich buttons['reset'].disabled = false; eintippe. Ich kann auf meine Reset-Taste durch buttons[3].disabled = false; zugreifen, aber dies würde eine Menge Unannehmlichkeiten verursachen.Umwandlung von JS-Array mit Objekten in HTML-Sammlung

Ich bin daher auf der Suche nach einer Möglichkeit, mein Array mit Objekt in eine HTML-Sammlung zu konvertieren.

Bitte siehe unten meine aktuelle Funktion:

this.getElementsByClassNameThenTagName = function (elementClass, elementTag) { 
    if (parentNode == null) { 
     this.init(); 
    } 
    var results = []; 
    var regexStr = elementClass; 
    var regex = new RegExp(regexStr); 
    var x = moduleNode.getElementsByClassName(elementClass); 
    // console.log(x); 
    var y; 
    for (var i = 0; i < x.length; i++) { 
     // console.log(i); 
     y = x[i].getElementsByTagName(elementTag); 
     // console.log(y); 
     for (var k=0; k<y.length; k++){ 
      // console.log(y[k]); 
      results.push(y[k]); 
     } 
     // console.log(results); 
    } 
    return results; 
}; 

Irgendwelche Vorschläge bitte?

Danke.

+0

Sie müssen den Code für 'getElementsByClassNameThenTagName' dort muss ein Punkt drin sein, wo Sie eine HTML-Sammlung haben und Sie verwandeln es in ein konventionelles Array, beheben Sie das, statt es zurück zu konvertieren –

+0

Entschuldigung mit Code jetzt. – azgooon

+0

Ich habe nicht bemerkt, dass eine Nodeliste schreibgeschützt ist, du musst dein Design vielleicht ein wenig überdenken. Es wird keine Lösung geben, die genau das ist, was Sie suchen. –

Antwort

1
this.getElementsByClassNameThenTagName = function (elementClass, elementTag) { 
    if (parentNode == null) { 
     this.init(); 
    } 

    var results = {}; // thid should be an object (collection) 
    var x = moduleNode.querySelectorAll("." + elementClass + " " + elementTag); 
    x.forEach(function(y) { 
     var name = y.getAttribute("name"); // if you really sure that all the matched elements have names 
     results[name] = y; 
    }); 
    return results; 
}; 

Jetzt können Sie die results Array wie folgt verwendet werden:

var someElement = results['some name']; 

HINWEIS: Alle abgestimmte Elemente x ein name Attribut haben sollte, und alle name Attribute der angepassten Elemente sollten einzigartig.

+0

Es funktioniert perfekt! Danke Ibrahim, ich schätze es sehr. Auf jeden Fall, Scott und Pawel, danke auch für Ihre Eingabe. – azgooon