2016-06-17 2 views
2

Мне нужно выбрать встроенные HTML-элементы, которые являются единственными элементами внутри их родительского элемента, то есть нет текста или других встроенных элементов до или после них.Выберите встроенные элементы без текстовых сообщений

<p><img src="foo.jpg"></p><!-- This should be selected --> 
<p>Hello world! <img src="bar.jpg"></p><!-- This should not --> 

Любой способ сделать это с помощью CSS или jQuery? Я пробовал :first-child и :first-of-type, но они соответствуют обоим этим элементам.

+3

Конечно, не с CSS. –

+0

Сохранение в качестве целевой точки? 'p' tags ?? –

+0

Пропущенные узлы узлов? –

ответ

3

.children() будет выбранными вами детьми. Вы могли бы потенциально добавить их в массив, если вы хотите использовать их для последующего использования или просто распечатать их с помощью console.log()

$('p').each(function() { 
    if ($(this).text().length === 0) { 
     $(this).children(); 
    } 
}); 

Как было отмечено, если <a> присутствовал с текстом внутри него (то есть <a href="www.google.com">Google</a> тогда кода выше не работает Если вы находитесь в этой следующей ситуации, где это дети его собственный текст, используйте val() в состоянии вместо:.

$('p').each(function() { 
    if ($(this).val().length === 0) { 
     $(this).children(); 
    } 
}); 
+1

Также используйте 'trim()' или '$ .trim()', чтобы избежать пробелов –

+0

Это работает как прелесть после того, как я добавил '.trim()', чтобы удалить любые пробелы из текстового содержимого. Спасибо! – Kaivosukeltaja

+1

Есть еще одно условие.«Ребенок» должен быть только одним. У него не должно быть братьев и сестер –

-1

вы можете использовать :first для получения первого р тег из многообразны:

$("p:first) 
0

Для достижения этой цели вы можете проверить длину contents() элемента:

var $p = $('p').filter(function() { 
    return $(this).contents().length == 1; 
}); 

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

0

Вы можете сделать это с помощью небольшой комбинации CSS и JavaScript (jQuery здесь для краткости).

var children = $(":only-child").filter(function() { 
    return !this.previousSibling && !this.nextSibling; 
}); 

Селектор :only-child начинает поиск с элементами, которые не имеют ни одного элемента братьев. Тогда previous/nextSibling вернет текстовый узел, если он есть, или null, если нет. Если обе стороны равны null, то нет ни одного текстового узла, так что элемент действительно один.

1

Нужно было бы проверить, нет ли дочернего узла и его nodeType. Метод jQuery contents() получит все дочерние узлы, включая текст и комментарии.

Ниже приведен пример сценария, который будет отмечать единичные узлы, а также пункты, которые содержат одиночные узлы:

var notAcceptableNodeTypes = [3, 4, 8]; 
 
$('p').filter(function() { 
 
    var nodes = $(this).contents(); 
 
    var isSingle = nodes.length==1 && $.inArray(nodes[0].nodeType, notAcceptableNodeTypes) == -1; 
 
    if(isSingle) nodes.addClass('is-single'); 
 
    return isSingle; 
 
}).addClass('no-text');
.no-text { 
 
    border: 2px solid red; 
 
} 
 
.is-single { 
 
    border: 2px solid green; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p><img src="http://placehold.it/75x75"></p> 
 
<p>Hello world! <img src="http://placehold.it/75x75"></p> 
 
<p><img src="http://placehold.it/75x75"><img src="http://placehold.it/75x75"></p> 
 
<p>Hello world!</p> 
 
<p><!-- COMMENT --><img src="http://placehold.it/75x75"></p>

Также на Playground.