关于javascript:从字符串中间删除一个字符:不删除内部元素

Remove a character from the middle of a string: without removing inner element

这件事使我很为难。我想从label元素中删除"+"。这是HTML:

1
2
3
 <label class="option" for="edit-attributes-21-33">
 <input type="radio" id="edit-attributes-21-33" name="attributes[21]"
 value="33" checked="checked" class="form-radio"> 4 oz, +$15.00</label>

我从这个开始

1
2
3
4
5
$(".option").each(function(index, value) {

$(this).text( $(this).text().replace("+",""));

})

这会删除"+",但也会删除输入元素。所以我试着:

1
2
3
4
5
6
7
8
$(".option").each(function(index, value) {

var oldString = $(this).html();
var newString = oldString.replace("+","");
console.log(oldString, newString);
$(this).text(newString);

})

这就构成了一个正确的HTML标记字符串,但它是一个字符串,并以这种方式传递回DOM。我看到另一篇文章也有同样的问题,但没有解决方案。


您可以通过使用.html()而不是.text()来实现您想要的代码:

1
2
3
4
5
6
$(".option").each(function(index, value) {
    var oldString = $(this).html();
    var newString = oldString.replace("+","");
    console.log(oldString, newString);
    $(this).html(newString);
});

这里是jquery .html()方法参考:https://api.jquery.com/html/

这是小提琴:https://jsfiddle.net/darkseal/1c572luww/

我还稍微修改了您的结束标记,使其符合xhtml。


你要找的是一个textnode。我给了你的标签一个ID,让它更简单,但是其他选择器的原则是一样的:

1
2
var node = document.getElementById("example").childNodes[2];
node.nodeValue = node.nodeValue.replace("+","");

用一个简单的演示。您应该尽可能多地使用纯JS来支持jquery。普通JS通常比jQuery快得多。

在注释之后,如果您不知道textNode的确切位置,请检查这个。


回答迟了,只是为了展示使用jQuery的不同方法。

在这里,您将保持input状态,并且不会有替换您不想替换的字符的风险。假设您在其他地方使用了+,而不仅仅是在label文本上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$(function () {
    $('label.option').each(function () {
        var label = $(this);
        var input = $('input.form-radio', this);
        var text = label.text();

        // Clean up the label contents.
        label.empty();        

        // Replace the char occurrences.
        text = text.replace(/\+/g,"");

        // Append both the input and the modified text.
        label.append(input).append(text);        
    });
});

演示