替换元素中字符串的所有位置
Replace all the ocurrance of a string in an element
我想替换给定元素的所有子元素(的文本)中的特定字符串。
不能使用innerHTML
,因为此序列可以出现在属性中。我已经尝试过使用XPath,但是这个接口基本上是只读的。因为这仅限于一个元素,所以像document.getElementsByTagName
这样的函数也不能使用。
有什么建议可以做这件事吗?任何jQuery或纯DOM方法都是可以接受的。
编辑:
一些答案表明了我试图解决的问题:直接修改元素上的文本将导致所有非文本子节点被删除。
因此,问题本质上归结为如何有效地选择树中的所有Text节点。在XPath中,您可以很容易地将其作为//text()
,但当前的XPath接口似乎不允许您更改这些Text节点。
一种方法是递归,如Bergi的回答所示。另一种方法是使用jQuery的find('*')
选择器,但这有点贵。仍在等待是否有更好的解决方案。
只需使用一个简单的自制DOM迭代器,它可以递归地遍历所有节点:
(function iterate_node(node) {
if (node.nodeType === 3) { // Node.TEXT_NODE
var text = node.data.replace(/any regular expression/g, "any replacement");
if (text != node.data) // there's a Safari bug
node.data = text;
} else if (node.nodeType === 1) { // Node.ELEMENT_NODE
for (var i = 0; i < node.childNodes.length; i++) {
iterate_node(node.childNodes[i]); // run recursive on DOM
}
}
})(content); // any dom node
解决方案可能是浏览所有可用节点(包括TextNodes),并对结果应用regexp模式。为了获取TextNodes,您需要调用jQuerys .contents()
。例如:
var search = "foo",
replaceWith = 'bar',
pattern = new RegExp( search, 'g' );
function searchReplace( root ) {
$( root ).contents().each(function _repl( _, node ) {
if( node.nodeType === 3 )
node.nodeValue = node.nodeValue.replace( pattern, replaceWith );
else searchReplace( node );
});
}
$('#apply').on('click', function() {
searchReplace( document.getElementById('rootNode') );
});
示例:http://jsfiddle.net/h8Rxu/3/
参考:.contents()
使用jQuery:
$('#parent').children().each(function () {
var that = $(this);
that.text(that.text().replace('test', 'foo'));
});
如果您希望搜索所有子项而不是仅搜索直系子项,请改用.find()
。
http://jsfiddle.net/ExwDx/
编辑:用于子项、每个、文本和查找的文档。
对不起,我自己刚刚拿到:
$('#id').find('*').each(function(){
$.each(this.childNodes, function() {
if (this.nodeType === 3) {
this.data = this.data.toUpperCase();
}
})
})
我曾经在这里使用UpperCase()来使结果更加明显,但任何String操作在那里都是有效的。
- 根据另一个数组对数组进行排序,包括位置和字符串[ES6]
- Javascript中的正则表达式,用于只有数字的字符串,并且不应在除数字以外的任何位置包含任何字符
- 当用户单击按钮(在光标位置)时,在输入字段中添加一个文本字符串
- 在从索引位置返回的字符串中查找空白
- 为什么我在 webpack 中需要 html 文件时会得到一个位置字符串
- 如何在JavaScript中根据字符的位置提取子字符串
- 在光标位置的文本区域中插入一个字符串,并进行一些更改
- 通过位置栏更改查询字符串,AJAX加载的菜单不会't在没有硬刷新的情况下重新填充
- 如何在字符串中的特定位置插入变量
- javaScript更改字符串char's的位置
- 替换元素中字符串的所有位置
- javascript/谷歌地图:将位置对象转换为字符串
- 存储字母表中每个字母在所需位置的字符串中出现的次数
- 如何将字符串(包含位置)转换为数组
- 匹配字符串中任意位置的 3 个字符的正则表达式
- 将谷歌地图居中到位置字符串
- 使用 jQuery 从字符串中获取倒数第二个字符的位置
- FF 13,IE 9:JSON 字符串化/地理位置对象
- 字符串中的多边形位置
- Javascript dom连接背景位置字符串/自动更新背景图像