15

私は周りを見回しましたが、この質問がまだ尋ねられていません。

ページのメディア タイプ (画面、印刷、ハンドヘルドなど) を判断する Javascript の信頼できる方法は何ですか? への参照を見document.styleSheets[0].mediaたことがありますが、ブラウザのサポートの問題か、何かを理解していないため、これを使用できませんでした。

画面ビューではJavascriptによって何かを非表示にしたいが、印刷ビューでは非表示にしたくないので、私は尋ねています。Prototype を使用して要素のトグル スイッチを実行しているため、メディア依存のスタイルに依存することはできません。Prototype では、非表示 ( display: none) で非表示と宣言されている場合、要素を表示に切り替えることはできません。 -インライン CSS*。要素 ( ) にメディア固有のインライン スタイルを設定しようとしました<div style="@media print { foo: bar; } @media screen { blargh: bfargle; }">が、これはサポートされていません。

スタイルシートを循環して、印刷固有のリンクされたスタイルシートがアクティブかどうかを確認できることはわかっていますが、現在、さまざまなメディア固有のスタイル宣言が 1 つのリンクされたスタイルシートにすべて混在している状況にあります。だからダメ。ええ、スタイルシートをさまざまなメディア タイプに分割することはできますが、最初に、CSS とは完全に独立して、Javascript を使用して DOM からメディア タイプを確実に引き出すことができるかどうかを確認したいと思います。ああ、私は「印刷ビューの要素を非表示にし、Javascript で表示されるかどうかを確認する」というトリックを試しましたが、それは 'それらの要素が見えないという事実にもかかわらず。私がここで話していることの詳細を誰かが知りたい場合は、編集で詳しく説明できます.

*これは私が理解していないことであり、常にイライラしています。それについての洞察を提供できる人なら誰でも、私から大きな支持を得ます.

4

5 に答える 5

4

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: nonep#victimdisplaydisplay: nonep#victimpblockdisplayスタイルシートのルールセットからプロパティを削除します。要素とルールセットの間の接続全体を削除することはできません。これは、他のプロパティなどが含まれている可能性があるためです(可能であっても、私見では明らかではありません)これを行うルールセットを見つけます)。もちろん、これを続けることもできますが、この問題に対する既知の解決策はありません。)

では、なぜインラインの代替が機能するのでしょうか? まず、 がどのようshowに実装されているかを見てみましょう。

show: function(element) {
  element = $(element);
  element.style.display = ''; // <-- the important line
  return element;
}

この関数が行う唯一の重要なことは、から「削除」element.style.displayする空の文字列 ( ) に設定することです。すごい!しかし、それはどういう意味ですか?なぜそれを削除したいのですか?! まず、値を変更するときに実際に何を表し、変更するのかを見つけなければなりません。''displaystyleelement.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 専用のものか何かを使用していると思います。)

于 2009-01-31T01:21:44.287 に答える
1

編集:申し訳ありません(自己メモ:RTFQロブ、シーシュ!)。すばやくグーグルすると、これjqueryプラグインが使用されます。基本的には@mediaルールを使用していますが、私が知る限りインラインではないため、ブラウザのサポートは異なる場合がありますが、期待できる最善の方法だと思います:(

于 2009-01-30T10:56:04.907 に答える
1

これが機能するかどうかを確認してください...すべてのタイプに対してこれを実行し、ステートメントが null または同等のものを返すかどうかを確認してから、ルールを適用できると思います。

このサイトから: http://www.webdeveloper.com/forum/showthread.php?t=82453

いいえ:

if (document.styleSheets[0].media == 'screen'){...}

FF/NS:

document.getElementsByTagName ('LINK')[0].getAttribute ('media')

また

document.styleSheets[0].media.mediaText

そして、すべてのブラウザでそれをチェックするスクリプト(一部の新しいブラウザを除くので、注意してください:))

http://student.agh.edu.pl/~marcinw/cssmedia/

このスクリプトは、ブール値の true/false として if ステートメントで機能します。うまくいくことを願っています!

于 2009-01-30T19:05:35.340 に答える
0
document.getElementsByTagName('link').each(function( link )
{
  //do something with link.media
  //hide whatever you need to hide, etc
});
于 2009-01-30T02:02:55.623 に答える
0

上記のスクリプトをテストしました。現在、すべての新しいブラウザーで動作します。IE8ファイナル。

スクリプトは次の場所に移動しました: http://cssmedia.pemor.pl/ 必要に応じて自由に使用してください。

マルシン・ウィアゾウスキーについて

于 2009-04-01T10:43:17.730 に答える