2016-10-08 13 views
1

クラスが設定されているテーブルの見出しを選択しようとしました。言い換えれば、クラス.redを持つ要素を探し、h3要素の上にある要素を探し始めます。クラスのあるテーブルの上の最も近いH3

$('.xred').closest('table').addClass('test').prev('h3').addClass('test');
.test { background-color: green; } 
 
.xred { background-color: red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h3>Goal</h3> 
 
<table> 
 
    <tr> 
 
    <td>Blabla</td> 
 
    <td class="xred">Red</td> 
 
    </tr> 
 
</table>

限り、私はテーブルとH3の間には何も入れないで、正常に動作します。

他の要素が間にある場合でも、どのように動作するのでしょうか?

$('.xred').closest('table').addClass('test').prev('h3').addClass('test');
.test { background-color: green; } 
 
.xred { background-color: red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h3>Goal</h3> 
 
<div>The Problem DIV</div> 
 
<table> 
 
    <tr> 
 
    <td>Blabla</td> 
 
    <td class="xred">Red</td> 
 
    </tr> 
 
</table>

どうもありがとう!

+1

あなたの質問の完全な内容はリンクされていない**あなたの質問に**ある必要があります。リンクが腐って、将来の質問やその回答が役に立たなくなり、人々はあなたを助けるためにオフサイトに行く必要はありません。スタックスニペット( '<>'ツールバーボタン)を使用して理想的に[mcve] **を実行可能にします。 More:[*どのように良い質問をしますか?](/ help/how-to-ask) –

+0

このディスカッションを終了するには、1つの答えを記入してください。 – Mohammad

答えて

1

.prevAll()に一致する前の要素を選択する必要があります。 .prev()一致するパラメータがある場合、前の要素を選択します。

$('.xred').closest('table').addClass('test').prevAll('h3').addClass('test');
.test { background-color: green } 
 
.xred { background-color: red }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h3>Goal</h3> 
 
<div>The Problem DIV</div> 
 
<table> 
 
    <tr> 
 
    <td>Blabla</td> 
 
    <td class="xred">Red</td> 
 
    </tr> 
 
</table>

+0

ありがとう、その解決策の問題は、コードの上にあるすべてのH3が選択されていることです。しかし、私はテーブルの後に最初に欲しいだけです。そのための解決法はありますか? – user1658080

+0

@ user1658080はい、 ':first'セレクタを使います。ありがとうございます!https://jsfiddle.net/wp8e6yxz/ – Mohammad

+0

H3が1つしかないテーブルが1つしかない場合、それは素晴らしいことです。しかし、私はどのようにコードを変更することができます、これは同じ問題で複数のテーブルのために働くのですか? https://jsfiddle.net/wp8e6yxz/1/ – user1658080

2

は、私はあなたがとても非効率的な何かをしたい理由はまったくわかりません。 htmlに直接アクセスできませんか?

これを行うと、このような操作が簡単になる可能性があります。

HTML:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div class="wrapperdiv> 
    <h3>Goal</h3> 
    <div>The Problem DIV</div> 
    <table> 
    <tr> 
     <td>Blabla</td> 
     <td class="xred">Red</td> 
    </tr> 
    </table> 
</div> 

スクリプト:

$('.xred').closest('table').parent().find("h3").addClass("test"); 

は、ラッパーを持つことは、ええ、それはすべてが容易になりますか?

また、私は個人的には、それほど多くのDOM検索を行うために必要なものは一切構築しません。それはひどく非効率的です。

var $wrapperDiv = $('.wrapperDiv'); 

$('h3', $wrapperDiv).addClass("test"); 

しかし、それは私だけです...

が、なぜ:私はあなたがそうのような変数に格納することができますラッパーのdivとの良好なHTML構造をお勧めしますか?

まあ、prevAllclosestのような関数を使用すると、DOM全体をトラバースしています。かなりのCPU使用量と、携帯電話のような低速のデバイスではしばしば応答が遅くなることがあります。また、電池の消耗も早くなります。

さらに、関数の上に関数を積み重ねると、どのデバイスでも応答が遅くなることがわかります。

ベストプラクティスは、変数内に静的ラッパーを一度格納することです。そのため、DOMを常にトラバースする必要はありません。次に、できるだけ小さなセレクタを使用して、必要なものを取得します。すべての選択関数がDOMをもう一度トラバースします。それは単なるCPUの集中です。

+0

ありがとうございました - これは私が普通にやる方法ですが、ここでの問題はコードを編集できないことです。スクリプトによって提供されており、後でうまく実装されているように、改善がどのように見えるかを示したいだけです。 – user1658080

+0

Hmmm、h3とテーブルの両方にANYラッパーはありませんか? 特定のh3を正確に選択する理由を教えてください。どのような行動を選択したいのか分かっていれば、さらに助けになるかもしれません。 – NoobishPro

関連する問題