Sebastian Becker: cell.children.tags('a')[0].click();

Hallo,

ich habe eine Tabelle mit Links, bei der der jeweilige Link auch beim Anklicken der dazugehörigen Zeile (tr) aufgerufen werden soll. Das untenstehende Skript (verkürzt) sollte eigentlich funktionieren, wenn es im "td" aufgerufen wird. Da ich aber drei Spalten (td) pro Zeile (tr) habe, möchte ich den onClick-Aufruf in das "tr" verlegen.

Wie kann ich von dort aus auf das "a"-tag zugreifen? Ich habe leider bei SelfHTML nichts zu diesem Thema gefunden.

Danke für alle Tips,

Grüße,

Sebastian Becker

---------------------------------------------------------------------

function mClick(cell)
{
if (event.srcElement.tagName == 'td') cell.children.tags('a')[0].click();
}

...

<table>

<tr>
<td><img src="img/bullet.gif"></td>
<td><img src="img/blank.gif"></td>
<td onClick="mClick(this);"><a href="page1.htm">Page 1</a></td>
</tr>

</table>

  1. Hallo Sebastian

    ich habe eine Tabelle mit Links, bei der der jeweilige Link auch beim Anklicken der dazugehörigen Zeile (tr) aufgerufen werden soll. Das untenstehende Skript (verkürzt) sollte eigentlich funktionieren, wenn es im "td" aufgerufen wird. Da ich aber drei Spalten (td) pro Zeile (tr) habe, möchte ich den onClick-Aufruf in das "tr" verlegen.

    hm, ich würde das ganze so lösen (ungetestet):

    <tr onClick="self.location.href="page1.htm'">
    <td><img src="img/bullet.gif"></td>
    <td><img src="img/blank.gif"></td>
    <td><a href="page1.htm" onclick="if (document.all || document.getElementById) return false;">Page 1</a></td>
    </tr>

    IE ab Version 4 und Opera /NN 6 sollten jetzt eigentlich den Event auf das tr ausführen, egal auf welche Zelle geklickt wird. NN4 und jünger verwenden den a-tag.
    Dies liegt daran, dass Ereignisse und ein Mausklick ist ein Ereignis weitergericht werden bis jemand darauf reagiert.

    Aber es gibt definitiv noch eine elegantere Lösung, nur habe ich keine Lust mehr die zu suchen.

    Wie kann ich von dort aus auf das "a"-tag zugreifen? Ich habe leider bei SelfHTML nichts zu diesem Thema gefunden.

    Danke für alle Tips,

    Grüße,

    Sebastian Becker


    function mClick(cell)
    {
    if (event.srcElement.tagName == 'td') cell.children.tags('a')[0].click();
    }

    ...

    <table>

    <tr>
    <td><img src="img/bullet.gif"></td>
    <td><img src="img/blank.gif"></td>
    <td onClick="mClick(this);"><a href="page1.htm">Page 1</a></td>
    </tr>

    </table>

    1. Fortsetzung ...

      :-) tab enter enter war keine gute idee mit dem IE

      Aber es gibt definitiv noch eine elegantere Lösung, nur habe ich keine Lust mehr die zu suchen.

      Eventhandler werden normalerweise durchgereicht, bis er was findet das reagiert.

      Wie kann ich von dort aus auf das "a"-tag zugreifen? Ich habe leider bei SelfHTML nichts zu diesem Thema gefunden.

      der theoretisch schnelle Weg geht über die Kindselemente also
      kinder von tr schaue nach was es gibt (ist td)
      gibts ein kind schaue nach, gibts ein a (kann viel sein)
      gibts ein a schaue nach ist es ein href
      verarbeite es

      Kritsch wird es, sobald Element verschachteln

      Nunja der Rest ist doku lesen und ausprobieren.

      Viele Grüße

      Antje

    2. Hallo,

      Danke für die schnelle Antwort!

      Aber es gibt definitiv noch eine elegantere Lösung, nur habe ich keine Lust mehr die zu suchen.

      Das glaube ich auch und kann ich verstehen. Ich wollte mir nämlich das doppelte Schreiben des Links ersparen. Außerdem weiß ich nicht, ob der Aufruf eines Links mit self.location.href auch in die Browser-History eingetragen wird.

      Wie kann ich von dort aus auf das "a"-tag zugreifen?
      der theoretisch schnelle Weg geht über die Kindselemente also
      kinder von tr schaue nach was es gibt (ist td)
      gibts ein kind schaue nach, gibts ein a (kann viel sein)
      gibts ein a schaue nach ist es ein href
      verarbeite es

      Gerade an der Stelle komme ich nicht weiter. Wie spreche ich das Kindselement von einem Kindselement an? Geht das vielleicht über

      cell.children(1).tags('a')[0].click();   ?
      --------------^-----------------------

      Vielleicht hat ja noch jemand eine Idee?

      Also nochmals vielen Dank und eine gute Nacht, Grüße,

      Sebastian

      1. Hallo Sebastian,

        Das glaube ich auch und kann ich verstehen. Außerdem weiß ich nicht, ob der Aufruf eines Links mit self.location.href auch in die Browser-History eingetragen wird.

        doch wird, aber click() kennt nur der IE und Opera

        Gerade an der Stelle komme ich nicht weiter. Wie spreche ich das Kindselement von einem Kindselement an? Geht das vielleicht über

        cell.children(1).tags('a')[0].click();   ?
        --------------^-----------------------

        Teste mal das:

        <table width="100%" >
        <tr onclick="if (document.all) this.cells[2].all.tags('a')[0].click();
        else if (document.getElementsByTagName)
        if (this.cells) self.location.href=this.cells[2].getElementsByTagName('a')[0].href;
        else self.location.href=this.getElementsByTagName('td')[2].getElementsByTagName('a')[0].href">
         <td> Testtext</td>
         <td>Testtext </td>
         <td><a href="javascript:alert(1)">Verweis</a>  </td>
         <td> Testtext</td>
        </tr>
        <tr  onclick="if (document.all) this.cells[1].all.tags('a')[0].click();
        else if (document.getElementsByTagName)
        if (this.cells) self.location.href=this.cells[1].getElementsByTagName('a')[0].href;
        else self.location.href=this.getElementsByTagName('td')[1].getElementsByTagName('a')[0].href">
         <td> Testtext</td>
         <td><a href="javascript:alert(2)">Verweis</a> </td>
         <td>Testtext </td>
         <td>Testtext </td>
        </tr>
        </table>

        Der Aufruf:

        if (document.all) this.cells[2].all.tags('a')[0].click(); //IE ab Version 4
        else if (document.getElementsByTagName)
        if (this.cells) self.location.href=this.cells[2].getElementsByTagName('a')[0].href; //NN 6
        else self.location.href=this.getElementsByTagName('td')[2].getElementsByTagName('a')[0].href  //Opera ab 5.12

        this nimmt bezug auf die Zeile
        cells ist das Array der Zellen einer Zeile

        mit this.cells[2]. bzw. this.getElementsByTagName('td')[2] greifst du auf die entsprechende Zelle zu und dann weiter auf den Verweis.

        Viele Grüße

        Antje
        Viele Grüße

        1. Eine Ergänzung noch

          if (document.getElementsByTagName)
           if (this.cells) { self.location.href=this.cells[2].getElementsByTagName('a')[0].href; return false;}//NN 6

          Das return false verhindert, dass der NN6 den Event nach unten durchreicht und wie im Beispiel beim Klick auf den Verweis zweimal das alert() ausführt.

          Gruß

          Antje

          1. Hallo,

            danke für den Code

            den Aufruf:

            onclick="if (document.all) this.cells[2].all.tags('a')[0].click();

            else if (document.getElementsByTagName)
            if (this.cells) self.location.href=this.cells[2].getElementsByTagName('a')[0].href;
            else self.location.href=this.getElementsByTagName('td')[2].getElementsByTagName('a')[0].href"

            muß ich erst mal in eine Funktion verpacken - sonst blick' ich nicht mehr durch - und dann muß ich das Ganze mal in Ruhe testen.

            Wäre schön, wenn's klappt! :-)

            Grüße,

            Sebastian