molily: Safari: typeof document.getElementsByTagName('*') === 'function'

Beitrag lesen

Meine Erweiterungsfunktion prüfte vorher, ob es sich um ein Objekt handelt, da sowohl Arrays ([]), Hashes ({}) als auch DOM Collections bei allen mit gesundem Menschenverstand entwickelten Browsern den Typ 'object' haben.

Jedes Objekt, dass [[Call]] implementiert, wird von typeof als "function" erkannt. Insofern ist das durchaus logisch.

Zu 90% reicht ein Test auf »Truthyness« wie if (object) {} aus, andernfalls if (typeof object != 'undefined').

Es hat lange gedauert, bis ich der Ursache meines Problems auf die Schliche gekommen war: typeof document.getElementsByTagName('*') gibt in diesem Browser 'function' zurück.

Ja, weil zur IE-Kompatibilität nodelist(0) bzw. nodelist('identifier') möglich ist. Es ist also tatsächlich eine Funktion.

Ich weiß zwar nicht, was die Jungs in Cupertino rauchen, aber sie scheinen großen Gefallen daran zu finden.

Sie streben Kompatibilität mit IEs document.all(0) bzw. document.all('id') bzw. document.all('name') an.

Nebenbei: Bei Opera 10.50 ist die Master-Klasse aller DOM-Nodes, HTMLElement, undefined - was zu Problemen mit PrototypeJS älterer Version führt.

Prototype erweitert HTMLElement meines Wissens nicht, oder?

Außerdem kann ich nicht bestätigen, dass HTMLElement undefined in Opera 10.50 ist.

<p id="thep">blub</p>  
  
<script>  
[code lang=javascript](function () {  
	HTMLElement.prototype.bla = function () {  
		alert('okay');  
	};  
  
	var p = document.getElementById('thep');  
	alert(typeof p.bla);  
	p.bla();  
})();

</script>[/code]

Das funktioniert problemlos im Opera 10.50.

Mathias