display: none
[..]、Prototype では、要素が非インライン CSS で非表示 ( ) と宣言されている場合、要素を表示に切り替えることはできません。これは私が理解していないことであり、常にイライラしています。それについての洞察を提供できる人なら誰でも、私から大きな支持を得ます.
おそらくすでにこれを見たことがあるでしょうが、例のドキュメントshow
(同じメモを持つ他の関連する関数があります) は次のように述べています。
Element.show
CSS スタイルシートで非表示になっている要素は表示できません。これはプロトタイプの制限ではなく、CSSdisplay
プロパティの動作の結果であることに注意してください。
つまり、これは既知の問題であり、彼らは CSS を非難しています。ただし、次のドキュメントを検討してください (私は以前に Prototype を使用したことがないため、これが DOM のロードを待つための推奨される方法であるかどうかはわかりませんが、動作しているようです):
<!doctype html>
<script src="prototype.js"></script>
<script>
document.observe("dom:loaded", function() {
$("victim").show();
});
</script>
<style>
p#victim {display:none;}
</style>
<p id="victim">Hello world!
ご存知のように、これは機能しません。なんで?display
では、Prototype は、自分自身にプロパティを「リセット」する方法をどのように認識しp#victim
ますshow
か? (言い換えると、セレクターを使用してルールセットに が存在しなかったdisplay
場合、値が何であるべきかをどのように見つけることができますか。) 答えは簡単です: できません。(ちょっと考えてみてください。ルールセットにセレクターが存在しない場合、別のルールセットが の値を変更したらどうなるでしょうか? (つまり、常に を設定する必要があるなどと仮定することはできません。他のルールセットは変更されている可能性があります。その値です。) を削除することはできません。display: none
p#victim
display
display: none
p#victim
p
block
display
スタイルシートのルールセットからプロパティを削除します。要素とルールセットの間の接続全体を削除することはできません。これは、他のプロパティなどが含まれている可能性があるためです(可能であっても、私見では明らかではありません)これを行うルールセットを見つけます)。もちろん、これを続けることもできますが、この問題に対する既知の解決策はありません。)
では、なぜインラインの代替が機能するのでしょうか? まず、 がどのようshow
に実装されているかを見てみましょう。
show: function(element) {
element = $(element);
element.style.display = ''; // <-- the important line
return element;
}
この関数が行う唯一の重要なことは、から「削除」element.style.display
する空の文字列 ( ) に設定することです。すごい!しかし、それはどういう意味ですか?なぜそれを削除したいのですか?! まず、値を変更するときに実際に何を表し、変更するのかを見つけなければなりません。''
display
style
element.style
MDC のドキュメントには、次のようにelement.style
記載されています。
style
要素の属性を表すオブジェクトを返します。
最後の単語attribute に注意してください。element.style
≠ 要素の現在の「計算された」スタイルです。これは、style
属性内のプロパティの単なるリストです (より長い/より良い説明については、MDC を参照してください)。
次のドキュメントを検討してください。
<!doctype html>
<script src="prototype.js"></script>
<script>
document.observe("dom:loaded", function() {
$("victim").show();
});
</script>
<p id="victim" style="display:none;">Hello world!
style="display:none;"
非表示p#victim
になりますが、DOM が読み込みを終了すると Prototype はそれを に変更し、ブラウザーはプロパティの値 (この場合はブラウザーの既定のスタイル シートのstyle=""
値) を再計算します。display
ただし、次のドキュメントを検討してください。
<!doctype html>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$("#victim").show();
});
</script>
<style>
p#victim {display:none;}
</style>
<p id="victim">Hello world!
とにかく、jQuery はスタイル シートを正しく処理します。これは、プロトタイプ ソリューションほど簡単に説明することはできません。また、今読んでおくべき層がたくさんあります。また、jQuery が の正しい値を計算できない場合も数多くありますdisplay
。(最後のメモ: Firebug ...、しかし、Firefox 専用のものか何かを使用していると思います。)