actual plugin
http://dreamerslab.com/blog/en/get-hidden-elements-width-and-height-with-jquery/
stack-overflow 的討論
http://stackoverflow.com/questions/2345784/jquery-get-height-of-hidden-element-in-jquery-1-4-2
jQuery 有 height , width , outerWidth , outerHeight 這些函式可以取得元件的面積資訊,
但是有時候有些元件是被隱藏(hidden)的,還是需要取得他的面積,所以上面兩篇文章都是在處理這方面的問題,
大都是修改元件隱藏的方式,來讓元件雖然是看不到的(假隱藏)但是還是可以取得寬高,
但是我自己的情況是…不是該元件被隱藏,而是他的老爸被隱藏,所以這些方法把他的隱藏方式修改…其實還是看不到…
所以想到另外一個概念,就是把他 clone 出來 body 好了,這樣應該不會看不到了,把資訊取完再砍掉吧…
如果該元素有其他 class 的 css 設定下可能會有不太準…只是至少我暫時解決了…
/** * @license jQuery Hawk 0.1 * * Copyright 2011 mlwmlw * licensed under the MIT. */ (function($) { var supported = ['height', 'width', 'outerHeight', 'outerWidth', 'innerHeight', 'innerWidth']; var check = {}; for(var i in supported) { check[supported[i]] = true; } var ref = {}; var $target = $('body'); $.fn.hawk = function(type) { if(typeof(check[supported[i]]) == 'undefined') { throw 'unsupported method'; } var $clone = $(this).clone(); $clone.css({'position':'absolute', 'visibility':'hidden', 'display':'block'}).appendTo($target); var result = null; if(typeof(ref[type]) != 'undefined') { result = ref[type].apply($clone,[]); } else { result = $clone[type](); } //alert($(this).attr('class') + ': '+ type + ': '+ result); $clone.remove(); return result; } $.hawk = function(cmd, options) { if(cmd == 'install') { for(var i in supported) { ref[supported[i]] = $.fn[supported[i]]; $.fn[supported[i]] = (function(type) { return (function() { return $(this).hawk(type); }) })(supported[i]); } } else if(cmd == 'restore') { for(var i in supported) { $.fn[supported[i]] = ref[supported[i]]; } ref = {}; } } })(jQuery);
api 是參考 actual 的設計…
$('xxx:hidden').hawk('width'); $('xxx:hidden').hawk('height'); $('xxx:hidden').hawk('innerWidth'); $('xxx:hidden').hawk('outerWidth');
只是因為我遇到得問題是其他的 plugin 在取的時候出錯,
也不太可能去把他的 source code 都改成這個 API 吧…太麻煩,之後更新也會有問題,
所以就額外寫了安裝這個 plugin 的函式:
$.hawk(‘install’)
這樣就會把上述那些取寬高資訊的函式預設成 jQuery 內建的,
例如 $(‘xx’).height 就會被換成 $(‘xx’).hawk(‘height’);
只是安裝了以後一直這樣取值效能會很差,這些函式會一直 clone dom,
所以安裝了以後,但是用完了就能用這函式移除這層關聯:
$.hawk(‘restore’); 這樣就沒事了…