testen, ob Objekt eine Funktion kennt, ohne eine Instanz
MudGuard
- javascript
Hi,
ich hab ein schönes ;-) Script geschrieben, das in den aktuellen Versionen des IE, Opera und Geckos funktioniert (Tests mit anderen Browsern stehen noch an).
Jetzt will ich gerne noch bei der Initialisierung abprüfen, ob alle benötigten Funktionen zur Verfügung stehen, um ggf. das Script gar nicht erst zu starten.
Gibt es dafür eine Vorgehensweise, die es mir erlaubt, z.B. zu testen, ob in HTML-Element-nodes eine Funktion existiert, ohne daß ich mir vorher einen konkreten HTML-Element-node hole?
Beispiel:
ich benutze hasChildren() aus dem node-Objekt.
Ich kann mit
if(document.getElementById("bla").hasChildren) alert("hasChildren existiert");
die Prüfung vornehmen (vorher muß natürlich auf Existenz von document.getElementById geprüft worden sein).
Aber dazu benutze ich ja schon einen konkreten node.
Beim Math-Objekt funktioniert z.B. if (Math.round) ...
Aber wenn ich if (Node.hasChildren) ... probiere, klappt's nicht.
Muß ich mir tatsächlich erst einen konkreten node holen?
cu,
Andreas
Hi,
ich benutze hasChildren() aus dem node-Objekt.
muß natürlich hasChildNodes heißen (ich hätt für mein Beispiel hier doch nochmal nachschlagen sollen) ...
cu,
Andreas
moin :)
da Javascript keine static-Methoden für HTML-Elemente kennt, befürchte ich fast, dass dein Vorhaben nicht funktioniert.
Falls das doch geht, bin ich auch sehr an einer Lösung interessiert!
liebe Grüße aus Berlin
lina-
hi,
Gibt es dafür eine Vorgehensweise, die es mir erlaubt, z.B. zu testen, ob in HTML-Element-nodes eine Funktion existiert, ohne daß ich mir vorher einen konkreten HTML-Element-node hole?
Ich denke nicht.
selfhtml sagt ja auch zum Node-Objekt:
"Um auf die Eigenschaften und Methoden des node-Objekts zugreifen zu können, benötigen Sie einen Knoten."
Muß ich mir tatsächlich erst einen konkreten node holen?
Wenn du dir keinen holen willst, dann mach dir selbst einen:
Mit document.createElement() bspw. einen div erzeugen, und dann schauen, ob dieser die Methode hasChildNodes() unterstützt. Anschließend kannst du diesen neuen node ja wieder wegwerfen ...
Hab gerade nur einen IE 5.01 zur Hand, da liefert mir alert(neuerDiv.hasChildNodes)
"function hasChildNodes() {
[native code]
}"
zurück.
alert(typeof neuerDiv.hasChildNodes) liefert seltsamerweise "object", ich hätte "function" erwartet ...?
gruß,
wahsaga
Hi,
Muß ich mir tatsächlich erst einen konkreten node holen?
Wenn du dir keinen holen willst, dann mach dir selbst einen:
Ob holen oder erzeugen spielt eigentlich keine Rolle.
Ich brauch den Knoten ja eigentlich nicht, ich will ja nur wissen, was so ein Knoten denn bieten könnte, wenn ich denn einen hätte,
cu,
Andreas
Ich brauch den Knoten ja eigentlich nicht, ich will ja nur wissen, was so ein Knoten denn bieten könnte, wenn ich denn einen hätte,
uff... "guten Tag, was würde ein Eis mit fünf Kugeln kosten, wenn ich es bezahlen könnte und welche Sorten könnten Sie mir anbieten, und ab wieviel Kugeln würde ich eigentlich einen Rabatt bekommen? Aber nicht, daß Sie jetzt glauben, ich wollte ein Eis bei Ihnen kaufen..." ;-)
Gruß, Andreas
Hi,
Ich brauch den Knoten ja eigentlich nicht, ich will ja nur wissen, was so ein Knoten denn bieten könnte, wenn ich denn einen hätte,
uff... "guten Tag, was würde ein Eis mit fünf Kugeln kosten, wenn ich es bezahlen könnte und welche Sorten könnten Sie mir anbieten, und ab wieviel Kugeln würde ich eigentlich einen Rabatt bekommen? Aber nicht, daß Sie jetzt glauben, ich wollte ein Eis bei Ihnen kaufen..." ;-)
Eben. Ich muß doch nicht erst ein Eis mit allen Sorten kaufen, um herauszufinden, welche Sorten der Gelatero im Angebot hat.
Warum muß ich aber erst einen HTML-node kaufen, um herauszufinden, welche Methoden er im Angebot hat?
cu,
Andreas
Warum muß ich aber erst einen HTML-node kaufen, um herauszufinden, welche Methoden er im Angebot hat?
Weil die w3c-Leute kein Praktikum in der Eisdiele oder ähnlich Kundenfreundlichen Gesellschaftsbereichen vorweisen können ;-)
Gruß, Andreas
Hallo,
Ich kann mit
if(document.getElementById("bla").hasChildren) alert("hasChildren existiert");
die Prüfung vornehmen (vorher muß natürlich auf Existenz von document.getElementById geprüft worden sein).
Aber dazu benutze ich ja schon einen konkreten node.Beim Math-Objekt funktioniert z.B. if (Math.round) ...
Aber wenn ich if (Node.hasChildren) ... probiere, klappt's nicht.
Element.prototype.hasChildNodes funktioniert im Gecko und Opera.
Für den MSIE bin ich überfragt, der kennt weder Node, noch Element, noch HTMLElement und erlaubt dementsprechend auch kein Prototyping, soweit ich informiert bin. Mir fällt auch nur das Erzeugen eines beliebigen Elementknotens ein.
Muß ich mir tatsächlich erst einen konkreten node holen?
Hm, document.createElement() ist doch nicht allzu umständlich...? Man muss sich ja kein Element aus dem Dokument holen.
Mathias
Hi,
Element.prototype.hasChildNodes funktioniert im Gecko und Opera.
Für den MSIE bin ich überfragt, der kennt weder Node, noch Element, noch HTMLElement und erlaubt dementsprechend auch kein Prototyping, soweit ich informiert bin. Mir fällt auch nur das Erzeugen eines beliebigen Elementknotens ein.
Danke.
Wenn ich für die Prüf-Funktion schon wieder prüfen muß, ob die Prüfung funktionieren kann, ist das doof ;-)
Muß ich mir tatsächlich erst einen konkreten node holen?
Hm, document.createElement() ist doch nicht allzu umständlich...? Man muss sich ja kein Element aus dem Dokument holen.
Allzu umständlich nicht.
Aber ich wollte halt - wenn es geht - vermeiden, einen Knoten zu holen/erzeugen, den ich eigentlich gar nicht benutzen will.
Wenn es nicht anders geht, mach ich es halt so.
_Schöner_ wäre es halt ohne konkreten Knoten.
cu,
Andreas
Hi,
Ich kann mit
if(document.getElementById("bla").hasChildren) alert("hasChildren existiert");
die Prüfung vornehmen (vorher muß natürlich auf Existenz von document.getElementById geprüft worden sein).
Aber dazu benutze ich ja schon einen konkreten node.
ich verstehe Dein Problem nicht. Aus welchem Grund willst Du Dir keinen node holen?
if (document.getElementsByTagName("html")[0].hasChildNodes) alert ("hasChildNodes");
sollte in jedem Dokument selbst vor dem Laden eines Javascript-Codes bereits ausführbar sein.
freundliche Grüße
Ingo
Hi,
ich verstehe Dein Problem nicht. Aus welchem Grund willst Du Dir keinen node holen?
Ich brauch den Knoten ja eigentlich nicht, ich will ja nur wissen, was so ein Knoten denn bieten könnte, wenn ich denn einen hätte.
Wenn's nicht anders geht, muß ich halt einen holen ...
cu,
Andreas
Hallo,
if (document.getElementsByTagName("html")[0].hasChildNodes) alert ("hasChildNodes");
sollte in jedem Dokument selbst vor dem Laden eines Javascript-Codes bereits ausführbar sein.
Gute Idee, aber document.documentElement ist wohl einfacher als document.getElementsByTagName("html")[0].
Mathias
Hi,
if (document.getElementsByTagName("html")[0].hasChildNodes) alert ("hasChildNodes");
sollte in jedem Dokument selbst vor dem Laden eines Javascript-Codes bereits ausführbar sein.
Gute Idee, aber document.documentElement ist wohl einfacher als document.getElementsByTagName("html")[0].
document.body wäre noch kürzer ;-)
Wie sieht es da aus mit der Browser-Unterstützung?
IE ab mind. 5.0, Gecko 1.0.6, Opera 8 kennen document.documentElement und document.body,
Opera 7.53 nur document.documentElement.
Wie sieht es mit anderen Browsern (Safari, Konqueror) aus?
cu,
Andreas
Hallo,
if (document.getElementsByTagName("html")[0].hasChildNodes) alert ("hasChildNodes");
sollte in jedem Dokument selbst vor dem Laden eines Javascript-Codes bereits ausführbar sein.
Gute Idee, aber document.documentElement ist wohl einfacher als document.getElementsByTagName("html")[0].document.body wäre noch kürzer ;-)
document.body ist erst beim Eintreten des load-Events verfügbar, das meinte Ingo wohl.
Das heißt, wenn du Tests *während* dem Laden der Seite durchführen willst bzw. du nicht unbedingt warten willst, bis der load-Event feuert, kannst du nicht mit document.body und Knoten unterhalb von body testen. das HTML-Element sollte schon während des Ladens zur Verfügung stehen.
Wie sieht es da aus mit der Browser-Unterstützung?
IE ab mind. 5.0, Gecko 1.0.6, Opera 8 kennen document.documentElement und document.body,
Opera 7.53 nur document.documentElement.
Äh, Opera 7.53 kennt kein document.body? Meinst du, er kennt nur document.body, nicht document.documentElement? Erscheint mir wahrscheinlicher.
Wie sieht es mit anderen Browsern (Safari, Konqueror) aus?
Safari: keine Ahnung, mit Sicherheit schon. Der neueste Konqueror 3.4.1 kann es, sicher auch viele vorher, schließlich ist documentElement DOM 1.0 von 1998. Auf Wunsch kann ich Konqueror 3.1 testen.
Mathias
Hi,
Äh, Opera 7.53 kennt kein document.body? Meinst du, er kennt nur document.body, nicht document.documentElement? Erscheint mir wahrscheinlicher.
Nö. onload getestet mit
if (document.body) alert("knows document.body");
der Alert kam nicht.
Dieser hier
if (document.documentElement) alert("knows document.documentElement");
kam aber.
Safari: keine Ahnung, mit Sicherheit schon.
Ist auch nicht ganz so wichtig ;-)
Der neueste Konqueror 3.4.1 kann es, sicher auch viele vorher, schließlich ist documentElement DOM 1.0 von 1998. Auf Wunsch kann ich Konqueror 3.1 testen.
nö, wenn's ein aktueller kann, reicht das.
cu,
Andreas
Hallo,
Äh, Opera 7.53 kennt kein document.body? Meinst du, er kennt nur document.body, nicht document.documentElement? Erscheint mir wahrscheinlicher.
Nö. onload getestet mit
if (document.body) alert("knows document.body");
der Alert kam nicht.
Dieser hier
if (document.documentElement) alert("knows document.documentElement");
kam aber.
<html>
<head>
<title>murks</title>
<script type="text/javascript">
[code lang=javascript]window.onload = function () {
alert(document.body);
alert(document.documentElement);
};
</script>
</head>
<body>
<p>hallo welt.</p>
</body>
</html>[/code]
Schon in Opera 7.11 Linux (der älteste 7.x, der in Operas Download-Archiv liegt) funktioniert das wie erwartet.
Ich kann gerne noch einmal unter Windows testen - bin mir aber sicher, dass bereits Opera 6, wenn nicht sogar Opera 5 schon document.body kann (document.body ist DOM 1 HTML von 1998).
Mathias
Hi,
<html>
<head>
<title>murks</title>
<script type="text/javascript">
[code lang=javascript]window.onload = function () {
alert(document.body);
alert(document.documentElement);
};
ergibt:
undefined
und
[object HTMLHtmlElement]
in meinem Opera 7.53
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://www.Mud-Guard.de/)
[Schreinerei Waechter](http://www.schreinerei-waechter.de/)
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.