Arrays verketten

Denniz

Erfahrenes Mitglied
Hi Leute,

ich habe ein Skript das mir ermöglicht im IE6,7 ein focus zu setzten für Textarea und Input Felder.
Allerdings klappt das Skript nicht wenn ich die Array verketten will.
HTML:
sfFocus = function() {
	var all_arr = new Array();
    var sfEls = document.getElementsByTagName("INPUT");
	var taEls = document.getElementsByTagName("TEXTAREA");
	  
	all_arr = sfEls.concat(taEls);
	  
	// all_arr = sfEls; Dies funktioniert
	// all_arr = taEls; Dieses auch!
	// wieso kann ich die Arrays nicht verketten?
	
    for (var i=0; i<all_arr.length; i++) {
		 if(all_arr[i].type != 'checkbox'){  
			all_arr[i].onfocus=function() {
					this.className+=" sffocus";
			}
			all_arr[i].onblur=function() {
					this.className=this.className.replace(new RegExp(" sffocus\\b"), "");
			}
		}
	}	 
}

if (window.attachEvent) window.attachEvent("onload", sfFocus);

Woran könnte es liegen und warum funktioniert kein 'alert(all_arr.length)'. Es müßte doch ein Alertfenster erscheinen. - Bin JS .nooob :)
 
Moin,

getElementsByTagName() liefert in Wirklichkeit keinen Array, sondern ein Objekt(HTMLCollection).
Array-Methoden wie concat() lassen sich auf Objekte nicht anwenden.

Du müsstest die item()'s aus diesem Objekt in einen Array überführen, um da concat() verwenden zu Können.
 
Hi,

[klugscheisserei]
@Sven
Genau betrachtet handelt es sich bei der Rückgabe der Methode getElementsByTagName nicht um eine HTMLCollection, sondern um eine NodeList. Diese erlaubt lediglich den Zugriff über einen positiven Zahlenwert.
[/klugscheisserei]

@Denniz
Ich hatte mal eine ähnliche Anforderung. Es musste eine unbekannte Anzahl an Objekten zu einem Array verkettet werden. Hierfür habe ich den prototype des Array-Objekts um eine Methode erweitert, die das erledigt.
Code:
Array.prototype.qpConcat = function(){
  // Alle übergebenen Argumente durchlaufen
  for(var i=0; i<this.qpConcat.arguments.length; i++){
    // Die Komponenten der einzelnen Objekte durchlaufen und an Array anhängen
    for(var strEntry in this.qpConcat.arguments[i])
      if(typeof this.qpConcat.arguments[i][strEntry] == 'object')
        this.push(this.qpConcat.arguments[i][strEntry]);
  }

  return this;
}

Beispielaufruf:
Code:
  var arrA = document.getElementsByTagName("input");
  var arrB = document.getElementsByTagName("textarea");
  var arrC = document.getElementsByTagName("img");

  var arrConcat = [].qpConcat(arrA, arrB, arrC);

  strOut = "";
  for(var i=0; i<arrConcat.length; i++){
    strOut += "arrC["+i+"] = " + arrConcat[i] + "\n";
  }

  alert(strOut + "\n\n" + arrConcat.length);

Ciao
Quaese
 
Hi,

alles klar, jetzt weiß ich wieso das nicht ging.
Dein Protoype funktioniert super.

Besten Dank und Gruß
 
[klugscheisserei]

[nochmehrklugscheisserei :-)]

Wenn es (nur) eine NodeList wäre, dürfte dies nicht funktionieren
Code:
<input><input><input id="foo" value="bar"><input><input><input><input>

<script type="text/javascript">
<!--
var coll = document.getElementsByTagName("INPUT");
alert(coll.namedItem('foo').getAttribute('value'));
//-->
</script>
...weil NodeList keine Methode namedItem() besitzt.... HTMLCollection besitzt diese jedoch.


alle von mir gemachten Angaben gehen davon aus, dass es sich um ein HTML-Document handelt
[/nochmehrklugscheisserei ]

*duckundweg* :-(
 
Hi,

da muss ich dir natürlich recht geben ... fällt mir auch nicht schwer, nachdem du schon geduckt weggelaufen bist :D.

Laut W3C sollte allerdings eine NodeList zurückgegeben werden. Eventuell ein Zugeständnis der Entwickler. Auf jeden Fall werde ich es mir merken.

Wir könnten uns ja auf eine HTMLNodeListCollection einigen ;-)

Ciao
Quaese
 
Wir könnten uns ja auf eine HTMLNodeListCollection einigen ;-)

Ciao
Quaese

Jo :suspekt:

Im Grunde genommen ist die HTMLCollection auch eine NodeList, HTML-DOM wurde ja vom DOM abgeleitet.
Der Einzige Unterschied ist halt dieses namedItem() , mit welchem man anhand von id/name zugreifen kann.

Ein XML-Elementknoten hat ja von Hause aus keine solchen Attribute, ein HTML-Elementknoten aber schon.
 

Neue Beiträge

Zurück