2013-10-23 188 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()'調用。那我稍微收拾一下這個答案。 –