MudGuard: testen, ob Objekt eine Funktion kennt, ohne eine Instanz

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

--
Warum nennt sich Andreas hier MudGuard?
Schreinerei Waechter
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  1. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. 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-

      --
      Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
  2. 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."

    • und das erscheint eigentlich auch ganz logisch und vernünftig.

    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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. 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

        --
        SELFFORUM - hier werden Sie geholfen,
        auch in Fragen zu richtiges Deutsch
        1. 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 nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. 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

            --
            SELFFORUM - hier werden Sie geholfen,
            auch in Fragen zu richtiges Deutsch
  3. 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

    1. 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

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. 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

    1. 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

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    2. 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

      1. 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

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. 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

          1. 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

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. 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

              1. 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.