JQuery如果$(this)包含x并且不包含y

时间:2018-01-26 23:09:19

标签: javascript jquery

在每个循环中,如果当前元素包含img而不是其他任何东西,我需要添加一个类。这是我最新的不工作代码的迭代,虽然不对 - 但无论如何都可能给你这个想法。

$(".details").each(function(index){
 $(this).has("img").not(:contains("p, ul, ol, div, span")).addClass('screenshot-only');
});

显然,我试图排除this,如果它还包含任何p, ul, ol, div, span - 那么帮助我解决这个问题会很棒。

如果有办法选择if this has only img and nothing else at all,那会更好。

3 个答案:

答案 0 :(得分:3)

:contains("p, ul, ol, div, span")应该引用引号,因为Sizzle Engine会将其解析为字符串:

':contains(p, ul, ol, div, span)'

但如果read the jQuery docs https://api.jquery.com/has-selector/搜索TEXT而不是DOM节点

,则很可能不是您的主要问题:contains

请看一下 https://api.jquery.com/has/ https://api.jquery.com/only-child-selector/

快速将与 Github

结合使用
$(".details:has(img:only-child)").addClass("screenshot-only");

示例



$(".details:has(img:only-child)").addClass("screenshot-only");

.screenshot-only {background: gold;}

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="details">
  <img src="//placehold.it/40x40/0bf">
</div>

<div class="details">
  <img src="//placehold.it/40x40/0bf">
  <p>foo</p>
</div>

<div class="details">
  <img src="//placehold.it/40x40/0bf">
</div>
&#13;
&#13;
&#13;

或者您更愿意定位此类图片

&#13;
&#13;
$(".details:has(img:only-child)").find("img").addClass("screenshot-only");
&#13;
.screenshot-only {border: 5px solid gold;}
&#13;
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="details">
  <img src="//placehold.it/40x40/0bf">
</div>

<div class="details">
  <img src="//placehold.it/40x40/0bf">
  <p>foo</p>
</div>

<div class="details">
  <img src="//placehold.it/40x40/0bf">
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以执行以下操作:

$(".details").each(function(index){
    $(this).has("img:first-child:last-child").addClass('screenshot-only');
});

Working JSFiddle

修改:正如其他帖子所指出的,您也可以使用:only-child选择器代替:first-child:last-child。此外,如果您只想在Roko C. Buljan's answer显示的每个匹配元素中添加一个类,则可以简单地删除each

答案 2 :(得分:-1)

如果你没有使用简单的javascript附加到jQuery,这就是jQuery,你可以通过以下方式对它进行测试:

`if (this.contains("img")) {
return;   // doesn't do anything
} else {
$(this).addClass('screenshot-only');
}
` is much easier and is 5 lines using the DOM.
// then just