MoFi: Greasemonkey-Script, Linkfarbe als firstChild verändern

Hi @ all,

ich möchte mit einem Greaskonkey-Script die Link-Farben einer Navigationsleiste verändern. Die Leiste ist wie folgt aufgebaut:

  
<table>  
 <tbody>  
  <tr>  
   <td class="classname"></td>  
   <td class="classname">  
    <a href="...">ABC</a>  
   </td>  
   <td class="classname">  
    <a href="...">ABC</a>  
   </td>  
   <td class="classname">  
    <a href="...">ABC</a>  
   </td>  
   <td class="classname"></td>  
  </tr>  
 </tbody>  
</table>  

Ich will nun an alle Zellen wie folgt herankommen. Dabei verändere ich noch gleich deren Hintergrund:

  
classElements = document.evaluate(  
    "//td[@class='classname']",  
    document,  
    null,  
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,  
    null);  
  
for (var i=0; i< classElements.snapshotLength; i++){  
    thisElement = classElements.snapshotItem(i);  
    thisElement.style.background = "url('url_to_file')";  
  
    if(thisElement.childNodes.length > 0){ //vorher stand hier if(thisElement.firstChild) aber das war auch nix  
        thisElement.firstChild.style.color = "black";  
    }  
}  

Als Fehlermeldung bekomme ich immer:
Fehler: thisElement.firstChild.style is undefined

Was ist dennn falsch?
Wenn ich nun auch noch a:link, a:visited,... einstellen möchte, wie kann ich das machen?

Danke schonmal für eure Hilfe.

Grüße

  1. Hi,

    <td class="classname">
        <a href="...">ABC</a>

    classElements = document.evaluate(
        "//td[@class='classname']",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    classELements enthält also die tds mit der Klasse classname (sehr sinnvoller Klassenname übrigens).

    Das first-child ist natürlich der Textknoten mit dem Whitespace zwischen dem > vom td und dem < vom a.
    Und Textknoten haben keine style-Eigenschaft.

    Als Fehlermeldung bekomme ich immer:
    Fehler: thisElement.firstChild.style is undefined

    Natürlich.

    Wenn ich nun auch noch a:link, a:visited,... einstellen möchte, wie kann ich das machen?

    Im Stylesheet.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. classELements enthält also die tds mit der Klasse classname (sehr sinnvoller Klassenname übrigens).

      Das hat natürlich nen anderen Klassennamen. Habe nur den zu Veranschaulichung genommen.

      Das first-child ist natürlich der Textknoten mit dem Whitespace zwischen dem > vom td und dem < vom a.

      Dann ist alles klar.

      Wenn ich nun auch noch a:link, a:visited,... einstellen möchte, wie kann ich das machen?

      Im Stylesheet.

      Da ich das ganze per Javascript lokal "nachbearbeiten" will hab ich keinen direkten Zugriff auf den Stylesheet

      Danke dir

      1. Hi,

        Da ich das ganze per Javascript lokal "nachbearbeiten" will hab ich keinen direkten Zugriff auf den Stylesheet

        Aber auf's DOM. Und damit kannst Du Elemente im Dokument einfügen. Auch im head. Und sogar style-Elemente.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Aber auf's DOM. Und damit kannst Du Elemente im Dokument einfügen. Auch im head. Und sogar style-Elemente.

          Das hat mich auf die Idee gebracht einfach den Stylesheet umzuschreiben, die ursprünglichen zu blocken und meinen einzubinden.
          Muss nur ein paar Sachen verändern von daher ist das nicht so viel Aufwand.
          Habe jetzt auch die ursprünglichen <link rel="styleheet" ...> gelöscht und will nun meim eigenes einbinden.

          Leider bekomme ich die Rückmeldung:

          Security error

          Gibt es ne Möglichkeit den trotzdem einzubinden, auch wenn er auf meiner Festplatte ist?

          Danke schonmal,

          1. Hab es hinbekommen.
            Hier steht es erklärt:
            http://www.computerbase.de/forum/showthread.php?t=533089

            Grüße

    2. Aber wie kann ich nun überprüfen welches childNode der Link ist?
      Kann ich abfragen, ob es sich um einen Tag handelt?

      Grüße

      1. Hi,

        Aber wie kann ich nun überprüfen welches childNode der Link ist?

        Jeder Node hat einen Typ. Den kann man abfragen (genaue Syntax im Selfhtml nachgucken ...)

        Kann ich abfragen, ob es sich um einen Tag handelt?

        Nein. Aber ob es sich um ein Element handelt.

        Oder Du holst Dir alle a-Elemente im gefundenen td und nimmst davon den ersten.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Kann ich abfragen, ob es sich um einen Tag handelt?

          Nein. Aber ob es sich um ein Element handelt.

          Oder Du holst Dir alle a-Elemente im gefundenen td und nimmst davon den ersten.

          Oder man verwendet statt firstChild firstElementChild. Können alle Browser außer IE < 9.

          Mathias

          1. Oder man verwendet statt firstChild firstElementChild. Können alle Browser außer IE < 9.

            Das ist perfekt.

            Danke

          2. Hi,

            Oder man verwendet statt firstChild firstElementChild.

            Danke - kannte ich noch nicht.

            Können alle Browser außer IE < 9.

            Also mal wieder die übliche Ausnahme ...

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
            1. Können alle Browser außer IE < 9.

              Also mal wieder die übliche Ausnahme ...

              Ist ja kein Problem, das für ältere Browser nachzubauen: http://www.w3.org/2008/12/23-ElementTraversal.html

              IE 8 kann ferner Getter und Setter mit ECMAScript 5 Property Descriptors und unterstützt die prototypische Erweiterung von Element (Beispiel) - womit man die Eigenschaften so nachbauen kann, dass die Verwendung vollkommen transparent erfolgen kann.

              Aber solange es nur um GreaseMonkey-Scripte geht, kann einem IE wohl komplett egal sein.

              Mathias