Array-Index alphanumerisch und Push-Methode

  • Themenstarter Themenstarter Netzwerkidi
  • Beginndatum Beginndatum
N

Netzwerkidi

Hallo zusammen

ich habe jetzt ziemlich lange rumgesucht, warum bei einer Array-Verarbeitung in Verbindung mit Array-Methoden wie Push immer eine Fehlermeldung kommt:

"FEHLER: Das Object unterstützt diese Eigenschaft oder Methode nicht."

Der Fehler war wohl nun, dass ich dem Array die Images des Dokuments immer einfach mit

Code:
var arr = document.getElementsByTagName("img");

zugewiesen hatte in der Annahme, das Array würde numerisch hochzählen.
Aber Pustekuchen, es wurden stattdessen die IDs der Images eintragen.

Meine Frage: warum klappen die Array-Methoden wie Push offenbar nur, wenn der Index im Array numerisch ist? Ist für mich irgendwie nicht ganz einsichtig.

Beste Grüße
Idi
 
Ganz einfach: es gibt in Javascript keine assoziativen Arrays. Daraus folgt, dass alles, was ein Array ist, numerisch sein muss, oder dass alles, was nicht numerisch ist, kein Array ist. Letzteres wäre ein Objekt. Da aber nun Objekte und Arrays unterschiedliche Methoden haben und push eine Methode von Array ist, kann man diese nicht auf ein Objekt anwenden.
 
Alles klar!
Was mich aber eigentlich fast noch mehr verwundert, ist, dass die ID als Index eingetragen und nicht hochgezählt wurde. Verstehe wer will.
Merci!
 
Hi,

du musst arr erst als Array-Variable deklarieren. Dann sollte das Zuweisen wie von dir gewünscht funktionieren:
Code:
var arr = [];
arr = document.getElementsByTagName("img");
Ciao
Quaese
 
Hi Quaese,
diese Variante hatte ich zwar noch nicht getestet, bei mir klappt die aber auch nicht.
D. h. die Länge wird korrekt angezeigt, aber wenn's ans Pushen geht, dann ist Sense.
Es kommt dann dieselbe Fehlermeldung wie oben bereits beschrieben:

"Das Object unterstützt diese Eigenschaft oder Methode nicht."

Ich habe es zwischenzeitlich so gelöst:
Code:
  var arr=[];
  var el = document.getElementsByTagName("img");
  for (var i=0;i<el.length;i++) {
    arr[i]=el[i];
  }

Grüße
Idi
 
GetElementsByTagName liefert eine "NodeList" http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-536297177 oder "HTMLCollection" http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75708506 Array-ähnlich, aber eben nicht ganz.


Basis für mein weiteren Text:
Javascript:
var divs = document.getElementsByTagName('div');


Mit etwas JavaScript-Magic kannst du trotzdem push benutzen.

Javascript:
Array.prototype.push.call(divs, document.createElement('div'));

Leider wird "length" nicht erhöht, außerdem ist es ziemlich lang.

Javascript:
divs[divs.length++] = document.createElement('div');

Funktioniert leider auch nicht ganz, "length" scheint schreibgeschützt zu sein.

Aber um deine Schleife bring ich dich noch herum ;)

Javascript:
var arr = Array.prototype.slice.call(div);

Lorbeeren, dem Lorbeeren zustehen: http://stackoverflow.com/questions/...-way-to-convert-an-htmlcollection-to-an-array
 
Bravo, bist mein Held des Tages...;-)
Ich nehme dann dankend die Nummer vier!
Und ein Weizenbier für den edlen Spender!
Das Schöne an diesem Forum ist, dass es hier ein paar Cracks gibt, von denen man so ganz nebenbei Schmankerl "Array.prototype.slice.call(div);" geboten bekommt.
 
Zuletzt bearbeitet von einem Moderator:
Zurück