IE8だとdisplay:noneのものをjQueyr.is(':hidden')で判断できない?
今回やりたかったのは、テーブルの行を表示・非表示させるというもの。show(), hide()で制御するんだけど、押した瞬間にすでに表示済みかどうか判断するのにis(':hidden')で判断していた。こんな風に
var row = $("#row1");// <tr>のオブジェクトを取得 if (row.is(':hidden')) { row.show(); } else { row.hide(); }
これで、hidden(非表示)の状態だったら表示(show())するように、表示されていたら非表示(hide())にするようにしていたんだけど・・・。
IE6でもIE7でも問題なく動作するのになぜかIE8だとうまくいかない。is(':hidden')の結果は常にfalse。
そこで、hide()が呼ばれると内部でどうなっているのか見てみると、style属性にdisplay:noneをセットしているのがわかった(以下jquery.jsの引用)。これが使えそう。
// Set the display of the elements in a second loop // to avoid the constant reflow for ( var i = 0, l = this.length; i < l; i++ ){ this[i].style.display = "none"; // たぶんこれ }
そして、上記if文を以下のようにすることで、IE8でも表示・非表示を切り替えられるようになりました。
var row = $("#row1");// <tr>のオブジェクトを取得 if (row.css('display') == 'none') { row.show(); } else { row.hide(); }
うーん。なんとも納得いかない。