16

我无法从字符串中删除空格。首先,我将div转换为text();以删除标签(有效),然后我尝试删除&nbsp字符串的“”部分,但它不起作用。任何想法我做错了什么。

newStr = $('#myDiv').text();
newStr = newStr.replace(/ /g, '');

$('#myText').val(newStr);


<html>
  <div id = "myDiv"><p>remove&nbsp;space</p></div>
  <input type = "text" id = "myText" />
</html>
4

2 回答 2

23

当您使用该text函数时,您得到的不是 HTML,而是文本:&nbsp;实体已更改为空格。

所以只需替换空格:

var str = " a     b   ", // bunch of NBSPs 
    newStr = str.replace(/\s/g,'');
    
console.log(newStr)

如果您只想替换来自的空格,&nbsp;请在转换为文本之前进行替换:

newStr = $($('#myDiv').html().replace(/&nbsp;/g,'')).text();
于 2013-10-23T18:27:15.323 回答
21

.text()/textContent不包含 HTML 实体(例如&nbsp;),这些实体以文字字符形式返回。这是一个使用不间断空格Unicode 转义序列的正则表达式:

var newStr = $('#myDiv').text().replace(/\u00A0/g, '');
$('#myText').val(newStr);

演示

也可以在正则表达式中使用文字不间断空格字符而不是转义序列,但是我发现在这种情况下转义序列更清晰。不过,没有什么是评论解决不了的。

也可以使用.html()/innerHTML来检索包含 HTML 实体的 HTML,如@Dystroy 的回答。


以下是我的原始答案,我误解了 OP 的用例。我会把它留在这里,以防有人需要&nbsp;从 DOM 元素的文本内容中删除

[...] 但是,请注意,重新设置元素的.html()/innerHTML意味着丢弃所有侦听器和与之关联的数据。

所以这里有一个递归解决方案,它只改变文本节点的文本内容,不重新解析 HTML,也没有任何副作用。

function removeNbsp($el) {
  $el.contents().each(function() {
    if (this.nodeType === 3) {
      this.nodeValue = this.nodeValue.replace(/\u00A0/g, '');
    } else {
      removeNbsp( $(this) );
    }
  });
}
removeNbsp( $('#myDiv') );

演示

于 2013-10-23T18:38:43.427 回答