2014-11-21 63 views
1

我有一個變量一個javascript節點,如果我是可變登錄到控制檯,我得到這樣的:在一個javascript節點獲取JavaScript節點原始內容

"​asekuhfas eo" 

只是一些隨機字符串。我想從字面上理解爲一個字符串。但問題是,當我使用它textContent,我得到這個:

​asekuhfas eo 

特殊字符轉換。我需要讓字符串看起來像這樣:

​asekuhfas eo 

這樣,我可以處理特殊字符(識別它存在於字符串中時)。

如何將該節點對象作爲字符串LITERALLY出現?

+0

Offtopic:它被稱爲 「DOM節點」。 – hon2a 2014-11-21 15:24:08

+0

您是否閱讀過標籤「raw」的描述? – 2014-11-21 15:24:48

+0

@ hon2a好吧,我的意思是一個DOM節點,在javascript中,似乎是多餘的澄清。 – 2014-11-21 15:26:42

回答

3

正如VisionN指出的那樣,不可能扭轉UTF-8編碼。 但是通過使用charCodeAt(),你可能仍然可以實現你的目標。

假設你有你的textContent。通過遍歷每個字符,檢索其charCode並預先添加「&#」以及追加「;」你可以得到你想要的結果。這種方法的缺點顯然在於你將在這個註釋中包含每一個字符,即使那些不需要它。通過引入某種閾值,您可以將其限制爲僅限於特殊字符。

一個非常幼稚的做法是這樣的:

var a = div.textContent; 
var result = ""; 
var treshold = 1000; 
for (var i = 0; i < a.length; i++) { 
    if (a.charCodeAt(i) > 1000) 
    result += "&#" + a.charCodeAt(i) + ";"; 
else 
    result += a[i]; 
} 
+0

奇妙!工作就像一個魅力:)好想法。 – 2014-11-21 15:40:05

+0

考慮到我只對這一個特定的char代碼感興趣,這特別有用。所以我可以用if(a.charCodeAt(i)== 8203)替換'if(a.charCodeAt(i)> 1000)'' – 2014-11-21 15:41:02

1

textContent正確返回一切,&#8203;Unicode Character 'ZERO WIDTH SPACE' (U+200B),它是:

通常縮寫ZWSP

該字符是用於隱形字分離和對線路中斷控制;它沒有寬度,但它的兩個字符之間存在不防止增加字母間距在理由

它可以與很容易地證明:

var div = document.createElement('div'); 
div.innerHTML = '&#8203;xXx'; 

console.log(div.textContent);     // "​xXx" 
console.log(div.textContent.length);   // 4 
console.log(div.textContent[0].charCodeAt(0)); // 8203 

his answer提到Eugen Timm它是一個有點棘手將UTF字符轉換回HTML實體,並且他的解決方案對於字符代碼高於1000的非標準字符完全有效。作爲一種替代我可以提出一個更短的正則表達式的解決方案,這將給予同樣的結果:

var result = div.textContent.replace(/./g, function(x) { 
    var code = x.charCodeAt(0); 
    return code > 1e3 ? '&#' + code + ';' : x; 
}); 

console.log(result); // "&#8203;xXx" 

對於一個更好的解決方案,你可以看看this answer它可以處理所有的HTML特殊字符。

+0

不知道這回答OP的問題:'我怎樣才能得到該節點對象是一個字符串LITERALLY,因爲它顯示?OP想要獲取字符串,因爲它出現在HTML中。 (即'​'位 – sircapsalot 2014-11-21 15:19:15

+0

對,我明白了,所以我想知道是否可以得到該DOM節點,因爲它實際上以某種其他方式出現?某種數字或原始的unicode編碼方法,我不是知道也許? – 2014-11-21 15:19:26