Jascha U.: Automatisch definierte Arrays (document.links[] etc.)

Hi,

ich habe ein Problem mit Arrays. Eigentlich sollte es ja in JavaScript möglich sein, alle Elemente der vordefinierten Arrays, die dann ja jeweils ein HTML-Objekt repräsentieren, nicht nur über ihre Indexnummer anzusprechen, sondern auch über ihren Namen bzw. ihre Id.

Das klappt mit dem document.images[]-Array und fast allen anderen auch ohne Probleme, nur im Internet Explorer (bei mir 5.5) und Netscape Navigator (4.5) funktioniert das nicht mit dem document.links[]-Array nicht... Wenn ich einen Link mit dem Namen, meinetwegen "sonstwas" habe, ist es im IE und NN nicht möglich den z.B per document.links["sonstwas"].onmouseover anzusprechen. Im Opera und Mozilla funktioniert das ohne Probleme. Weiß jemand ob es dafür eine Lösung gibt????

  1. Hi

    Also document.links ist kein Array sondern ein eigenes Objekt
    eben das links Objekt mit den in <file:/Selfhml/tecbbg.htm>
    beschriebenen Eigenschaften. Diesem Missverständnis bin ich bereits
    selbst erlegen. Seltsamerweise kann man aber (zumindest unter NN)
    document.links mittels concat in ein Array umkopieren.

    ob du dann die Links mittels name ansprechen kannst bleibt abzuwarten, in
    Selfhtml ist sowas nicht dokumentiert,

    2. document.images["sonstwas"].onmouseover soll funktionieren ???
    Kannste mir bitte zeigen wo das dokumentiert ist?

    Viele Grüße
    Rolf

    1. Hi Rolf!

      Also document.links ist kein Array sondern ein eigenes Objekt
      eben das links Objekt mit den in <file:/Selfhml/tecbbg.htm>
      beschriebenen Eigenschaften. Diesem Missverständnis bin ich bereits
      selbst erlegen. Seltsamerweise kann man aber (zumindest unter NN)
      document.links mittels concat in ein Array umkopieren.

      Objekte und Arrays sind in JS technisch dasselbe. (Suche im Archiv nach "Kontinuum".) Philosphisch ist da aber natuerlich trotzdem ein gewisser Unterschied. Im speziellen ist document.links ein Array, welches Objekt vom Typ Link enthaelt (und Area, falls Du Image maps verwendest).
      http://developer.netscape.com/docs/manuals/js/client/jsref/document.htm#1193918

      1. document.images["sonstwas"].onmouseover soll funktionieren ???
        Kannste mir bitte zeigen wo das dokumentiert ist?

      Das geht in Netscape nicht, aber Jascha schrieb ja document.links["sonstwas"].onmouseover, nicht document.images["sonstwas"].onmouseover, und fuer Links wird der OnMouseOver-Handler ja auch in Netscape interpretiert.

      Fuer Jascha: Auf http://developer.netscape.com/docs/manuals/js/client/jsref/stmt.htm#1004815 findest Du, wie man alle Eigenschaften eines Objekts (gleichbedeutend mit alle Eintraege in einem Array) anzeigt. Wenn dort fuer document.links in den entsprechenden Browsern nicht die Namen der Links angezeigt werden, dann hast Du wohl Pech gehabt. Wenn mich mir http://developer.netscape.com/docs/manuals/js/client/jsref/link.htm so anschaue, haette ich zumindest fuer Netscape 4 wirklich nicht viel Hoffnung, da im Link-Objekt noch nicht mal eine name-Property vorhanden ist.

      So long

      1. Hi Calocybe

        Grübel das in JS Objekte=Arrays sind war mir klar aber....:

        Wenn links[] ein vollständiges Array ist, warum funktioniert

        alert(document.links.join()) nicht, dafür aber

        A=new Array;
        A=A.concat(document.links);
        alert(A.join())

        getestet in einem NN4.7 Linux.

        Ich will mich ungern auf Selfhtml V7.0 stützen aber ich denk mir es hat schon
        seinen Grund warum nur links.length aufgeführt wird.

        Viele Grüße
        Rolf

        1. Naband! ;-)

          Wenn links[] ein vollständiges Array ist, warum funktioniert
          alert(document.links.join()) nicht, dafür aber

          Mmh, gute Frage. Ich schaetze, ein Array-Objekt (was document.links nicht ist), ist eben ein assoziatives Array, welches die speziellen Methoden join, splice usw. unterstuetzt, genauso wie z.B. ein window-Objekt die speziellen Methoden open, moveBy usw. hat. Aber wirklich wissen tu ich das nicht.

          Ich will mich ungern auf Selfhtml V7.0 stützen aber ich denk mir es hat schon
          seinen Grund warum nur links.length aufgeführt wird.

          Naja, in Selfhtml steht vieles nicht, was es ueber JS zu wissen gibt.

          So long

          1. Morchen :)

            ich hab jetzt die halbe nacht dokus gewälzt und bin nicht viel schlauer.
            alert(document.links) liefert [object LinkArray]

            Eine Googlesuche von LinkArray liefert kaum brauchbares.

            Wie auch immer, meine Vermutung ist wir müssen bei JS zwischen dem
            (hashfähigen) primitiven container array und dem Array-Object unterscheiden
            (Groß/Klein beachten).Nur das Array-Objekt kennt Methoden, array ist nur
            eine Sequenz von Pointern auf Speicherplätzen die andere Daten
            enthalten. Auf diese Daten kann dann wahlweise über Index oder Hashnamen
            zugegriffen werden.

            Die Aussage alle Objekte sind arrays, besagt dass alle Objekte
            intern wie in diesem Datentyp array abgelegt werden, der z.B. indizierung
            erlaubt und nicht dass alle Objekte Unterobjekte des Array-Objektes sind,
            die die Array-Methoden erben. Bei Date,document ... wirste deswegen auch
            kein join() finden!

            Dass macht auch Sinn den das Objekt Array kann ja nicht intern als
            Array abgelegt werden, da beißt sich ja der Hund in den Schwanz vor lauter
            Rekursion!!!

            LinkArray, ImageArray, usw. sind dann der Vollständigkeit halber eigene
            Objekte die als arrays anderer Objekte ergeben und zusätzlich
            noch ein paar Methoden und Eigenschaften spendiert bekommen haben.
            LinkArray kennt halt length und nicht join().

            Was Jaschas Problem betrifft die Links mit Namen anzusprechen, bin ich skeptisch,
            da es ja eigentlich auch Anchor bzw AnchorArray (document.anchors) gibt,
            die die name-angaben aufnehmen!

            Nun genug der interpretationen, wenn mir jemand mit ner vernünftigen URL
            zu diesem Thema weiterhelfen kann wär ich ihm sehr dankbar.

            Viele Grüße
            Rolf

            1. Morchen :)

              Ebenfalls!

              Wie auch immer, meine Vermutung ist wir müssen bei JS zwischen dem
              (hashfähigen) primitiven container array und dem Array-Object unterscheiden
              (Groß/Klein beachten).Nur das Array-Objekt kennt Methoden, array ist nur
              eine Sequenz von Pointern auf Speicherplätzen die andere Daten
              enthalten. Auf diese Daten kann dann wahlweise über Index oder Hashnamen
              zugegriffen werden.

              Das meinte ich in meinem vorigen Posting.

              Was Jaschas Problem betrifft die Links mit Namen anzusprechen, bin ich skeptisch,
              da es ja eigentlich auch Anchor bzw AnchorArray (document.anchors) gibt,
              die die name-angaben aufnehmen!

              Ich denke, das ist lediglich ein Problem in derselben Kategorie, wie dass z.B. NN4 in seinem images-Array nur Bilder mit Namen auffuehrt, die mit <IMG NAME> im Quelltext stehen, aber nicht welche, die mit <IMG ID> ihren Namen erhalten haben.

              So long

      2. Hi again Cal!

        Das geht in Netscape nicht, aber Jascha schrieb ja document.links["sonstwas"].onmouseover, nicht document.images["sonstwas"].onmouseover, und fuer Links wird der OnMouseOver-Handler ja auch in Netscape interpretiert.

        Ich hab noch nie gesehen, dass man den Eventhandler auf diese Weise
        dynamisch zuweisen konnte und hätte gerne einen Dokulink
        darauf. Interessiert mich ehrlich brennend! :)

        Aus deinen bisher geposteten URLs konnte ich kein solches Beispiel
        gewinnen. Natürlich hat das Link-Objekt Eventhandler, aber schreibender
        Zugriff aus JS heraus ???

        Viele Grüße
        Ro * der gerne dazulernt * lf

        1. ReHi again Cal!

          Nun gut, mein Linuxnetscape kanns zwar nicht, dafür klappts überall
          auf der Win98 Seite!

          Test(){alert("jojo")};
          void(document.links[0].onmouseover=Test);

          Viele Grüße
          Ro *der ständig dazulernt* lf

          PS: Kann mir einer erklären warum nur links, aber nicht
          das Link Objekt in SelfHtml 7.0 auftaucht?

        2. Auch Hi again!

          Aus deinen bisher geposteten URLs konnte ich kein solches Beispiel
          gewinnen. Natürlich hat das Link-Objekt Eventhandler, aber schreibender
          Zugriff aus JS heraus ???

          Die Stelle, wo's steht, finde ich jetzt leider nicht. Aber auf http://developer.netscape.com/docs/manuals/js/client/jsref/handlers.htm findest Du bei einigen Beispielen diese Variante angewendet.

          Prinzipiell ist ein <A ... onMouseOver="some JS code"> nur ein Shortcut fuer ein spaeteres
            document.links[...].onmouseover = new Function("some JS code");
          d.h. der Browser belegt die Handler beim Laden automatisch mit solchen anonymen Funktionen.

          So long