(jquery)将嵌套的相同html标记更改为其他bbcode标记

时间:2012-03-26 15:50:22

标签: javascript jquery html tags

好的,这就是我所拥有的:

<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(),都是一样的结果。只有第一个标签才会改变。

3 个答案:

答案 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(){