z-indexの最も大きい値を取ってくる

zindexの最大値を取ってくる関数を作ってみた。
とりあえずモダンブラウザは全て動いてました。(IE7/Safari2-3/Firefox2/Opera9/NN7)

コード

var getLargestZIndex = function(){
 var largestZIndex = 0; 
 var defaultView = document.defaultView;
 var func = function(tagname){
  var elems = document.getElementsByTagName(tagname), len=elems.length;
  for(var i=0; i<len; i++){
   var elem = elems[i];
   var zIndex = elem.style.zIndex;
   if (!zIndex) {
    var css = elem.currentStyle || defaultView.getComputedStyle(elem,null);
    zIndex = css ? css.zIndex : 0;
   }
   zIndex -= 0;
   if(largestZIndex < zIndex) largestZIndex=zIndex;
  }
 };
 if(arguments.length == 0) func('*');
 else for(var i=0; i<arguments.length; i++) func(arguments[i]);
 return largestZIndex;
};

使い方

引数にはタグ名を指定します。指定しない場合は全てのタグが対象になります。

console.log( getLargestZIndex('div','p') );

タグ名を指定したほうが断然処理が早いです。

懸念

  • ロジックがロジックだけに遅い。(id:amachangさんのコメントのおかげで2割くらい早くなった。)
  • firebug lite使うとコンソールのiframeのzindex取ってくる(除外か何かできるといいかも)

メモ

ブラウザの差異の処理を先にしても期待したより早くならなかった。関数の参照と論理和による評価だと掛かるコストは同じくらいっぽい。

// defaultView変数の定義の次の行に以下のコードを配置
var getStyle = (!defaultView)?
 function(elem){return elem.currentStyle;}:
 function(elem){return defaultView.getComputedStyle(elem, null);};

//  css変数の定義を以下のように置き換える
//var css = elem.currentStyle || defaultView.getComputedStyle(elem,null);
var css = getStyle(elem);