10

JavaScript では、膨大な数の要素に CSS ルールを適用するために<style>、要素を動的に作成してセクションに追加できます。<head>

  1. このアプローチの利点と欠点は何ですか?

  2. 要素に対するJavaScriptの反復と比較して、実際にパフォーマンスが向上する場合。舞台裏 (ブラウザの内部) は何ですか?

  3. 速いのと遅いのはどっち?要素に対するJavascriptの反復またはブラウザで動的にcssを追加しますか?

  4. 処理時間はどうですか?処理負荷?

このアプローチを使用した問題をよりよく理解するには、次の例を参照してください。

例:次の html のように、20 列以上 1000 行以上のテーブルがある場合:

<table border="1" class='no-filter'>
    <thead>
        <tr>
            <th data-title='id'>Id</th>
            <th data-title='name'>Name</th>
            <th data-title='family_name'>Family Name</th>
            <th data-title='ssn'>SSN</th>
            //Other table data
        </tr>
    </thead>
    <tbody>
        <tr data-id='1' data-name='nick' data-famil_name='jackson' data-ssn='123456'>
            <td class="column column1">1</td>
            <td class="column column2">Nick</td>
            <td class="column column3">Jackson</td>
            <td class="column column4">123456</td>
            //Other table data
        </tr>
        //Other rows
        <tr data-id='809' data-name='helga' data-famil_name='jhonson' data-ssn='125648'>
            <td class="column column1">809</td>
            <td class="column column2">Helga</td>
            <td class="column column3">Jhonson</td>
            <td class="column column4">125648</td>
            //Other table data
        </tr>
        //Other rows
        <tr data-id='1001' data-name='nick' data-famil_name='jhonson' data-ssn='216458'>
            <td class="column column1">1001</td>
            <td class="column column2">Nick</td>
            <td class="column column3">Jhonson</td>
            <td class="column column4">216458</td>
            //Other table data
        </tr>
        //Other rows
    </tbody>
</table>

誰かが jsFiddle の例を必要とする場合は、後で作成できます。

ケース 1: SSN データを含むテーブル列のみを動的に非表示にしたい場合。これを行うには、いくつかのアプローチを適用できます。このアプローチは、大きく 2 つのカテゴリに分けることができます。最初のカテゴリのソリューションでは 、td要素を繰り返し処理して、列のスタイルを動的に変更できます。2番目のアプローチでは、1 つを動的に作成して CSS を適用するか、ここ@Frits van Campenが指定した定義済みの CSS ルールを使用します。(注: @Frits van Campenは、特定のケースに適したソリューションです。ただし、テーブル行の表示と非表示の操作についてさらに詳しく説明したいと思います。)

次のように動的 CSS ルールを作成できます。

td:nth-child(3)
{
  display:none;
}

または、定義済みの CSS ルールを適用します。

table.no-filter td.column3
{
   display:block;
}
table.filter3 td.column3 
{ 
   display: none; 
}

jsFiddly の例を次に示します。

  1. 反復
  2. CSS オンフライ

ここで見つけた console.time メソッドを使用した時間比較を次に示します。 ここに画像の説明を入力

左は動的 CSS で、右は反復アプローチです。

おそらく、スタイル要素の追加と要素の反復を計算するため、適切なものではありません。動的 CSS の要素に対するすべての反復は、ブラウザーの内部によって行われます。ただし、スクリプトの応答時間が動的 css の方が速いと考える場合。: 反復アプローチは、jQuery と比較して、純粋な JavaScript で高速になります。しかし、どれだけ速く結果がありません。だからあなたはあなたの答えでもっとできる。

ケース 2:<tr>ここで、 'Nick' という名前のユーザーを含むテーブル行を強調表示したいと思います。ここで、表の行に name、family_name、id などのデータ属性があることに注意してください。したがって、ここでも、javascript やその他のライブラリ ツールを使用して要素を反復処理したり、何らかの動的ルールを適用したりできます (それが可能かどうかはわかりません)。または、ケース 1 のように定義済みのフィルターを適用しないでください。)

CSS ルール:

tr[data-name ~='nick']
{
    background-color:red;
}

この場合、CSS ルールを動的に適用することで、多くの楽しいフィルタリングを行うことができます。

更新: ここに示す例は、問題の簡単な概要です。また、一部の最適化された反復は、javascript で同等に高速に実行できます。ただし、要素を選択するためのトラバースが難しい可能性がある比較的ネストされた ul 要素にディッパーの子要素がないテーブルのみを検討します。

重要:ここでは、質問を編集してこの部分を削除してください。また、質問の範囲内で回答を明確に記載してください。ここで私は「実装がうまくいったかどうか」について尋ねているのではありません。スタイル要素を動的に作成することの利点と欠点は、ブラウザの内部メカニズムに関してどのようなものかを尋ねています。

PS と例:なぜこのアイデアを思いついたのですか? 最近、「非常に長いhtmlテーブルで列を非表示にする方法」の質問に答えました。この質問では、OP は長いテーブルの特定のテーブル列に CSS ルールを適用することについて尋ねます。その場でルールを使用してスタイル要素を作成することをお勧めします。これは正常に機能します。これは、ブラウザの内部メカニズムによってスタイルが適用され、要素を繰り返し処理して各項目にスタイルを適用するよりもパフォーマンスが向上するためだと思います。

4

3 に答える 3

4

いくつかのスコーピングの問題 (ページ上により多くのテーブルが存在する可能性があります...) を除けば、このアプローチには本質的に問題はありません。style要素は DOM 内にあり、必要に応じて編集できます。ブラウザーはそれを尊重することで標準に従っています。 . あなたのテストケースでは、実際には非常に面倒なサポートがあるため、実際には有効な他のアプローチはありません.Bugzillaにはこの件に関する78の重複したバグがあり、Mozillaは1998年の最初の関連バグレポートcolgroup以来、それを適切に実装することを拒否しています.

高速な理由は単純にオーバーヘッドの 1 つです。完全な DOM がアセンブルされると、Javascript インタープリターがすべての行とセルをループするよりもはるかに高速にネイティブ C++ で比較的マイナーなスタイルシートを適用できます。これは、歴史的に CSS ルールが逆に適用され、ブラウザーが辞書を内部に保持して、すべてのtd要素をすばやく検索できるようにするためです。ネイティブ C++ は常に、より複雑なインタープリター ベースのコードよりも優れています。

将来的には、スコープの問題はスコープ付きのスタイル(現在は FF のみで、典型的なもの) で解決することもできます。次のようにコーディングします。

<table>
  <style id="myTableStyle" scoped>
    td:nth-child(1) { display:none }
  </style>
  <tbody>
     ...
  </tbody>
</table>

この属性は、含まれているスタイルを、含まれている要素(この場合は )、およびもちろん含まれているすべての要素scopedに対してのみ有効にします。また、ID でアクセスできるため、コンテンツの置換/再構築が容易です。table

styleこれはあなたのアプローチよりも望ましいですが、この要素を作成するためのユニバーサルブラウザサポートがない限り、これheadが最善の回避策です。

于 2014-01-08T01:51:54.107 に答える
4

CSS を動的に生成するのは良くありません。やらないでください。

動的 CSS を生成することで機能するソリューションは、動的 CSS を必要としないソリューションに変換できます。

例が必要な場合は、私の回答を参照してください: jQuery to update actual CSS


リンクしたケースについて直接返信するには:

これは私には非常に奇妙なユースケースのように思えます。1000 行のテーブルを含むページは、すでに不適切な開始位置です。画面に 1000 行を合理的に収めることはできず、有用な対話を期待することはできません。CSS はここでは問題ではありません。テーブルが小さければ、パフォーマンスの問題はなくなります。

on OPが示唆する以外のアプローチがある可能性があります。クラスを各セルに (動的に) 追加する必要はありません。次のように、クラスを生成時に配置できます。

<table class="no-filter">
...
  <td class="filter1 filter2"></td>
...
</table>

次に、次のようなものがあります。

table.filter1 td.filter2 { display: none; }
table.filter2 td.filter1 { display: none; }

テーブルのクラスを変更して、どのフィルターが適用されるかを示すだけです。

CSS は単なるハンマーではなく、非常に洗練された非常に強力なツールの完全なツール セットです。必ず正しいものを使用してください。


静的 CSS を使用する利点は自明です。

  • 理解、テスト、デバッグ、保守がはるかに簡単です。
  • CSS は実際には CSS にあります (JavaScript ではありません)。
  • テンプレートを作成したり、視覚的な回帰テストを追加したりできます。

また、いくつかのパフォーマンス上の懸念もあります。ブラウザー ベンダーが AGAINST 動的 CSS を最適化しているのがわかります。これは、動的 CSS のパフォーマンスを低下させる静的 CSS の最適化がある場合、このトレードオフを行う可能性があることを意味します。

于 2014-01-08T02:22:01.317 に答える