使用 jQuery 将一个标签替换为另一个

IT技术 javascript jquery replace
2021-01-20 22:47:21

目标:

使用 jQuery,我试图替换所有出现的:

<code> ... </code>

和:

<pre> ... </pre>

我的解决方案:

我得到了以下内容,

$('code').replaceWith( "<pre>" + $('code').html() + "</pre>" );

我的解决方案的问题:

但问题是它正在用第一个“代码”标签之间的内容替换(第二、第三、第四等)“代码”标签之间的所有内容

例如

<code> A </code>
<code> B </code>
<code> C </code>

变成

<pre> A </pre>
<pre> A </pre>
<pre> A </pre>

我想我需要使用“这个”和某种功能,但恐怕我仍在学习,并不真正了解如何将解决方案拼凑在一起。

6个回答

您可以将函数传递给.replaceWith [docs]

$('code').replaceWith(function(){
    return $("<pre />", {html: $(this).html()});
});

在函数内部,this指的是当前处理的code元素。

演示

更新:没有什么大的性能差异,但万一code元素具有其他HTML孩子,追加的孩子而序列化他们感觉是更正确的:

$('code').replaceWith(function(){
    return $("<pre />").append($(this).contents());
});
@jon:但是再次检查 Jens 的解决方案,他修复了它。
2021-03-17 22:47:21
@FelixKling 这不会覆盖代码标签的属性吗?
2021-03-29 22:47:21
@jon:这是创建新元素的简写。更多信息可以在这里找到:api.jquery.com/jQuery/#jQuery2jQuery 循环遍历所有元素并为每个元素执行函数(与.each正在执行的操作相同)。
2021-04-05 22:47:21
这似乎是最优雅的解决方案,但我承认我不明白 replaceWith 函数内部发生了什么。很想听听更多。即如何分配开始和结束标签?<pre /> 中的空间能做到吗?
2021-04-08 22:47:21
+1 是一个不错的技巧 - 这不仅仅可以用于简单的标签替换。
2021-04-08 22:47:21

这更好:

$('code').contents().unwrap().wrap('<pre/>');

虽然不可否认,Felix Kling 的解决方案大约快两倍

这是一个不会破坏页面的 jsperf 版本:jsperf.com/substituting-one-tag-for-another-with-jquery/2,您会看到速度差异不再那么大了。您的解决方案较慢,因为您对每个元素执行两次 DOM 操作:unwrap删除父项并将子项添加到树中,wrap再次分离它们并添加新的父项。
2021-03-18 22:47:21
FWIW,$('code').children()将为上面的示例返回一个空的 jQuery 对象,因为code元素没有子元素节点。虽然它有子元素时有效。
2021-03-20 22:47:21
Fixed - true,当内容由单个文本节点组成时,children()将不起作用。使用contents()代替效果很好。jsfiddle.net/7Yne9
2021-03-20 22:47:21
啊哈。是的,你们是对的。它对我也不起作用。谢谢你抓住那个!
2021-03-31 22:47:21
像魅力一样工作,在我看来,这似乎是最有效的解决方案。:)
2021-04-01 22:47:21

您将始终获得 firstcode的内容是正确的,因为$('code').html()无论您在何处使用它都将始终引用第一个元素。

相反,您可以使用.each迭代所有元素并单独更改每个元素:

$('code').each(function() {
    $(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );
    // this function is executed for all 'code' elements, and
    // 'this' refers to one element from the set of all 'code'
    // elements each time it is called.
});

试试这个:

$('code').each(function(){

    $(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );

});

http://jsfiddle.net/mTGhV/

哇。你们在 2 秒内提出了完全相同的解决方案。有微小的格式差异。我不确定要投票给哪一个 - 我真的不喜欢 thomas 的答案中 function 和 () 之间的空格,而 kokos 答案中的 2 行空白区域非常重要 + () 之间应该有一个空格和 {
2021-04-07 22:47:21

这个怎么样?

$('code').each(function () {
    $(this).replaceWith( "<pre>" + $(this).html() + "</pre>" );
});