0

我想不通。我已经做了一些搜索,我发现我认为会起作用,但事实并非如此。

我有这样的结构。

当你点击一个数字时,锚点就会被移除。当您随后单击另一个数字时,我想知道哪个 li 中没有锚点,或者它的文本没有被锚点包裹。不管测试如何,我总是能得到 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 里就通过了测试,因为那是里面没有“a”的“this”。

4

2 回答 2

2

首先jQuery(':not(:has(a))',this),它总是一个真值,它可能是空的,但在布尔上下文中它仍然是真值。所以形式if($(x))的测试并不是非常有用。

你也把事情复杂化了。如果你想要<li>s 不包含任何<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/

于 2013-03-24T03:32:27.353 回答
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 回答