2009-08-05 6 views
2

Ich bin neu in der ganzen JavaScript und jQuery-Codierung, aber ich bin zur Zeit dies zu tun ist mein HTML:Gibt es eine einfachere Möglichkeit, das Quellelement für ein Ereignis zu referenzieren?

<a id="tog_table0" 
    href="javascript:toggle_table('#tog_table0', '#hideable_table0');">show</a> 

Und dann habe ich einige etwas schwerfälliger Code, um das Element zu zwicken:

function toggle_table(button_id, table_id) { 
     // Find the elements we need 
     var table = $(table_id); 
     var button = $(button_id); 
     // Toggle the table 
     table.slideToggle("slow", function() { 
     if ($(this).is(":hidden")) 
    { 
    button.text("show"); 
    } else { 
     button.text("hide"); 
    } 
    }); 
} 

Ich frage mich hauptsächlich, ob es eine bessere Möglichkeit gibt, das Quellenelement zu referenzieren, als zwei IDs an meine Funktion zu übergeben.

Antwort

2

Verwenden Sie 'dies' innerhalb des Ereignisses. In jQuery bezieht sich dies normalerweise auf das Element, das den Handler aufgerufen hat.

Versuchen Sie auch, Inline-Skript-Ereignishandler in Tags zu vermeiden. Es ist besser, diese Ereignisse im Dokument bereit zu halten.

Hinweis: Der folgende Code geht davon aus, dass das Element, das den Handler (den Link) aufruft, innerhalb der Tabelle liegt, so dass er ihn mit dem nächstgelegenen Befehl durchlaufen kann. Dies ist möglicherweise nicht der Fall und Sie müssen möglicherweise eine der anderen Verfahroptionen abhängig von Ihrem Markup verwenden.

$(function(){ 
    $('#tog_table0').click(toggle_table) 
}); 

function toggle_table() { 
    //this refers to the element clicked 
    var $el = $(this); 
    // get the table - assuming the element is inside the table 
    var $table = $el.closest('table'); 
    // Toggle the table 
    $table.slideToggle("slow", function() { 
     $el.is(":hidden") ? $el.text("show") : $el.text("hide"); 
    } 
} 
+0

In meinem Fall die Tabelle unten das ist Header, der den Link enthält. Ich nehme an, ich würde eine Version von find() verwenden? – stsquad

1

Sie können dies tun:

<a href="" name="#hideable_table0" class="tableHider">show</a> 

und Ihr Javascript, um diese Änderung:

$('a.tableHider').click(function() { 
    var table = $(this.name); // this refers to the link which was clicked 
    var button = $(this); 

    table.slideToggle("slow", function() { 
     if ($(this).is(':hidden')) { // this refers to the element being animated 
      button.html('show'); 
     } 
     else { 
      button.html('hide'); 
     } 
    }); 

    return false; 
}); 

edit: geändert Skript den Namen Attribut zu verwenden und hat eine return false auf den Klick Handler.

+0

Hmmm, ich kann nicht scheinen, dass das funktioniert. Wenn man genauer hinschaut, stellt sich heraus, dass die href ein vollständiger Link ist (zB http: //cgi-bin/myscript.pl#hideable_table0 "). Ich frage mich, ob die Tabelle nicht das richtige Element ist. Auch versucht der Klick, die Seite zu verschieben auf den internen "# thideable_table0" Punkt auf der Seite. – stsquad

+0

Hoppla, mein böses Entschuldigung. Habe das Skript aktualisiert, um stattdessen das name-Attribut zu verwenden. Außerdem gibt die Funktion jetzt false zurück, um das Blättern zu verhindern. Lass es mich wissen, wenn es hilft. – jammus

Verwandte Themen