LI不包含链接测试

时间:2013-03-24 03:10:17

标签: jquery

我无法弄清楚这一点。我做了一些搜索,我发现了什么,我认为会有用,但事实并非如此。

我有这样的结构。

当您点击某个数字时,该锚点将被删除。当你随后点击另一个数字时,我想知道哪个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>

然后......第四个li将通过测试,因为那是“this”,其中没有“a”。

2 个答案:

答案 0 :(得分:2)

首先,jQuery(':not(:has(a))',this)将始终为真值,它可能为空但在布尔上下文中仍然为真。因此,if($(x))形式的测试并不十分有用。

你也有点过于复杂。如果您希望<li>不包含任何<a> s,那么您可以像这样进行简单的测试:

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

如果您希望一次使用小子树,最多一个<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/

答案 1 :(得分: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>