Jak wybrać elementy, które nie mają określonego elementu potomnego za pomocą JQuery

Czy istnieje selektor JQuery, który zaznacza wszystkie elementy, które nie mają określony element potomny jako bezpośredni element potomny? Na przykład:

<p>
    text in paragraph
</p>
<p>
    <div>text in div</div>
</p>

Chcę wybrać tylko <p> takie jak pierwsze (Bez <div> dziecka). Czy to możliwe?

Dalsze informacje: właściwie staram się wstawić <div> do tych wszystkich <p>, które nie mają takiego wyrażenia:

$('p').wrapInner('<div />')

Ale to dodałoby dodatkowe <div> do drugiego <p>.

Author: Stephan, 2011-08-31

5 answers

Możesz spróbować:

$("p:not(:has(>div))")
 112
Author: jmans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 14:43:44

Możesz połączyć :has()[docs] selektor z not function [docs] aby to osiągnąć:

$("p").not(":has(div)").wrapInner("<div/>");

Alternatywnie można użyć pojedynczego selektora za pomocą :not()[docs] selektor:

$("p:not(:has(div))").wrapInner("<div/>");

Możesz używać obu zamiennie, ale IIRC, pierwszy jest szybszy.

Zobacz go w akcji na jsFiddle .

Zauważ, że div jest elementem blokowym, a p nie jest. Oznacza to, że nie jest valid HTML to have a div zagnieżdżone w p.

 11
Author: Peter Olson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 14:48:55

Elementy strukturalne wewnątrz elementów tekstowych wyglądają dla mnie bardzo nieczyste, ale jeśli nalegasz;)

$('p').not(":has(div)").wrapInner("<div/>");

Oto demo: http://jsfiddle.net/NTpES/3/

 0
Author: meo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 14:42:53

Spróbuj tego:

$("p").filter("not(:has(div))").wrapInner("<div/>");
 0
Author: ShankarSangoli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 20:37:53

To chyba działa: $('p:not("p div")')

 -1
Author: Blazemonger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 14:40:55