2013-10-23 145 views
8

我无法从字符串中删除空格。首先,我将div转换为text();以删除标签(其工作原理),然后我试图删除字符串的“&nbsp”部分,但它不会工作。任何想法我做错了什么。谢谢。删除javascript中的非空格空格

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

'' 将不被理解为在你的JS文件中的HTML实体。 – ComFreek

+0

' '是一个HTML实体 - 在'.text()'的返回中它与白色空间相同。 –

+0

@FabrícioMatté我不这么认为。  将被转换为真正的[非破坏空间](http://en.wikipedia.org/wiki/Non-breaking_space)。 – ComFreek

回答

15

当您使用text功能,你没有得到HTML文本,但:在&nbsp;实体已被更改为空格。

所以只需更换空间:

newStr = newStr.replace(/\s/g,''); 

如果你想更换只能从&nbsp;未来的空间做替换之前转换为文本:

newStr = $($('#myDiv').html().replace(/&nbsp;/g,'')).text(); 
+0

这也取代所有其他类型的空白! – ComFreek

+0

@ComFreek当然,这正是OP所要求的。 –

+0

太棒了,我甚至不知道你可以在jquery中嵌套选择器。非常感谢你。很好的回答 – user2014429

7

.text()/textContent不包含HTML实体(如&nbsp;),这些返回为文字字符。下面是一个使用non-breaking space Unicode转义序列的正则表达式:

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

Demo

也可以使用文字非打破空间字符,而不是在正则表达式转义序列,但是我发现逃生在这种情况下序列更清晰。不过,评论无法解决。

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


下面是我的原始答案,我错误地解释了OP的用例。我会离开这里万一有人需要从DOM元素的文字内容中删除&nbsp;

[...]但是,要知道,重新设置.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')); 

Demo

+0

感谢演示,我现在就去看看。 – user2014429

+0

目的似乎不是重置HTML,因为它被设置为输入的值。 –

+0

@dystroy哦,是的,我想知道那里'输入'标记的用途是什么,直到现在我看到'.val()'调用。那我稍微收拾一下这个答案。 –