替换<a> tag which contains an <i></i></a>中的文字

时间:2013-06-29 07:42:43

标签: javascript jquery

我有一个锚标记,其中包含嵌套图标和一些文本。当我尝试更新文本时,图标将被删除。这是一个例子:

jsfiddle

其中包含:

HTML

<a class="btn btn-danger" id="bin"><i class="icon-trash"></i> Remove Selected (0)</a>

JS

$(function(){
    var selectCount = 0;
    $("#bin").click(function(){
        selectCount++;
        $(this).text(" Remove Selected ("+selectCount+")");
    });
});

我尝试用$(this).children(":text")替换选择器,但无济于事。任何帮助将不胜感激。

干杯

7 个答案:

答案 0 :(得分:3)

要更改第一个文本节点的值,您可以执行以下操作:

$(function(){
    var selectCount = 0;
    $("#bin").click(function(){
        selectCount++;
        for(var i = 0; i < this.childNodes.length; i++) {
            var childNode = this.childNodes[i];
            if(childNode.nodeType === 3) {
                childNode.textContent = " Remove Selected ("+selectCount+")";
                return;
            }
        }
    });
});

nodeType === 3表示文本节点 - 更多详细信息:https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType

http://jsfiddle.net/Dogbert/FZWyj/13/

答案 1 :(得分:2)

如果您可以更改HTML,则可以将数字放在自己的span元素中:

<a class="btn btn-danger" id="bin">
    <i class="icon-trash"></i> Remove Selected (<span class="counter">0</span>)
</a>

然后您可以选择该元素并更改其内容:

$(this).children('.counter').text(selectCount);

但是,如果您无法更改HTML:

  

我尝试用$(this).children(":text")替换选择器,但无济于事。

您无法使用选择器选择文本节点。但是,您可以使用.contents来获取所有子节点,而不仅仅是元素节点。然后,您可以.filter要更改的节点的节点:

$("#bin").click(function(){
   selectCount++;
   $(this).contents().filter(function() {
       return this.nodeType === 3 && this.nodeValue.indexOf("Remove Selected") > -1;
   }).get(0).nodeValue = " Remove Selected ("+selectCount+")";
});

由于a元素也可能包含其他文本节点(HTML代码中的每个换行符和缩进都将转换为DOM文本节点),因此可能需要检查文本节点的内容。

答案 2 :(得分:1)

嗯,那是因为您替换了a标记的全部内容。尝试这样的事情:

$(function(){
    var selectCount = 0;
    $("#bin").click(function(){
        selectCount++;
        $(this).html('<i class="icon-trash"></i> Remove Selected ('+selectCount+')');
    });
});

小提琴:http://jsfiddle.net/FZWyj/18/

答案 3 :(得分:1)

文本方法也删除整个<i class=icon-trash></i>。使用html并应用图标类

$(function(){
    var selectCount = 0;
    $("#bin").click(function(){
      selectCount++;
      $(this).html("<i class=icon-trash></i> Remove Selected ("+selectCount+")");
    });
});

WORKING FIDDLE

答案 4 :(得分:1)

您可以尝试更新字符串中的数字,如下所示:

$(function(){
  var selectCount = 0;
  $("#bin").click(function(){
    selectCount++;
    $(this).html($(this).html().replace(/\d+/, selectCount));
  });
});

jsFiddle here

答案 5 :(得分:1)

或者,使用css3,您可以将span元素与data attribute:

一起使用

的CSS:

span[data-iterator]:before {
    content: attr(data-iterator);
}

HTML:

 <a class="btn btn-danger" id="bin">
  <i class="icon-trash"></i> 
    Remove Selected (<span data-iterator="0"></span>)
 </a>

点击处理程序:

 $("#bin").click(function(){
   $(this).find('[data-iterator]').attr('data-iterator',++selectCount);
 });

答案 6 :(得分:0)

我对jQuery了解不多,但是当我理解正确时,您想要更新文本而不删除旧文本吗?

在纯JavaScript中,我会这样做:

link = document.getElementById("link");
link.innerHTML = link.innerHTML + " new text";