2016-09-07 58 views
10

下面我有一個HTML標籤,並使用JavaScript來提取widget屬性的值。此代碼將提醒<test>代替&lt;test&gt;,所以瀏覽器會自動取消轉義屬性值:爲什麼瀏覽器自動unescape html標籤屬性值?

alert(document.getElementById("hau").attributes[1].value)
<div id="hau" widget="&lt;test&gt;"></div>

我的問題是:

  1. 可這種行爲可以防止任何方式,除了做屬性內容的雙重轉義? (它看起來像這樣:&amp;lt;test&amp;gt;
  2. 有誰知道爲什麼瀏覽器的行爲如此嗎? HTML規範中是否有任何地方明確提到了這種行爲?

回答

6

1)可以沒有雙逃逸

看起來像你的是更接近htmlEncode()。 如果你不介意使用jQuery

alert(htmlEncode($('#hau').attr('widget'))) 
 

 
function htmlEncode(value){ 
 
    //create a in-memory div, set it's inner text(which jQuery automatically encodes) 
 
    //then grab the encoded contents back out. The div never exists on the page. 
 
    return $('<div/>').text(value).html(); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="hau" widget="&lt;test&gt;"></div>

如果你有興趣在純香草js的解決方案

alert(htmlEncode(document.getElementById("hau").attributes[1].value)) 
 
function htmlEncode(html) { 
 
    return document.createElement('a').appendChild( 
 
     document.createTextNode(html)).parentNode.innerHTML; 
 
};
<div id="hau" widget="&lt;test&gt;"></div>

2)爲什麼瀏覽器的行爲如何?

僅因爲這種行爲,我們才能夠做一些具體的事情,比如在下面顯示的預填充輸入字段中包含引號,如果插入的唯一方法是不可能的"是通過將自身添加這又需要與另一個字符轉義像\

<input type='text' value="&quot;You &apos;should&apos; see the double quotes here&quot;" />

1

瀏覽器在解析文檔後立即忽略屬性值(提到的here)。其中一個原因可能是,否則將不可能在您的屬性值中包含雙引號(呃,從技術上講,如果您將值放在單引號中,而不是包含在單引號中,那麼您將無法包含單引號中的值)。

也就是說,行爲不能被阻止,儘管如果你真的必須使用HTML實體作爲它的一部分的值,你可以簡單地把你的特殊字符變成代碼(我建議Underscore's escape這樣的任務)。