2016-06-28 32 views
1

我想检查一个TD是否包含某个字符串,但前提是该字符串不在SPAN内。TD:包含字符串但不在一个范围内元素

比方说,我要检查所有TD为“宝”:

<td> TREASURE <span>Water</span> </td> -> YES 
<td> Water <span>TREASURE</span> </td> -> NO 
<td> TREASURE </td> -> YES 
<td> <div>TREASURE</div> <span>Water</span> </td> -> YES 

到目前为止,我已经尝试不同的事情,从搜索中排除跨度元素,但我没有成功。

$('table tr td:Contains("TREASURE")').not('span').each(function() { 
    $(this).addClass('found'); 
}); 

非常感谢! :)

编辑:

另外下面的情况也应努力:

<td> TREASURE <span>TREASURE</span> </td> -> YES 

回答

2

您可以:has()伪使用:not()伪类选择器(或not()法)类选择器。

$('table tr td:contains(TREASURE):not(:has(span:contains(TREASURE)))').addClass('found'); 
 

 
// or 
 

 
$('table tr td:contains(TREASURE)').not(':has(span:contains(TREASURE))').addClass('found');
.found { 
 
    color: red 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<table> 
 
    <tr> 
 
    <td>TREASURE <span>Water</span> 
 
    </td> 
 
    <td>Water <span>TREASURE</span> 
 
    </td> 
 
    <td>TREASURE</td> 
 
    <td> 
 
     <div>TREASURE</div> <span>Water</span> 
 
    </td> 
 
    </tr> 
 
</table>

UPDATE: 如果文本包含在这两个地方,然后用 filter()方法。实际做的是克隆 td,并在应用 :contains选择器后从克隆对象中删除跨度元素。

$('table tr td').filter(function() { 
 
    return $(this) 
 
    .clone() // clone the element 
 
    .find('span') // get all span inside cloned element 
 
    .remove() // remove the spans 
 
    .end() // back to cloned element 
 
    .is(':contains(TREASURE)'); // check the cloned element contains text 
 
}).addClass('found');
.found { 
 
    color: red 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<table> 
 
    <tr> 
 
    <td>TREASURE <span>Water</span> 
 
    </td> 
 
    <td>Water <span>TREASURE</span> 
 
    </td> 
 
    <td>TREASURE</td> 
 
    <td> 
 
     <div>TREASURE</div> <span>Water</span> 
 
    </td> 
 
    <td> 
 
     <td>TREASURE <span>TREASURE</span> 
 
     </td> 
 
    </tr> 
 
</table>

+0

感谢 - 这是非常有用的,但有一个例外,它不工作: '​​TREASURE TREASURE' - 因此,当有两个宝物,一个元素中和一个“空白”,它也应该触发。什么方式来做到这一点?非常感谢! – user1658080

+0

@ user1658080:已更新 –

+0

非常感谢 - 真的很棒!刚学过滤器:) – user1658080

相关问题