Rhapsy: Problem mit getElementsByTagName("a")

Hallo,

ich versuche über a = document.getElementsByTagName("a") an die links auf einer website heranzukommen. hab im netz keine andere möglichkeit gefunden und scheint ja auch bei allen anderen zu funktionieren - nur bei mir nicht ;)

Hab auch schon versucht dass ganze über intervalID = setInterval("test()", 1000); mit Zeitverzögerung hinzubekommen, da ich dachte, dass es vielelicht noch nicht fertig geladen ist. aber auch da nix.

ich bekomm als a.length immer 0!

zum aufbau des ganzen:

habe ein rechts-klick-menüpunkt angelegt:

<popup id="contentAreaContextMenu">
  <menuitem id="Memorize"
 insertbefore="context-sep-viewbgimage"
 oncommand="futures_Memorize(gContextMenu.linkURL)"/>
</popup>

und dann die js-funktion (da ich nie in die if anweisung hineinkomme, können sich da auch noch fehler versteckt hab, aber die sind auch gerade nicht wichtig ;)):

function futures_Memorize(tempLink)
{
    var a = document.getElementsByTagName("a");
    if (a.length>0)
    {
      for(var i = 0; i < a.length; i++)
      {
 if(a[i].hasAttribute("href") && a[i].href==templink)
 {
   Entrytitle.push(a[i].title);
   Entryurl.push(a[i].href);
        }
      }
    }
}

grüße,
rhapsy

  1. Hallo,

    bezüglich Internet Explorer und dessen HTML-DOM nachfolgend alle Collectionen zum Objekt documment. Collection ist ein Feld von Referenzen z.B. Zeigerfeld von Link-Objekten.

    Eine Collection kann naturülich auch programmiert werden z.B. in dem
    per getElementsByXXXX-funktionen die Zeiger eingesammelt werden in ein Feld. Das ist nötig, wenn keine Collection zum Objekt bereits vorhanden ist (doucment hat aber collection linkls)

    Gruss Tom.

    Collection Description
    all Returns a reference to the collection of elements contained by the object.
    anchors Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.
    applets Retrieves a collection of all applet objects in the document.
    childNodes Retrieves a collection of HTML Elements and TextNode objects that are direct descendants of the specified object.
    embeds Retrieves a collection of all embed objects in the document.
    forms Retrieves a collection, in source order, of all form objects in the document.
    frames Retrieves a collection of all window objects defined by the given document or defined by the document associated with the given window.
    images Retrieves a collection, in source order, of img objects in the document.
    links Retrieves a collection of all a objects that specify the HREF property and all area objects in the document.
    namespaces Retrieves a collection of namespace objects.
    scripts Retrieves a collection of all script objects in the document.
    styleSheets Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document.

    1. Hallo Tom,

      danke für die schnelle Antwort.
      Nun hatte ich doch glatt vergessen zu erwähnen, dass sich das ganze in einer Firefox Extension befindet...

      also nützen mir die collections des IE nicht viel. leider! (davon hatte ich nämlich auch schon gelesen ;)

      grüße,
      rhapsy

      1. Hallo,

        Gecko-HTML-DOM bitte anschauen

        http://developer.mozilla.org/en/docs/JavaScript
        http://developer.mozilla.org/en/docs/Gecko_DOM_Reference

        Gruss Tom.

        1. Hallo,

          Gecko-HTML-DOM bitte anschauen

          http://developer.mozilla.org/en/docs/JavaScript
          http://developer.mozilla.org/en/docs/Gecko_DOM_Reference

          Gruss Tom.

          Sehr gute Antwort auf seine Frage. Du hättest auch schreiben können: "Fische leben im Wasser, bitte nachsehen!" Total sinnfrei ...

          1. Hallo,

            stimmt, der Sinn der Fisch-Wasser-Theorie wird erst dann sichtbar, wenn man weiss, dass z.B. manche Fische Salzwasser nutzen, gell.
            Das ist auch so beim HTML-DOM der Browser. Man muss sich auskennen oder suchen, stimmts :-). Wer HTML-DOM nutzt, wird oft jaulen über Browser-Divergenzen.

            Gruss Tom.

            1. Hallo

              Das hat doch nicht das geringeste mit dem DOM zu tun. Erstens kennt jeder Browser getElementsByTagName und zweitens geht es hier um seine Unfähigkeit, Extensions zu programmieren. Ließ dir mal den Beitrag von mir weiter oben durch, da steht das drin, was er wissen möchte. Ihm scheint es aber unmöglich zu sein, dies bereits in der Fragestellung zu klären.

              Grüße zippy

              1. getElementsByTagName() ist eine (HTML-)DOM-Funktion, da sie den Baum
                der HTML-Hierarchie abklappern kann. Browser nutzen dazu auch Collectionen (z.T. interne). Letzendlich sind fast alles nur Zeiger auf Instanzen.

                Ob der Poster unfähig ist, weiss ich nicht. Erahnen kann man schon, was er will. Dann also auch helfen - versuchen.

                Gruss Tom.

                1. getElementsByTagName() ist eine (HTML-)DOM-Funktion, da sie den Baum
                  der HTML-Hierarchie abklappern kann. Browser nutzen dazu auch Collectionen (z.T. interne). Letzendlich sind fast alles nur Zeiger auf Instanzen.

                  Was hast du nur immer mit deinen Collections, das hat doch nichts das geringste mit seiner Fragestellung zu tun. Irgenwie begreifst du das scheinbar nicht. Auch weiß ich nicht warum du ständig HTML-DOM sagst ... Ich gebs auf ... sinnlose Posts ... oh das mache ich ja auch gerade ... du scheinst ein noob zu sein, die hängen sich auch immer an ihrem Wissen auf und wiederholen sich ständig ...

                  du versuchst zu erklären, dass ein getElementsByTagName eine Collection von Elementen zurück gibt, doch was hat das mit seiner Frage zu tun, ich verstehs nicht, warum du so andwortest, ich schüttel schon 3h mit dem Kopf ...

                  Gut damit dieser Post noch einen Sinn erhält sage ich folgendes:
                  die DOM - Methode getElementsByTagName liefert die Elemente zurück, die sich im aktuellen document befinden, sie returned eine NodeList (http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-A6C9094) (der Begriff Collection verwendet man in dem Zusammenhang nicht)
                  du musst dir das Element holen, dass das document der Webseite enthält, beim Fx ist dieses Element ein iframe
                  wie du an dieses Objekt aus der Extension herankommst musst du auf xulplanet.com nachlesen oder im #xul irc - channel von mozilla erfragen

                  Grüße zippy

      2. also nützen mir die collections des IE nicht viel. leider! (davon hatte ich nämlich auch schon gelesen ;)

        document.links existiert in allen Browsern, die JS können, wie kommst du darauf dass das nur der IE könnte?

        Struppi.

        --
        Javascript ist toll (Perl auch!)
  2. Hallo

    Hey du hantierst dort mit XUL ... Wie kann ich dann den Zusammenhang zu deinem Problem herstellen? Wo sind die anchor - Elemente, vielleicht in einem anderen Namespace (getElementsByTagNameNS)?! Auch fehlt deinem menuitem eine label ...

    1. Ah jetzt weiß ch wie du das meinst, du willst aus der Extension die anchor - Elemente des Browser - Window hersuasfinden. Du musst dir grundsätzlich das Window holen, auf das iframe - Element zugreifen und auf dessen document. Dort kannst du die Methode getElementsByTagName anwenden. Wie man allerdings das Window - Element bekommt bin ich überfragt, ist auch schon sehr lange her, dass ich Extensions programmiert habe. Aber schau doch einfach mal bei xulplanet.com vorbei, die kennste ja sicherlich schon. Da gibt es sicher eine XPCOM - Object dafür ...

      Naja viel Spass beim suchen!

      Grüße zippy

      1. Hallo Zippy,

        danke für die hilfe. ich war suchen und hab gefunden was ich suchte. ich muss das ganze mit var a = window.content.document.getElementsByTagName("a"); aufrufen und schon bekomm ich meine nodelist ...

        dankeschön...
        Rhapsy

        Ah jetzt weiß ch wie du das meinst, du willst aus der Extension die anchor - Elemente des Browser - Window hersuasfinden. Du musst dir grundsätzlich das Window holen, auf das iframe - Element zugreifen und auf dessen document. Dort kannst du die Methode getElementsByTagName anwenden. Wie man allerdings das Window - Element bekommt bin ich überfragt, ist auch schon sehr lange her, dass ich Extensions programmiert habe. Aber schau doch einfach mal bei xulplanet.com vorbei, die kennste ja sicherlich schon. Da gibt es sicher eine XPCOM - Object dafür ...

        Naja viel Spass beim suchen!

        Grüße zippy

  3. Hi,

    Mal abgesehen vom eigentlichen Problem:

    if (a.length>0)
        {
          for(var i = 0; i < a.length; i++)
          {

    [...]

    }
        }

    Welchen Zusatz-Nutzen erwartest Du Dir von diesem if um diese Schleife?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert 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 Andreas,

      jetzt wollte ich schon sagen: "Na dass die schleife nur ausgeführt wird, wenn auch mind. ein link da ist" ... 2 sekunden später ... "hmm  sie wird ja sonst auch nur ausgeführt, wenn mind. ein link in der nodelist ist"

      danke für den tipp ;)
      rhapsy

      Hi,

      Mal abgesehen vom eigentlichen Problem:

      if (a.length>0)
          {
            for(var i = 0; i < a.length; i++)
            {
      [...]
            }
          }

      Welchen Zusatz-Nutzen erwartest Du Dir von diesem if um diese Schleife?

      cu,
      Andreas