好的,这就是我所拥有的:
<div id="mydiv">
<font color="green"><font size="3"><font face="helvetica">hello world</font></font></font>
</div>
我知道标签很奇怪,但这就是网站产生的标签。 所以基本上我想将字体标签更改为bbcdoe标签,我写的jquery代码:
$("#mydiv").find("font").text(function(){
var text = $(this).text();
var size = $(this).attr("size");
var color = $(this).attr("color");
var face = $(this).attr("face");;
if(size!=undefined){
return '[size="'+size+'"]'+text+'[/size]';
}
if(color!=undefined){
return '[color="'+color+'"]'+text+'[/color]';
}
if(face!=undefined){
return '[type="'+face+'"]'+text+'[/type]';
}
});
所以我得到的只是:[color =“green”]你好世界[/ color]。始终只有第一个标签。任何想法?
ps:我尝试了每个,replaceWith,html(),都是一样的结果。只有第一个标签才会改变。
答案 0 :(得分:1)
一个充满悲伤,悲伤的小猫的房间希望你摆脱那些<font>
标签,但你可以通过明确地向下穿过嵌套标签来使它工作。
它完成了现在的工作,因为.text()
的外部调用会针对第一个<font>
标记运行,并且会删除其他标记。
编辑 - 澄清,当您致电
时$('#mydiv').find('font')
jQuery会找到3个字体标签。因此,库将为每个元素调用您传递给.text()
的函数。但是,第一次调用将具有从DOM中删除其他两个<font>
元素的效果。即使库继续为这些元素调用你的回调,也没有效果,因为它们不再在页面上了。
以下是可行的:
var $fonts = $('#mydiv').find('font');
var text = $fonts.text();
var attrs = {};
$fonts.each(function(_, font) {
var names = ["size", "color", "face"];
for (var i = 0; i < names.length; ++i)
if (font[names[i]]) attrs[names[i]] = font[names[i]];
});
var newText = "";
for (var name in attrs) {
if (attrs.hasOwnProperty(name))
newText += '[' + name + '=' + attrs[name] + ']';
}
newText += text;
for (var name in attrs) {
if (attrs.hasOwnProperty(name))
newText += '[/' + name + ']';
}
$('#mydiv').text(newText);
请注意,我不确定你为什么要把BBCode放到这样的页面上,但这似乎就是这个意图。
答案 1 :(得分:1)
它不起作用的原因是因为你打电话时
$("#mydiv").find("font").text("New text")
对于每个字体标记,从第一个标记开始,它将替换该标记内的文本。
以下是一个示例,向您展示正在发生的事情。
Example |代码
$fonts = $("font","#mydiv");
console.log($fonts.text());
$fonts.text(function(){
return "New text";
});
console.log($fonts.text());
这是一个如何改为的示例
Example |代码
jQuery.fn.reverse = [].reverse;
var attributes= ["size", "color", "face"];
var text = $.trim($("#mydiv").text());
$("font","#mydiv").reverse().each(function(i, e) {
for (var i = 0; i < attributes.length; ++i){
var attr = $(e).attr(attributes[i]);
if( typeof attr != "undefined")
text = "["+attributes[i]+"="+attr+"]"+text+"[/"+attributes[i]+"]";
}
});
$("#mydiv").text(text);
答案 2 :(得分:0)
在我看来,你的第一行应该是:
$("#mydiv").find("font").each(function(){