【问题标题】:Remove a character from the middle of a string: without removing inner element从字符串中间移除一个字符:不移除内部元素
【发布时间】:2015-06-21 22:34:02
【问题描述】:

这个让我难过。我想从label 元素中删除“+”。这是 HTML:

 <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>

我从这个开始

$(".option").each(function(index, value) {

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

})

这会删除“+”,但也会删除输入元素。于是我尝试了:

$(".option").each(function(index, value) {

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

})

这会生成一个正确的 html 标记字符串,但它是一个字符串,并且会以这种方式传递回 DOM。我看到另一个帖子有同样的问题,但没有解决方案。

【问题讨论】:

  • 相关但不完全重复:stackoverflow.com/questions/4106809/…
  • 我不确定输入元素被剥离是什么意思?举例说明它最初是什么,在当前代码之后变成什么,以及您希望它做什么。例如:原文:Abc + 123 + 456 应该是 Abc 123 + 456 但此代码返回 Abc 123 456

标签: javascript jquery html string


【解决方案1】:

您要查找的内容称为 textNode。我为您的标签提供了一个 ID 以使其更容易,但其他选择器的原则保持不变:

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

With a simple demo.
您应该尽可能多地使用纯 JS,以支持 jQuery。 Plain JS 通常比 jQuery 快很多。

评论后,if you don't know the exact position of the textnode, check this

【讨论】:

  • 如果他不知道textNode的确切位置怎么办?
  • 仅使用 Vanilla Javascript 的出色解决方案。
  • 您需要点击“确切位置”链接并找出找到所需内容的方法;)
  • 操作文本节点绝对是最干净的方法。您可能希望遍历它们以找到正确的。我试图找到一个很好的重复问题,但没有找到一个完整的答案,所以我将保留这个问题。
  • @Martijn 谢谢你,我今天遇到了类似的问题,字符串中的文本过多(感谢 ubercart!),我使用了你的解决方案。针对手头的情况进行了修改jsfiddle.net/3px7480v/3
【解决方案2】:

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

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

$(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);        
    });
});

Demo

【讨论】:

  • 您实际上可以完全删除detach。将文本设置为空的下一行就足够了。
【解决方案3】:

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

$(".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/1c572Luw/

我还稍微修改了您的 &lt;input&gt; 结束标记,使其符合 XHTML。

【讨论】:

  • 这看起来与问题中的第二个代码块完全相同。你有什么改变?
  • .replace("+", "") 只会替换 "+" 的第一个实例;如果要删除“+”的所有实例,请添加全局标志;例如.replace(/\+/g, ' ')
  • 说明您所做的更改以及更改原因会很有帮助。此外,最后没有斜线的输入在 html5 中完全有效。我相信只有 xhtml 需要斜杠。
  • 我只回答了 OP 问题。无论如何,如果您需要替换所有匹配项,您可以使用 .replace(/\+/g, "")。
  • 我不太确定你做了什么来使输入标签“符合 HTML5”,它是一个 void 元素
猜你喜欢
  • 2020-05-05
  • 2023-04-10
  • 2019-06-26
  • 1970-01-01
  • 2011-06-11
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多