使用jQueryreplace一个标签与另一个
目标:
使用jQuery,我试图取代所有的事件:
<code> ... </code>
有:
<pre> ... </pre>
我的解决scheme
我得到了以下,
$('code').replaceWith( "<pre>" + $('code').html() + "</pre>" );
我的解决scheme的问题:
但问题在于它将(第二,第三,第四等)“代码”标签与第一个 “代码”标签之间的内容全部replace掉。
例如
<code> A </code> <code> B </code> <code> C </code>
变
<pre> A </pre> <pre> A </pre> <pre> A </pre>
我认为我需要使用“这个”和某种function,但是我恐怕还在学习,并不知道如何拼凑解决scheme。
您可以将一个函数传递给.replaceWith
[docs] :
$('code').replaceWith(function(){ return $("<pre />", {html: $(this).html()}); });
在函数内部, this
指的是当前处理的code
元素。
DEMO
更新: 没有什么大的性能差异 ,但是如果code
元素有其他的HTML子元素,追加孩子而不是序列化他们感觉更正确:
$('code').replaceWith(function(){ return $("<pre />").append($(this).contents()); });
这更好:
$('code').contents().unwrap().wrap('<pre/>');
尽pipeFelix Kling的解决scheme的 速度大约快了一倍 :
你总是会得到第一个code
的内容是正确的,因为$('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>" ); });
这个怎么样?
$('code').each(function () { $(this).replaceWith( "<pre>" + $(this).html() + "</pre>" ); });
build立在费利克斯的答案。
$('code').replaceWith(function() { var replacement = $('<pre>').html($(this).html()); for (var i = 0; i < this.attributes.length; i++) { replacement.attr(this.attributes[i].name, this.attributes[i].value); } return replacement; });
这将重现replacepre
标签中code
标签的属性。
编辑:这将取代那些在其他code
标签的innerHTML
内的code
标签。
function replace(thisWith, that) { $(thisWith).replaceWith(function() { var replacement = $('<' + that + '>').html($(this).html()); for (var i = 0; i < this.attributes.length; i++) { replacement.attr(this.attributes[i].name, this.attributes[i].value); } return replacement; }); if ($(thisWith).length>0) { replace(thisWith, that); } } replace('code','pre');
从jQuery 1.4.2开始:
$('code').replaceWith(function(i,html) { return $('<pre />').html(html); });
然后你可以select新的元素:
$('pre').css('color','red');
来源: http : //api.jquery.com/replaceWith/#comment-45493689
jsFiddle: http : //jsfiddle.net/k2swf/16/
如果你使用的是香草JavaScript,你会:
- 创build新的元素
- 将旧元素的子元素移动到新元素中
- 在旧的之前插入新的元素
- 删除旧的元素
这里是jQuery相当于这个过程:
$("code").each(function () { $("<pre></pre>").append(this.childNodes).insertBefore(this); $(this).remove(); });
这里是jsperfurl:
http://jsperf.com/substituting-one-tag-for-another-with-jquery/7
PS:所有使用.html()
或.innerHTML
解决scheme都具有破坏性 。
$('code').each(function(){ $(this).replaceWith( "<pre>" + $(this).html() + "</pre>" ); });
最好和干净的方式。
你可以使用jQuery的html函数。 下面是一个例子,用一个pre标签代替一个代码标签,同时保留代码的所有属性。
$('code').each(function() { var temp=$(this).html(); temp=temp.replace("code","pre"); $(this).html(temp); });
这可以处理任何需要交换的html元素标记,同时保留前一个标记的所有属性。
制作jquery
插件,也保持属性。
$.fn.renameTag = function(replaceWithTag){ this.each(function(){ var outerHtml = this.outerHTML; var tagName = $(this).prop("tagName"); var regexStart = new RegExp("^<"+tagName,"i"); var regexEnd = new RegExp("</"+tagName+">$","i") outerHtml = outerHtml.replace(regexStart,"<"+replaceWithTag) outerHtml = outerHtml.replace(regexEnd,"</"+replaceWithTag+">"); $(this).replaceWith(outerHtml); }); return this; }
用法:
$('code').renameTag('pre')
这里给出的所有答案都假设(如问题示例所示)标记中没有任何属性。 如果接受的答案是这样运行的:
<code class='cls'>A</code>
如果将被replace
<pre>A</pre>
如果你想保留这些属性,那么replace一个标签意味着什么? 这是解决scheme:
$("code").each( function(){ var content = $( "<pre>" ); $.each( this.attributes, function(){ content.attr( this.name, this.value ); } ); $( this ).replaceWith( content ); } );