2015-10-01 2 views
0

Возможно, это длинный снимок, но есть ли способ получить коллекцию элементов в JQuery или нет без определенного тега/класса/id, даже вложенных?Как получить все элементы, кроме div (например), включая вложенные?

Скажем, у меня есть этот кусок кода:

<div class="container1"> 
 
    Lorem ipsum dolor sit amet 
 
    <br><br> 
 
</div> 
 

 
<p>This is p 1 
 
    <div class="footer"> 
 
     tessssst 
 
     <p> 
 
      p test 
 
     </p> 
 
    </div> 
 
</p> 
 

 
<div class="container"> 
 
    tessst 
 
</div> 
 

 
<p>This is p 2 
 
    <div id="someID" class="container"> 
 
     tessssst 2 
 
    </div> 
 
</p>

Теперь я использую JQuery, как это, для того, чтобы найти все, но Div теги, в том числе потомков:

$('body').find(':not(div, div *)') 

В сборнике результатов я все еще получаю div внутри элементов p, и я не хочу этого. Есть ли способ достичь этого? Я знаю, что этот div является частью h1, и поскольку я просто хочу выбирать элементы, а не удалять или выполнять манипуляции с DOM, это может быть странно, чего нужно, но это то, что мне нужно.

Большая проблема - мне нужно получить все текстовые узлы, но исключить некоторые теги/классы/идентификаторы. Я делаю так, как предлагалось here, но это недостаточно.

Спасибо.

+1

Вы можете начать сочинительство хороший семантический код. Вы должны закрыть 'h1' после окончания строки и не добавлять все, что не является частью заголовка. –

+0

Это просто пример. Представьте, что div находится внутри элемента p. Здесь я изменил его на «p» только для вас :) – mrgoos

+0

Ну, я должен сказать, что положить его в h1 привело меня к этому недоразумению ... После переключения с h1 на p это работает! Размещение div в теге h бесполезно с селекторами, я думаю. Cheers. – mrgoos

ответ

0

Код, который вы предоставили, кажется, работает, но, возможно, вы могли бы попробовать это?

$('body').find("*").filter(":not(div)"); 
+0

Нет, уже пробовал. Тот же результат. – mrgoos

0

Существует функция JQuery not(), который удаляет соответствующие элементы из текущего набора.

Так все, что вам нужно сделать, это

var nonDivs = $('body').find('*').not('div'); 
+0

Нет, это то же самое. – mrgoos

0

Вы можете сделать это, сначала нужно выбрать все элементы, выбрав <div> с и их потомками, а также фильтровать «все» результаты с «дивой» результат использования .not() (красный стиль используется для обозначения согласованного набора):

var all = $('body').find('*'); 
 
var divAll = $('body').find('div, div *'); 
 

 
var nonDiv = all.not(divAll); 
 

 
nonDiv.css('color', 'red');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="container1"> 
 
    Lorem ipsum dolor sit amet 
 
    <br><br> 
 
</div> 
 

 
<p>This is p 1 
 
    <div class="footer"> 
 
     tessssst 
 
     <p> 
 
      p test 
 
     </p> 
 
    </div> 
 
</p> 
 

 
<div class="container"> 
 
    tessst 
 
</div> 
 

 
<p>This is p 2 
 
    <div id="someID" class="container"> 
 
     tessssst 2 
 
    </div> 
 
</p>

+0

Ничего себе, я действительно этого не понимаю. Я попробовал ваше решение - в нижней строке он работает. Но я не понимаю, почему. Если я пытаюсь использовать этот фрагмент кода в Chrome: 'var all = $ (' body '). Find (' * '); var divAll = $ ('body'). Find ('div, div *'); all.not (divAll); ' Я получаю коллекцию, но я все еще вижу div в коллекции, так же, как и со мной, и я думал, что это не сработает. Если, например, вы пытаетесь «.text()» в этой коллекции, вы все равно получите текст в div, что не хорошо. Мне не нужен текст в div. – mrgoos

+0

Но если я это делаю: '$ (' body '). Find (': not (div, div *) '). Contents(). Filter (function() {return this.nodeType == 3})' - то по какой-то причине он работает, я получаю только текст, который я хочу. Я понятия не имею, почему. У вас есть мысли? – mrgoos

+0

Что я имел в виду, это работает: $ ('body'). Find (': not (div, div *)'). Css ('color', 'red'); Но это принесет весь текст, включая те, которые находятся во вложенном div (ы): $ ('body'). Find (': not (div, div *)'). Text(); Я думаю, я открою для этого новый вопрос. – mrgoos

0

В функции фильтра проверьте, является ли это текстовым узлом, а также проверьте все его родители для имени класса, id, тега - независимо от того, какие фильтры вы хотите фильтровать.

var textnodes = $('body').find("*").contents() 
    .filter(function() { 
     return (this.nodeType === 3 && $(this).parents("div").length <= 0); 
    }) 
    .each(function() { 
     console.log($(this).text()); 
    }); 

Вот рабочий пример: https://jsfiddle.net/hracw15o/3/

+1

Спасибо, но по какой-то причине это тоже работает, до сих пор не понимаю, почему ... $ ('body'). Find (': not (div, div *)'). Contents(). Filter (function() {return this.nodeType == 3}); – mrgoos

+0

Ах да, что действительно работает. Find() дает вам все узлы, за исключением divs, contents() дает вам всех непосредственных дочерних узлов этих узлов, а filter() возвращает только текстовые узлы - вот почему он работает. –