0

私はこれを理解することはできません。私はいくつかの検索を行い、見つけたものは機能すると思いますが、機能しません。

私はこのような構造を持っています。

数字をクリックすると、アンカーが削除されます。その後別の数字をクリックしたときに、どの数字にアンカーがないか、またはアンカーによってラップされていないテキストを知りたいです。テストに関係なく、私は常にliの全範囲を取得します..テストに合格することはありません。

次のケースでは、要素からの LI のコレクションを繰り返しています。

var page = jQuery('#thiselement');

       jQuery.each(page.find('li'),function(){
         if(jQuery(':not(:has(a))',this)){
            // also tried jQuery(this), no luck
            // no matter what, it ALWAYS falls in this conditional 
            // if the LI has a link or not, it gets in here
         }
        }



    <ul id="thiselement">
       <li><a href="#">1</a></li>
       <li><a href="#">2</a></li>
       <li><a href="#">3</a></li>
       <li><a href="#">4</a></li>
       <li><a href="#">5</a></li>
    </ul>

テストに合格したものは何でもアンカータグでラップする必要があります。したがって、テストが条件付きで実行されると、次のようになります。

<ul id="thiselement">
 <li><a href="#">1</a></li>
 <li><a href="#">2</a></li>
 <li><a href="#">3</a></li>
 <li>4</li>
 <li><a href="#">5</a></li>

次に... 4 番目の li はテストに合格します。これは、"a" を含まない "this" であるためです。

4

2 に答える 2

2

アンカーのないリストアイテムを見つけるだけの場合は、これを試してください。

<script type="text/javascript">
    $(document).ready(function(e) {
        var page = $("#thiselement")
        page.find("li:not(:has(a))").wrap('<a href="#">');
    });
</script>
<ul id="thiselement">
 <li><a href="#">1</a></li>
 <li><a href="#">2</a></li>
 <li><a href="#">3</a></li>
 <li>4</li>
 <li><a href="#">5</a></li>
</ul>

それ以外の場合、さらに何かを行う必要がある場合は、これを試してください。

<script type="text/javascript">
    $(document).ready(function(e) {
        var page = $("#thiselement")
        page.find("li:not(:has(a))").each(function(){
            $(this).wrap('<a href="#">'); 
        });
    });
</script>
<ul id="thiselement">
 <li><a href="#">1</a></li>
 <li><a href="#">2</a></li>
 <li><a href="#">3</a></li>
 <li>4</li>
 <li><a href="#">5</a></li>
</ul>
于 2013-03-24T04:10:07.913 に答える
2

まず第一に、jQuery(':not(:has(a))',this)常に真の値になります。空の場合もありますが、ブール値のコンテキストでは依然として真になります。したがって、フォームのテストif($(x))はそれほど有用ではありません。

また、物事を少し複雑にしすぎています。<li>を含まないsが必要な場合<a>は、次のような簡単なテストを実行できます。

if($(this).find('a').length == 0)
    // You want this one...

小さなサブツリーを一度に1つずつ操作することを期待している場合は<a>、最適な短絡セレクターを見つけて複雑にする必要はありません。必要なものが簡単にそこにあるかどうかを確認して、移動してください。もっと面白いことに移りましょう。

したがって、このようなものでうまくいくはずです:

page.find('li').each(function() {
    if(jQuery(this).find('a').length == 0) {
        // Do interesting things here...
    }
});

あなたが必要としないことに注意してください、あなたはあなたに与えるものをjQuery.each(page.find(...), ...ただ呼び出すことができます。eachfind

filterそれほど労力をかけずに、それを呼び出しとして書き直すこともできます。

簡単なデモ: http: //jsfiddle.net/ambiguous/wvn6A/

于 2013-03-24T03:32:27.353 に答える