我有这个结构:
<table id="thetable">
<tr>
<td>
<div>
<div>some text</div>
<div>
<div></div>
<div>(This text is good)</div>
<div>some text2</div>
<div>some text3</div>
</div>
</div>
</td>
<tr>
</tr>
<td>
<div>
<div>some text</div>
<div>
<div></div>
<div>(This text is good)</div>
<div>some text2</div>
<div>some text3</div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div>
<div>some text</div>
<div>
<div></div>
<div>(This text is good)</div>
<div>some text2</div>
<div>some text3</div>
</div>
</div>
</td>
</tr>
</table>
我想把文本放在div中,但只有带有这个词的文本:good。并替换。 所以我这样做:
$("#thetable div:contains('good')").each(function () {
try {
console.log($(this).text());
console.log("------------------------------");
} catch (ex) {
}
})
但是console.log告诉我,每个日志不仅包含具有良好文本的div的文本,还包括其他两个。 正在印刷:
(This text is good)some text2some text3
所以我想只使用带有文本的div,并将此文本替换为另一个文本。
谢谢!
基本上:我想得到div,其中我有“好”(或任何我想要的单词),并在此div中插入/替换文本。在所有文档中查找,或者特别是在文档的一部分中查找,例如:在表格中。
答案 0 :(得分:7)
因为你有一个包含那3个div的div
一种可能的解决方案是仅获取像
这样的结束元素$("#thetable div:contains('good'):not(:has(*))").each(function () {
})
演示:Fiddle
答案 1 :(得分:2)
此表达式选择所有“div”包含父项。你可以添加条件。
$("#thetable div:contains('good')").each(function () {
try {
if ($('div', this).length < 1) { // test child presence
console.log($(this).text());
console.log("------------------------------");
}
} catch (ex) {
}
})
答案 2 :(得分:1)
对我来说,Arun P Johny代码是最好的解决方案
所以我试着向你解释一些概念
Arun P Johny代码没有选择最后一个元素,而是选择没有子元素的项目。
他的代码非常优雅和高性能唯一的缺点是,如果你输入像这样的HTML,它就不起作用
<div>(This text is good)<div>(This text is good)</div></div>
因为在这种情况下代码只会选择最里面的元素
答案 3 :(得分:0)
尝试这样的事情。
$("#thetable div").each(function () {
try {
var val = $(this).text();
if ( val.indexOf('good') !== -1 )
{
console.log($(this).text());
console.log("------------------------------");
}
} catch (ex) {
}
})
答案 4 :(得分:0)
我相信,使用vanilla JS的方法更快(虽然不可否认,灵活性更低)。 我应该用JsPerf测试
这将为您列出的html结构提供3次点击:
var containers = document.querySelectorAll('#thetable div div div');
var i, n = containers.length;
for (i=0; i<n; i++)
{
if (containers[i].innerText.indexOf('good') !== -1)
{
console.log("found instance of 'good'");
containers[i].title = "Gotcha!";
}
}
答案 5 :(得分:0)
很简单,您可以使用jquery最近函数来获取最近的div。试试下面的代码
$("#thetable tr div div ").find("div:contains('good')").closest('div')
检查一下 jsfiddle
答案 6 :(得分:0)
我找到了一个解决方案,但似乎过于冗长
我在社区发布了一个问题(here),但到目前为止还没有人正确回答
但是我留下了我的代码,让你得到一个包含字符串和另一个包含字符串的div的元素(查看注释)
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<table id="thetable">
<tr>
<td>
<div>
<!--div that contains the string and a div with the string-->
<div>(This text is good)<div>(This text is good)</div></div>
<div>
<div></div>
<div>(This text is good)</div>
<div>some text1</div>
<div>some text2</div>
</div>
</div>
</td>
<tr>
</tr>
<td>
<div>
<div>some text</div>
<div>
<div></div>
<div>(This text is good)</div>
<div>some text1</div>
<div>some text2</div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div>
<div>some text</div>
<div>
<div></div>
<div>(This text is good)</div>
<div>some text1</div>
<div>some text2</div>
</div>
</div>
</td>
</tr>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var len =$('#thetable div').length
for(i=1;i<len;i++){
$('div:eq('+i+')').contents().addClass('passed').filter(function () {
return $(this).text()==='(This text is good)' && $.trim(this.nodeValue).length
}).replaceWith('FIND');
}
for(i=0;i<len;i++){
var classx=$('div:eq('+i+')').attr('class')
if(classx===undefined){
var ca=$('div:eq('+i+')').contents()[0].nodeValue
if (ca.indexOf('good') > 0) {
$('div:eq('+i+')').contents()[0].nodeValue='FIND'
}
}
}
})
</script>
</body>
</html>
我希望这个解决方案可以帮助你。