aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Resig <jeresig@gmail.com>2008-12-19 18:21:12 +0000
committerJohn Resig <jeresig@gmail.com>2008-12-19 18:21:12 +0000
commit5c1725d689c1b5b9a8d3c35aa85c42e71016855b (patch)
treeba749c310596ecba7cd1e38296f94b7a4de2ce8d
parent18ee5a93a2d940789d57544da5f61324bd55e3ec (diff)
downloadjquery-5c1725d689c1b5b9a8d3c35aa85c42e71016855b.tar.gz
jquery-5c1725d689c1b5b9a8d3c35aa85c42e71016855b.zip
Rewrote the hide and show methods to fix the issue with Safari not hiding distached elements. Fixed #1239, #2233, #3038, #3343, #3395. They're also faster now, as well.
-rw-r--r--src/fx.js67
1 files changed, 45 insertions, 22 deletions
diff --git a/src/fx.js b/src/fx.js
index 939739689..626119bc9 100644
--- a/src/fx.js
+++ b/src/fx.js
@@ -1,33 +1,56 @@
+var elemdisplay = {};
+
jQuery.fn.extend({
show: function(speed,callback){
- return speed ?
- this.animate({
+ if ( speed ) {
+ return this.animate({
height: "show", width: "show", opacity: "show"
- }, speed, callback) :
-
- this.filter(":hidden").each(function(){
- this.style.display = this.oldblock || "";
- if ( jQuery.css(this,"display") == "none" ) {
- var elem = jQuery("<" + this.tagName + " />").appendTo("body");
- this.style.display = elem.css("display");
- // handle an edge condition where css is - div { display:none; } or similar
- if (this.style.display == "none")
- this.style.display = "block";
- elem.remove();
+ }, speed, callback);
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ){
+ var old = jQuery.data(this[i], "olddisplay");
+
+ this[i].style.display = old || "";
+
+ if ( jQuery.css(this[i], "display") === "none" ) {
+ var tagName = this[i].tagName, display;
+
+ if ( elemdisplay[ tagName ] ) {
+ display = elemdisplay[ tagName ];
+ } else {
+ var elem = jQuery("<" + this[i].tagName + " />").appendTo("body");
+
+ display = elem.css("display");
+ if ( display === "none" )
+ display = "block";
+
+ elem.remove();
+
+ elemdisplay[ this[i].tagName ] = display;
+ }
+
+ this[i].style.display = jQuery.data(this[i], "olddisplay", display);
}
- }).end();
+ }
+
+ return this;
+ }
},
hide: function(speed,callback){
- return speed ?
- this.animate({
+ if ( speed ) {
+ return this.animate({
height: "hide", width: "hide", opacity: "hide"
- }, speed, callback) :
-
- this.filter(":visible").each(function(){
- this.oldblock = this.oldblock || jQuery.css(this,"display");
- this.style.display = "none";
- }).end();
+ }, speed, callback);
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ){
+ var old = jQuery.data(this[i], "olddisplay");
+ if ( !old && old !== "none" )
+ jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
+ this[i].style.display = "none";
+ }
+ return this;
+ }
},
// Save the old toggle function