2012-02-07 3 views
11

Я пытаюсь удалить все во всем теле, за исключением одного элемента и его детей. Как я могу это сделать?jQuery - выберите все, кроме отдельных элементов и его детей?

Edit 1 Рассмотрим следующую разметку:

<html> 
    <body> 
     <div id="div1"></div> 
     <div id="div2"> 
     <div id="elementNotToRemove"></div> 
     </div> 
     <div id="div3"></div> 
     <div id="div4"></div> 
    </body> 
</html> 

В приведенном выше примере, я хочу, чтобы удалить div1, div3 и div4, а также их детей, но сохранить div2, потому что он содержит элемент не удалять.

ответ

19
$("body > *").not("body > #elementtokeep").remove(); 

Вы можете заменить не() часть с тем, что вы хотите сохранить

+0

Но что, если глубина элементов глубже, чем прямые дети тела? –

+0

Удаление элемента также удалит всех детей –

+0

Да, но это не то, что я имею в виду. Я немного уточнил в оригинальном вопросе. –

4

Вы можете сделать это следующим образом:

$('body > *:not(#dondelete)').remove(); 

Где ваш элемент имеет id="dondelete" и является потомком тела ,

1

Попробуйте

$('body > *:not(#123)').remove() 

http://api.jquery.com/not-selector/

+0

Кто их поддерживает? Это выберет только элемент 'body'. – kapa

+0

@bazmegakapa проверено и исправлено –

+1

Теперь это то же самое, что и другие (уже правильные) решения, опубликованные ранее, поэтому было бы справедливо удалить ваши. Однако я удалил нисходящее направление. – kapa

3

Это старый вопрос, но принятый ответ неверен. В этой ситуации это не работает (см. http://jsfiddle.net/LVb3V/) и, конечно, не как общее решение.

Лучше использовать:

$('body *').not('#div2, #div2 *').remove()​;

Это удалит все элементы в организме div2 кроме и все элементы, содержащиеся в нем.

+1

Спасибо! Это должно быть приемлемым решением. Большая разница здесь - jquery ».а не «вместо использования не в селекторе». –

0

Я думаю, что

$("body *").not("body #div2") 
      .not("body #div2 #elementtokeep") 
      .not("body #div2 #elementtokeep *") 
      .remove(); 

это самый простой способ, чтобы сфокусировать его.

http://jsfiddle.net/6vb2va6g/

0

Этот код работает для меня.

$('body > * :not(#123)').remove() 

Необходимо указать расстояние между * и:. Раньше, когда пытались использовать код с

$('body > *:not(#123)').remove() это не сработало. Мне нужно было дать пробел между символами * и:.

Счастливое кодирование.

Смежные вопросы