jQuery循环中为仅含img元素的目标添加类的实现问题
解决方案:选中仅包含img元素的.details容器
你的原代码问题主要出在错误使用了:contains()选择器——这个选择器是用来匹配包含指定文本内容的元素,完全不适合用来判断子元素类型;另外你的排除逻辑也没写对,没办法准确筛选出只含img的容器。
下面给你几种靠谱的实现方式,按需选择:
方法一:直接判断直接子元素(最简洁,适合明确无其他子元素的场景)
如果你的.details容器里只有直接子元素(没有嵌套结构,也没有多余的空白文本),可以直接检查它的直接子元素数量是否为1,且唯一的子元素是img:
$(".details").each(function() { const $directChildren = $(this).children(); if ($directChildren.length === 1 && $directChildren.is("img")) { $(this).addClass('screenshot-only'); } });
或者用更高效的.filter()写法,避免手动each循环:
$(".details").filter(function() { const $kids = $(this).children(); return $kids.length === 1 && $kids.is("img"); }).addClass('screenshot-only');
方法二:处理含空白文本节点的场景
如果你的容器里可能存在换行、空格这类空白文本节点(比如代码里的换行缩进),可以先过滤掉无意义的文本节点,再判断剩余的元素节点:
$(".details").filter(function() { // 筛选出非空白文本的节点 const $validNodes = $(this).contents().filter(function() { // 排除空文本节点 return this.nodeType !== Node.TEXT_NODE || $.trim(this.textContent) !== ""; }); // 判断剩余节点只有一个,且是img return $validNodes.length === 1 && $validNodes.is("img"); }).addClass('screenshot-only');
逻辑说明
.children():只获取当前元素的直接子元素(不包含文本节点,也不包含嵌套的子元素).contents():获取当前元素下的所有节点(包括文本节点、注释节点等).filter():用来批量筛选符合条件的元素,比手动each更高效
内容的提问来源于stack exchange,提问作者Adam Michael Wood
相关产品推荐
相关产品推荐

