2013-06-05 94 views
3

我在Jquery中看到一些意外的行爲。看來jquery正在將"轉換爲文字雙引號,這與我正在處理的單個頁面應用程序中的表單驗證混亂。內容是通過jquery設置的,在這一點上,包含"的表單字段被轉換爲",這打破了表單。jquery將"轉換爲文字引用

作爲一個測試,我嘗試了常規的JS DOM操作並得到了不同的結果。這似乎與Jquery的1.x和2.x版本保持一致。

這裏是我試過的代碼:

// Regular Javascript 
var e = document.createElement('div'); 
var textNode=document.createTextNode('&'); 
e.appendChild(textNode) 
console.log(e.childNodes) //=> ['&'] 

var e = document.createElement('div'); 
var textNode=document.createTextNode('"'); 
e.appendChild(textNode) 
console.log(e.childNodes) //=> ['"'] 

// vs. Jquery 

e = $('<div>') 
content = '&amp;' 
e.html(content) 
console.log(e.html()) //=> &amp; 

e = $('<div>') 
content = '&quot;' 
e.html(content) 
console.log(e.html()) // => " (a quote) 

有什麼想法?

編輯 jquery doc說.html()是基於瀏覽器的innerHTML實現。然而,使用上面的純JS代碼: console.log(e.innerHTML)yeilds:& amp;和&「分別。

另外,主叫的innerHTML存儲在jquery的yeilds實際DOM: 的console.log(e.get(0).innerHTML)&和「分別

e = $('<div />'); 
content = '&quot;' 
e.html(content) 
console.log(e.get(0).innerHTML) // => " 
console.log(e.html()) // => " 
console.log(e.text()) // => " 

e = $('<div />'); 
content = '&amp;' 
e.html(content) 
console.log(e.get(0).innerHTML) //=> &amp; 
console.log(e.html()) //=> &amp; 
console.log(e.text()) //=> & 
+1

你不應該使用jQuery爲此[香草JS(HTTP:// –

回答

1

使用.text() method而非.html()

+0

只看起來是爲了雙引號而已:re:&是獨立的 –

2

$.html()方法將解碼/編碼的HTML實體要繞過這一行爲可以考慮使用$.text()代替:

var e = $("<div>"), content = "&quot;"; 
e.text(content); 
console.log(e.text()); // outputs &quot; 

編輯

你可能只是使用正則表達式替換找到有問題的報價和自己的編碼,它們像這樣考慮:

var e = $("<div>"), content = "&quot;&amp;"; 
e.html(content); 
console.log(e.html()); // outputs "&amp; 

var e_encoded = e.html().replace(/"/g, "&quot;"); 
console.log(e_encoded); // outputs &quot;&amp; 

請記住,上面還將編碼中使用的任何報價對於content變量中包含的任何標記中的HTML屬性,這是爲什麼$.html()方法不對它們進行編碼的原因。

我希望這有助於!

+0

+1鏈接到文檔 –

+0

它似乎只對雙引號雖然.re:&是獨立的,而且還有周圍的標記,所以我無法使用.text(),這是s蒸餾的例子。 –

+1

@BlaineGarrett看看更新後的答案。 – dSquared

0

共識是這是預期的行爲,因爲jquery只是包裝瀏覽器的innerHTML方法。

這似乎對於需要和"區分「中呈現的表單輸入單頁的應用程序噩耗等