2010-12-28 7 views
2

Ich schreibe ein einfaches jQuery-Plugin, das Bilder mit einer bestimmten Klasse in der Mitte des Bildschirms (wenn angeklickt, voller Größe) mit einem grauen Overlay um das Bild angezeigt wird. Wenn wir auf das Overlay klicken, verschwindet es. Jetzt benutze ich dieses Stück Code:jQuery .add Methode

$("#overlay").click(function(){ 
     $(this).animate({ 
      opacity: "0" 
     }, 500, function(){ 
      $(this).css({ 
       display: "none" 
      }); 
     }); 

     $("#imgcontainer").animate({ 
      opacity: "0" 
     }, 500, function(){ 
      $(this).css({ 
       display: "none" 
      }); 

     }); 

    }); 

imgcontainer hält unser Bild. Ich habe versucht, dies einfachen Code zu verwenden, aber es funktioniert nicht:

$("#overlay").click(function(){ 
     $(this).add("#imgcontainer").animate({ 
      opacity: "0" 
     }, 500, function(){ 
      $(this).css({ 
       display: "none" 
      }); 
     }); 
    }); 

Warum es nicht funktioniert?

UPDATE:
Korrekter Code:

$("#overlay").click(function(){ 
     $("#imgcontainer").add(this).fadeOut(); 
    }); 

Vielen Dank für die Antworten. Dieses Verhalten (Bug?) Ist in der Tat sehr überraschend.

Antwort

3

Wenn Sie v1.4.x verwenden, wegen issue #7853 habe ich gerade früher in ihrem Bug-Tracker früher (was Timing!) Ausgelöst. Sie können das Problem beheben, indem diese zu ändern:

$(this).add("#imgcontainer").animate(... 

zu

$(this).add($("#imgcontainer")).animate(... 

aktualisieren: Hier ist eine bessere (sehr effizient) Art und Weise, wie Nick unten wies darauf hin:

$("#imgcontainer").add(this).animate(... 

(Siehe auch seinen Hinweis zu fadeOut.)

In jQuery 1.3.2 und früher hätte es wie erwartet funktioniert. Ich weiß nicht, ob die 1.4.x-Sache ein Bug oder eine absichtliche inkompatible Änderung ist.

Frage obwohl: Warum nicht gerade den Behälter ausklingen? Wenn es das Bild enthält, sollte das das Bild auch verblassen lassen, oder? Wie in this example? (Ich mache nicht viel Animation, also Entschuldigung, wenn ich etwas Subtiles verpasst habe.)Egal, du hast nie gesagt #overlay war das Bild, das war eine ungültige Annahme von meiner Seite.

+2

Es gibt einen noch kürzeren Weg, '.fadeOut()' setzt 'display: none' am Ende, also' $ ("# imagecontainer"). Add (this) .fadeOut() 'sollte funktionieren. +1 für das Problem, würde +2 für die Fehlerspeicherung, wenn ich könnte. –

+0

@Nick: Guter Punkt über die Neuordnung als eine effizientere Möglichkeit, es zu beheben. Und danke. :-) Ich zog mir heute früher die Haare aus, als ich darauf stieß. –

+0

J. - Ich würde sagen, an diesem Punkt war es absichtlich, da '.add (selector, context)' hinzugefügt wurde, als das kaputt ging ... also wird es wahrscheinlich als kein Bug geschlossen –