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.
This commit is contained in:
parent
18ee5a93a2
commit
5c1725d689
63
src/fx.js
63
src/fx.js
|
@ -1,33 +1,56 @@
|
||||||
|
var elemdisplay = {};
|
||||||
|
|
||||||
jQuery.fn.extend({
|
jQuery.fn.extend({
|
||||||
show: function(speed,callback){
|
show: function(speed,callback){
|
||||||
return speed ?
|
if ( speed ) {
|
||||||
this.animate({
|
return this.animate({
|
||||||
height: "show", width: "show", opacity: "show"
|
height: "show", width: "show", opacity: "show"
|
||||||
}, speed, callback) :
|
}, 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";
|
||||||
|
|
||||||
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();
|
elem.remove();
|
||||||
|
|
||||||
|
elemdisplay[ this[i].tagName ] = display;
|
||||||
|
}
|
||||||
|
|
||||||
|
this[i].style.display = jQuery.data(this[i], "olddisplay", display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
}).end();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
hide: function(speed,callback){
|
hide: function(speed,callback){
|
||||||
return speed ?
|
if ( speed ) {
|
||||||
this.animate({
|
return this.animate({
|
||||||
height: "hide", width: "hide", opacity: "hide"
|
height: "hide", width: "hide", opacity: "hide"
|
||||||
}, speed, callback) :
|
}, speed, callback);
|
||||||
|
} else {
|
||||||
this.filter(":visible").each(function(){
|
for ( var i = 0, l = this.length; i < l; i++ ){
|
||||||
this.oldblock = this.oldblock || jQuery.css(this,"display");
|
var old = jQuery.data(this[i], "olddisplay");
|
||||||
this.style.display = "none";
|
if ( !old && old !== "none" )
|
||||||
}).end();
|
jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
|
||||||
|
this[i].style.display = "none";
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// Save the old toggle function
|
// Save the old toggle function
|
||||||
|
|
Loading…
Reference in a new issue