jquery 过滤有 +不是

发布于 2024-09-30 00:34:43 字数 704 浏览 2 评论 0原文

好的,我有列表项,有些有跨度,有些没有。
在我的活动中,当他们还没有跨度时,我想添加跨度。

has() 工作正常,但 not() 将跨度添加到两者?

HTML:

<ul>
    <li>
        <p>item</p>
        <span class="spn">empty span</span>
    </li>
    <li>
        <p>item 2</p>
    </li>
<ul>
<hr>
<a class="add-span"href="#">check</a>

JS:

$("a.add-span").click(function() {
    $("li").each(function(index) {
        // $(this).has("span").find("span").append(" - appended");
        $(this).not("span").append('<span class="spn">new span<\/span>');
    })    
})

Okay I have list items, some have a span, some not.
On my event I want to add the span when they don't have any yet.

has() works fine, but not() adds the span to both??

HTML:

<ul>
    <li>
        <p>item</p>
        <span class="spn">empty span</span>
    </li>
    <li>
        <p>item 2</p>
    </li>
<ul>
<hr>
<a class="add-span"href="#">check</a>

JS:

$("a.add-span").click(function() {
    $("li").each(function(index) {
        // $(this).has("span").find("span").append(" - appended");
        $(this).not("span").append('<span class="spn">new span<\/span>');
    })    
})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

天暗了我发光 2024-10-07 00:34:44

您可以结合使用 :not:has 像这样的选择器

$("a.add-span").click(function() {
    $("li:not(:has(span))").each(function(index) {
        $(this).append('<span class="spn">new span<\/span>');
    });
});

这是一个 演示 http://www.jsfiddle.net/xU6fV/

You can use a combination of the :not and :has selectors like this

$("a.add-span").click(function() {
    $("li:not(:has(span))").each(function(index) {
        $(this).append('<span class="spn">new span<\/span>');
    });
});

Here is a demo http://www.jsfiddle.net/xU6fV/

拔了角的鹿 2024-10-07 00:34:44
$("a.add-span").click(function() {
    $("li").each(function(index) {
       if ($(this).children('span').length === 0){
         $(this).append('<span class="spn">new span<\/span>');
       }
    })    
})

对于 children() 方法,length 属性用于检查 span 是否已存在,如果不存在,则为添加/附加。

更多信息:

$("a.add-span").click(function() {
    $("li").each(function(index) {
       if ($(this).children('span').length === 0){
         $(this).append('<span class="spn">new span<\/span>');
       }
    })    
})

With children() method, the length property is used to check whether or not a span already exits and if it doesn't, one is added/appended.

More Info:

×眷恋的温暖 2024-10-07 00:34:44

如果您不想仅过滤掉那些将 span 作为直接子元素的元素,则接受的答案效果很好。

由于 :has().has() 循环遍历所有后代,而不仅仅是子代。

在这种情况下,你必须使用一个函数

$("li").not(function() {
    // returns true for those elements with at least one span as child element
    return $(this).children('span').length > 0 
}).each(function() { /* ... */ })

The accepted answer works well, if you don't want to filter out only those elements which do have the spans as direct children.

As the :has() and the .has() loop over all descendants, not just the children.

In that case, you have to use a function

$("li").not(function() {
    // returns true for those elements with at least one span as child element
    return $(this).children('span').length > 0 
}).each(function() { /* ... */ })
三五鸿雁 2024-10-07 00:34:44

这是搜索“jquery not has”时 Google 上的第一个链接。我需要解决的具体场景与此略有不同。我必须 not 具有特定 DOM 元素的项目,而不仅仅是基于标签。这意味着我无法使用上面每个解决方案使用的选择器。

然而,jQuery 的 has() 确实接受 DOM 元素!所以我创建了一个 jQuery 插件来组合这两个内置函数。

我想在这里分享它,因为希望它也能帮助其他处于我这种情况的人。这也回答了原来的问题。

插件:

(function ( $ ) {
    $.fn.extend({
        not_has: function (param) {
            return this.not(this.has(param));
        }
    });
}( jQuery ));

实现:

$("a.add-span").click(function() {
    $("li").not_has("span")
    .append('<span class="spn">new span<\/span>');

    // Prevent the page from navigating away
    return false;
});

https://jsfiddle.net/brjkg10n/1/


我最初打算找到一个像 addBack() 但使用的 jQuery 函数不是。如果您需要如此复杂的东西,请随意使用以下插件。

(function ( $ ) {
    $.fn.extend({
        notBack: function () {
            return this.prevObject.not(this);
        }
    });
}( jQuery ));

有了这个,答案将是:

$("li").has("span").notBack()
.append('<span class="spn">new span<\/span>');

https://jsfiddle.net/2g08gjj8/1/

This is the first link on Google when searching "jquery not has". The specific scenario I needed to solve was a little different to this one. I had to not items that have a specific DOM element, not simply based on a tag. This meant I couldn't use a selector which each solution above used.

jQuery's has() however does accept a DOM element! So I created a jQuery plugin to combine these two inbuilt functions.

I wanted to share it here because hopefully it will help others in my situation too. It also answers the original question.

The Plugin:

(function ( $ ) {
    $.fn.extend({
        not_has: function (param) {
            return this.not(this.has(param));
        }
    });
}( jQuery ));

Implementation:

$("a.add-span").click(function() {
    $("li").not_has("span")
    .append('<span class="spn">new span<\/span>');

    // Prevent the page from navigating away
    return false;
});

https://jsfiddle.net/brjkg10n/1/


I was initially intending to find a jQuery function that would work like addBack() but using not instead. If you need something so complicated, then please feel free to use the following plugin.

(function ( $ ) {
    $.fn.extend({
        notBack: function () {
            return this.prevObject.not(this);
        }
    });
}( jQuery ));

With this, the answer would be:

$("li").has("span").notBack()
.append('<span class="spn">new span<\/span>');

https://jsfiddle.net/2g08gjj8/1/

吻安 2024-10-07 00:34:44

试试这个,

$("a.add-span").click(function() {
    $("li:not(:has(span))").each(function(index) {
        $(this).append($("<span class='spn'>").html("Newly Added Span"));
    });
});

Try this,

$("a.add-span").click(function() {
    $("li:not(:has(span))").each(function(index) {
        $(this).append($("<span class='spn'>").html("Newly Added Span"));
    });
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文