2009-07-21 5 views
3

Ich habe die folgende Situation:Prototyp Element.toggle auf schweben, deaktiviert mit childElements

ich eine Tabellenstruktur wie diese bekommen:

<tr> 
    <td>text</td> 
    <td>text</td> 
    <td>text</td> 
    <td><a href="#"><img src="#" /></td> 
    <td><span style="display:hidden"><a href="#">e</a> <a href="#">e</a></td> 
</tr> 

Was ich mit der folgenden Funktion mache anzeigt die versteckte Spanne beim Schweben der Tabellenzeile. Wie auch immer, es bewegt sich immer dann, wenn ich die childElements im tr übergebe: das verankerte Bild und die Spanne selbst. Wie kann ich das beheben?

// Reveal item options on hover 
$$('#financedata tr').invoke('observe', 'mouseover', function(event) { 
    event.target.up().childElements()[4].childElements()[0].toggle();     
}); 
$$('#financedata tr').invoke('observe', 'mouseout', function(event) { 
    event.target.up().childElements()[4].childElements()[0].toggle(); 
}); 
+0

Können Sie klären, was Sie mit "es Macken" meinen? Vielen Dank. – hobodave

+0

Oh Entschuldigung. Jedes Mal, wenn ich ein childElement überlege, denkt Javascript, dass ich mich außerhalb des übergeordneten Elements befinde, so dass es den Bereich ausblendet. Aber tatsächlich befindet sich mein Cursor immer noch im übergeordneten Element (tr). – richard

+0

Haben Sie meine Lösung versucht? – hobodave

Antwort

5

Versuchen Sie Folgendes:

$$('#financedata tr').invoke('observe', 'mouseout', function(event) { 
    this.up('tbody').childElements()[4].childElements()[0].toggle(); 
}); 

Der Schlüssel "this" verwendet. Bei Prototype ist "dies" immer das Element, an das das Ereignis gebunden ist, während event.target (das Sie nicht verwenden sollten, da es nicht browserübergreifend ist) und event.findElement() das tatsächliche Element des Ereignisses ist trat auf. Das .up ('tbody') ist nur eine persönliche Vorliebe und stellt sicher, dass Sie den Elternteil auswählen, und nichts anderes. Probieren Sie es mit oder ohne.

Gelesen: http://www.prototypejs.org/api/event/observe für mehr Information und Beispiele, wie Ereignisblasen funktionieren.

+0

P.S. Je nach DOM-Markup müssen Sie möglicherweise tbody in table ändern. – hobodave

+0

Beachten Sie auch, dass einige Browser (Firefox) implizit einen tbody zu Ihrem DOM hinzufügen, wenn Sie keinen angeben, achten Sie also darauf. – hobodave

+0

Vielen Dank! Es funktioniert :) Ich werde mehr über Event bubbling und die Verwendung, wenn dies in einem Beobachter. Ich musste damit eigentlich nicht aufbrauchen(), da das Ereignis wie gesagt an die gebunden ist. – richard