;( function ( $ ){ $.fn.addback = $.fn.addback || $.fn.andself; $.fn.extend({ actual : function ( method, options ){ // check if the jquery method exist if( !this[ method ]){ throw '$.actual => the jquery method "' + method + '" you called does not exist'; } var defaults = { absolute : false, clone : false, includemargin : false, display : 'block' }; var configs = $.extend( defaults, options ); var $target = this.eq( 0 ); var fix, restore; if( configs.clone === true ){ fix = function (){ var style = 'position: absolute !important; top: -1000 !important; '; // this is useful with css3pie $target = $target. clone(). attr( 'style', style ). appendto( 'body' ); }; restore = function (){ // remove dom element after getting the width $target.remove(); }; }else{ var tmp = []; var style = ''; var $hidden; fix = function (){ // get all hidden parents $hidden = $target.parents().addback().filter( ':hidden' ); style += 'visibility: hidden !important; display: ' + configs.display + ' !important; '; if( configs.absolute === true ) style += 'position: absolute !important; '; // save the origin style props // set the hidden el css to be got the actual value later $hidden.each( function (){ // save original style. if no style was set, attr() returns undefined var $this = $( this ); var thisstyle = $this.attr( 'style' ); tmp.push( thisstyle ); // retain as much of the original style as possible, if there is one $this.attr( 'style', thisstyle ? thisstyle + ';' + style : style ); }); }; restore = function (){ // restore origin style values $hidden.each( function ( i ){ var $this = $( this ); var _tmp = tmp[ i ]; if( _tmp === undefined ){ $this.removeattr( 'style' ); }else{ $this.attr( 'style', _tmp ); } }); }; } fix(); // get the actual value with user specific methed // it can be 'width', 'height', 'outerwidth', 'innerwidth'... etc // configs.includemargin only works for 'outerwidth' and 'outerheight' var actual = /(outer)/.test( method ) ? $target[ method ]( configs.includemargin ) : $target[ method ](); restore(); // important, this plugin only return the value of the first element return actual; } }); })(jquery);