Как выбрать элементы, которые не имеют определенного дочернего элемента с помощью JQuery

есть ли селектор JQuery для выбора всех элементов, которые делают не есть определенный дочерний элемент как прямой ребенок? Например:

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

Я хочу выбрать только <p>как первый (без <div> ребенок). возможно ли это?

дополнительная информация: на самом деле я пытаюсь вставить тег <div> во все эти <p> которые не имеют одного выражения, подобного этому:

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

но это добавило бы дополнительные <div> второй <p>.

5 ответов


вы можете попробовать:

$("p:not(:has(>div))")

вы можете комбинировать :has()[docs] селектор с not функции[docs] чтобы добиться этого:

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

кроме того, вы можете использовать один селектор с помощью :not()[docs] селектор:

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

вы можете использовать либо взаимозаменяемо, но IIRC, первый быстрее.

посмотреть его в действии на jsFiddle.

отметим, что div является элементом уровня блока и p нет. Это означает, что недопустимый HTML-код имеет div вложен в тег p.


структурные элементы внутри текстовых элементов выглядят очень нечистыми для меня, но если вы настаиваете;)

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

вот демо:http://jsfiddle.net/NTpES/3/


попробуйте это:

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

Это, кажется, работает: $('p:not("p div")')