匹配没有标签的DOM文本
Match DOM text without tags?
我需要匹配字符串中的文本,使用JavaScript或jQuery,在任何DOM级别,这不是HTML标记的一部分。因此,例如,我需要在下面的文章中匹配单词 foo
5次:
Foo <p class="foobar" id='foo'>foobar foo<a href="/foo">foo</a> foo.</p>
我需要保持全文完整,并带有标签,以供以后使用。这是使用find/replace将每个结果包装在<span />
标签中,当它不正确地匹配部分标签和链接时,当前的工作失败。
.html()
方法似乎很明显,但这意味着我必须避开那些讨厌的标签。必要的正则表达式变得太复杂了,我无法处理。(我也知道HTML上的正则表达式有一些风险;我愿意接受另一种方法
例如,我尝试使用jQuery的.text()
方法,它可以让我操纵文本,因为我想使用查找/替换,但它似乎不可能更新页面源,因为你正在处理DOM的文本节点:它不会让我插入那些<span>
标签到源。
否则,我就难倒了。谢谢!
使用.text()方法来访问文本,所以:(必须转义单引号)
$('<div>Foo <p class="foobar" id=''foo''>foobar foo<a href="/foo">foo</a> foo.</p></div>').text()
返回:"Foo foobar foofoo Foo。"
从那里开始做你想做的。
目标选择器包含一个特定的字符串,使用jQuery的contains
选择器。然后可以使用each
函数遍历所有这些元素。
$('*:contains("foo")').each(function() {
$(this).html("<span class='bold'>" + $(this).text() + "</span>");
});
应该注意的是,contains
选择器是区分大小写的!我们需要修改jQuery方法以允许找到Foo
。将这段代码添加到jQuery文件中。
jQuery.expr[':'].contains = function(a, i, m) {
return jQuery(a).text().toUpperCase()
.indexOf(m[3].toUpperCase()) >= 0;
};
另一个解决方案是使用jQuery的filter
函数,像这样
var selection = $("*").filter(function() {
return /FOO/i.test($(this).text());
});
这可能是一个更好的做法,因为您不必修改原始的jQuery代码。test
方法接受一个正则表达式,并根据字符串是否包含该表达式返回Boolean
。/i
标志使regex不区分大小写。它将匹配以下
- Foo
- foo
- FOO
- fOo
相关文章:
- 转换<a>使用jQuery将文本字符串转换为dom元素
- 可以't通过DOM更改javascript中的段落文本
- 向使用jQuery加载DOM后添加的字段添加不受限制的文本输入DatePickers
- 文本内容长度在 DOM 操作后不会更改
- Ajax请求文本在DOM中闪烁
- 遍历DOM和替换文本的最佳方法
- 未将字符串文本附加到DOM
- 使用DOM javascript包含文本和图片的按钮
- 如何判断文本输入字段dom节点是否*没有*带有javascript的选择
- 以文本形式检索对象元素中的SVG Dom
- 在DOM中保存添加到文本框的文本
- Chrome扩展程序获取DOM文本并在弹出窗口中显示.html然后单击按钮
- 从 dom 文本中删除美元符号 - 而不是从 js 代码中删除
- D3.js - DOM 文本退出不正确
- 我想用github注册表替换DOM文本节点
- 更改DOM文本节点的内容
- 当dom文本发生更改时,更新knockoutjs-viewmodel
- 匹配没有标签的DOM文本
- 我需要使用Javascript选择Javascript DOM文本节点的解决方案
- 使用 JQuery 从变量中删除 DOM 文本