Merius: getElementsByClassName

Hallo!

Zur Zeit schlage ich mich mit folgendem Problem herum.

Auf der Webseite befindet sich folgendes Element:

<a href="test.php?product=4533233" class="Perma_Link">Informationen über den Link</a>

Im gesamten Quellcode wird dieses eine class Element genau einmal eingesetzt und es ist mir nicht möglich den Aufbau der Webseite  zu verändern. Eine id oder ein name kann somit nicht hinzugefügt werden.

Meine Aufgabe ist es nun, den href auszulesen, im Besonderen die Zahlenkombination des übergebenen Parameters.

Ich habe etwas gegoogelt und bin auf "getELementyByClassName" gestoßen und habe folgendes gebastelt:

function addProduct() {  
	var permaLink=document.getElementsByClassName(Perma_Link)[0];  
	alert("Perma"+permaLink);  
}

Allerdings bekomme ich keine Ausgabe, manche Google Quellen sprechen sogar davon dass diese Funktion nicht mehr unterstützt wird?

Weiters hieß es die Funktion würde eine LinkedList returnieren, dass würde natürlich erklären warum ich es nicht als Array ansprechen kann.

Würde mich wie immer über Hilfestellungen freuen!

mfg,
-Merius

  1. Hi!

    var permaLink=document.getElementsByClassName(Perma_Link)[0];
    Allerdings bekomme ich keine Ausgabe,

    Doch, in der Fehlerkonsole. Du möchtest einen String und keine (nicht vorhandene) Variable notieren.

    Lo!

    1. Doch, in der Fehlerkonsole. Du möchtest einen String und keine (nicht vorhandene) Variable notieren.

      Hm, sei mir nicht böse wenn ich dich frage von welcher Fehlerkonsole du redest? Möglicherweise ein Firefox Plugin?

      Vernünftiges Javascript debuggen wäre einer meiner Wunschträume ;)

      1. Hi!

        Hm, sei mir nicht böse wenn ich dich frage von welcher Fehlerkonsole du redest?

        Firefox: Extras->Fehlerkonsole

        Möglicherweise ein Firefox Plugin? Vernünftiges Javascript debuggen wäre einer meiner Wunschträume ;)

        Da sei dir Firebug empfohlen, inklusive schrittweiser Abarbeitung und Variableninhaltekontrolle (sogar ganze Ausdrücke lassen sich überwachen).

        Lo!

        1. Firefox: Extras->Fehlerkonsole

          Oh, so nah und doch so fern. Damit kann ich schon einmal etwas anfangen!

          Da sei dir Firebug empfohlen, inklusive schrittweiser Abarbeitung und Variableninhaltekontrolle (sogar ganze Ausdrücke lassen sich überwachen).

          Firebug habe ich bereits drauf, allerdings nutzte ich ihn nur zum anpassen von Style Informationen.

          Vielen Dank für die schnellen Infos, mal sehen ob ich es damit gebacken bekommen!

          1. Hi,

            Firebug habe ich bereits drauf, allerdings nutzte ich ihn nur zum anpassen von Style Informationen.

            Firebug ist ein äußerst mächtiges Werkzeug, mit dem Du Dich weiter beschäftigen solltest. Es ermöglicht Dir sogar, Breakpoints zu setzen.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
  2. @@Merius:

    nuqneH

    Ich habe etwas gegoogelt und bin auf "getELementyByClassName" gestoßen

    Wann immer du auf getELementyByClassName stößt, wirst du es vermutlich nicht brauchen.

    Weitaus performanter dürfte es sein, das Element nicht im gesamten DOM zu suchen, sondern in der schon vorhandenen <http://de.selfhtml.org/javascript/objekte/links.htm@title=Auflistung der Links>.

    for (var i = 0, permaLink; !permaLink && i < document.links.length; i++)  
      if (document.links[i].className == "Perma_Link")  
        permaLink = document.links[i];
    

    Die Schleife bricht ab, sobald der (erste) Link mit der Klasse "Perma_Link" gefunden wurde. Ist kein solcher vorhanden, ist permaLink am Ende immer noch undefined.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. Hallo Gunnar,

      for (var i = 0, permaLink; !permaLink && i < document.links.length; i++)

      if (document.links[i].className == "Perma_Link")
          permaLink = document.links[i];

        
      ist "permaLink" nicht eine lokale Variable, die nur innerhalb der Schleife existiert und danach entfernt wird?  
        
      Gruß, Jürgen  
      
      
      1. @@JürgenB:

        nuqneH

        for (var i = 0, permaLink; !permaLink && i < document.links.length; i++)

        if (document.links[i].className == "Perma_Link")
            permaLink = document.links[i];

        
        >   
        > ist "permaLink" nicht eine lokale Variable, die nur innerhalb der Schleife existiert und danach entfernt wird?  
          
        Lokal ja, aber auch nach der Schleife weiterhin verfügbar:  
          
        `alert (permaLink ? permaLink.href : "nix da");`{:.language-javascript}  
          
        Qapla'
        
        -- 
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.  
        (Mark Twain)
        
        1. Hallo Gunnar,

          Lokal ja, aber auch nach der Schleife weiterhin verfügbar:

          danke für die Info. Ich dachte immer, innerhalb der for-Schleife mit "var" angelegte Variablen würden nach Ablauf der Schleife vergessen. Wieder was gelernt.

          Gruß, Jürgen

          1. Lokal ja, aber auch nach der Schleife weiterhin verfügbar:

            danke für die Info. Ich dachte immer, innerhalb der for-Schleife mit "var" angelegte Variablen würden nach Ablauf der Schleife vergessen. Wieder was gelernt.

            Das ist in Perl so, Javascript hat nur Funktionsweite Scopes (hmm, schreibt man das so?) keinen Blockscope

            Struppi.

            1. Hallo Struppi,

              Das ist in Perl so, Javascript hat nur Funktionsweite Scopes (hmm, schreibt man das so?) keinen Blockscope

              dann macht das oft empfohlene var in der for-Schleife die Variable nur lokal in der Funktion, nicht aber in der Schleife.

                
               var i=42;  
               var j=55;  
               for(var i=0,j;i<5;i++) j=i;  
               alert(i+"   "+j);
              

              liefert "5   4".

              Gut zu wissen.

              Gruß, Jürgen

              1. Hallo,

                dann macht das oft empfohlene var in der for-Schleife die Variable nur lokal in der Funktion, nicht aber in der Schleife.

                Ja, so ist es. Man kann ebenso gut die Schleifenvariablen ganz normal am Anfang einer Funktion deklarieren. Der Compiler behandelt alle gleich.

                Gruß, Don P

              2. Das ist in Perl so, Javascript hat nur Funktionsweite Scopes (hmm, schreibt man das so?) keinen Blockscope

                dann macht das oft empfohlene var in der for-Schleife die Variable nur lokal in der Funktion, nicht aber in der Schleife.

                Genau. Aber das "oft empfohlene" ist Geschmackssache. Ich mach es so, weil ich es von Perl so gewohnt bin und weil ich die "Nähe" der Deklaration bevorzuge. Das hat aber den Nachteil, dass man u.U. den Schleifenzähler mehrfach mit var deklariert, aber da stört sich JS auch nciht dran. C oder Java Programmierer machen es vermutlich anders, weil man dort gezwungen ist jede Variabel zu deklarieren und es daher i.d.R. direkt hinter dem Funktionsblock macht.

                Struppi.

              3. Hallo,

                var i=42;

                var j=55;
                for(var i=0,j;i<5;i++) j=i;
                alert(i+"   "+j);

                
                >   
                > liefert "5   4".  
                >   
                > Gut zu wissen.  
                  
                Ja, und nicht nur das, sondern sogar  
                  
                ~~~javascript
                ( function () {  
                    i=42, j=55;                      // i,j global?  
                    for(var i=0; i<5; j=++i){}       // i lokal?  
                  }  
                )(); alert([ String(window.i), j ]); // u confused?
                

                gibt "undefined,5" aus, genau wie

                ( function () {  
                    i=42, j=55;                      // i,j global?  
                    for( i=0; i<5; j=++i) {}  
                    var i;                           // i lokal!  
                  }  
                )(); alert([ String(window.i), j ]); // u confused?
                

                i ist zuerst nur scheinbar global, wird nämlich dann doch noch mit var deklariert und deshalb auch nur lokal in der Funktion angelegt, im Unterschied zu j, was wirklich eine globale Variable wird.

                Aber
                ( function(){vari=5; var i; alert(i)} )();

                gint auch "undefined" aus

                Gruß, Don P

                1. i ist zuerst nur scheinbar global, wird nämlich dann doch noch mit var deklariert und deshalb auch nur lokal in der Funktion angelegt, im Unterschied zu j, was wirklich eine globale Variable wird.

                  Das var wird in der Comilephase interpretiert und die Zuweisungen erst zur Laufzeit, da ist i aber schon lokal deklariert.

                  Aber
                  ( function(){vari=5; var i; alert(i)} )();

                  gint auch "undefined" aus

                  Da sind zwei Tippfehler drin, der eine ist entscheidend für deine falsche Schlußfolgerung ;-)

                  Struppi.

                  1. Hallo,

                    ( function(){vari=5; var i; alert(i)} )();

                    gint auch "undefined" aus

                    Da sind zwei Tippfehler drin, der eine ist entscheidend für deine falsche Schlußfolgerung ;-)

                    Ok, so wär's richtig:

                    ( function(){var i=5; var i; alert(i);} )(); // 5

                    Dann stimmt's auch wieder. i wird auch hier nur lokal angelegt.

                    Gruß, Don P

              4. Hallo,

                Danke an Struppi und an Don P für die Erläuterungen und Beispiele.

                Gruß, Jürgen

            2. Block Scope gibt es mittels »let« im Spidermonkey seit JavaScript 1.7 und wahrscheinlich wird die nächste ECMAScript-Version (Codename »Harmony«) let standardisieren. ES3 und ES5, da hast du natürlich Recht, kennen jedoch nur funktionalen Scope.