2011-01-16 6 views
-1

Ich möchte einen Zoom-Effekt auf einige Daumen erstellen.jQuery: Hover (mouseleave Ereignis ausgelöst, wenn die Maus über Kind ist)

Hier ist mein Javascript vereinfachten Code:

parent.hover(
function(){ 
    parent.stop().animate({/* css */}, inputZoomDuration, "linear"); 
    wrapper.stop().animate({/* css */}, inputZoomDuration, "linear"); 
    child.stop().animate({/* css */}, inputZoomDuration, "linear"); 
}, 
function(){ 
    alert("leave"); 
    child.stop().animate({/* css */}, 140, "linear"); 
    wrapper.stop().animate({/* css */}, 140, "linear"); 
    parent.stop().animate({/* css */}, 140, "linear"); 
} 
); 

und die html ist wie:

<div parent> 
<div wrapper> 
    <div child> 

    </div> 
</div> 
</div> 

ich die Größe aller meiner divs erhöhen, wenn ich über die "Eltern". Aber sobald ich eines der Kinder überlasse (oder verlasse, btw), erscheint der Alarm. Ohne die Warnung ist das Ergebnis eine sehr bugy Animation. Gibt es eine Möglichkeit zu verhindern, dass das mouseleave -Ereignis ausgelöst wird, wenn ein Kind übergangen wird?

Mit freundlichen Grüßen,

danke.

Edit: Hier ist der Greasemonkey-Skript: http://userscripts.org/scripts/show/94786 und ein Link zu testen: http://browse.deviantart.com/ Wir in der Konsole sehen können, dass das Mouseleave-Ereignis trigerred wird, wenn ich die Orange div verlassen, im Gegensatz zu diesem Beispiel: http://www.jsfiddle.net/wnuS6/3/ wo das Ereignis nicht ausgelöst wird, wenn ich das rote Div verliere.

+0

Welche Version von jQuery verwenden Sie? Können Sie tatsächlichen Code bereitstellen, der das Problem reproduziert? – user113716

+0

Danke für die Antwort. Ich benutze jQuery (1.4.2) in einem Fettmonkey-Skript. Der Code ist ein bisschen schwierig. Ich werde versuchen, es hier zu posten, sobald ich es ein bisschen putze und testen, was Sie sagen. – CronosS

+0

Wenn möglich, erstellen Sie ein [jsFiddle] (http://www.jsfiddle.net/) Beispiel, das das Problem reproduziert. (Achten Sie darauf, die richtige Bibliothek auf der linken Seite auszuwählen.) – user113716

Antwort

1

Nach einigen Untersuchungen scheint es, dass das Problem von greasemonkey kommt. Hier ist, was die Wiki sagte:

Einige Versionen von jQuery nicht in der Grease Sandbox ausgeführt wird. Ab dieses Schreiben, 1.3.2 funktioniert, aber 1.4.1 nicht. Es ist möglich, 1.4 Versionen von jQuery zu patchen, zu arbeiten sehen jQuery Forum: Importieren von jQuery 1.4.1 in Greasemonkey-Skripte generiert einen Fehler

jedoch alle 1.4.x Versionen von jQuery gepatcht noch nicht funktionieren in meinem speziellen Schwebeflug-Fall UND nur mit greasemonkey (tatsächlich teste ich das gleiche Skript in jsFiddle, und das funktioniert mit jQuery 1.4.4).

Um das Problem zu lösen, verwende ich einfach jQuery 1.3.2 (und natürlich muss ich meinen Code ein wenig anpassen).

2

Ändern Sie das Ereignis von .hover() zu .mouseenter(). Dadurch wird sichergestellt, dass es so lange aktiv bleibt, bis Sie den übergeordneten div-Bereich verlassen, den Sie mithilfe des Ereignisses mouseleave() erkennen können. http://api.jquery.com/mouseenter/ - http://api.jquery.com/mouseleave/

+0

'Hover' mit zwei Handlern ist eine Abkürzung für' mouseenter/mouseleave'. – user113716

+0

Hover ist eine Abkürzung für mouseenter und mouseleave, so dass es keinen Unterschied macht, sie zu ändern. Das eigentliche Problem ist das Event-Bubbling. –

+0

@ Box9: In Bezug auf Blasenbildung, das ist, was 'mouseenter()' und 'mouseleave()' sollen auflösen, da sie Microsofts "mouseenter/mouseleave" -Ereignisse zu emulieren sind, die nicht sprudeln. Ich denke, da ist noch etwas anderes. – user113716