IE的文檔模式, 及Textarea呈現bug一例

作了個很是簡單的頁面, 僅有幾行html代碼, 內容以下:html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <table>
        <tr>
            <td style="width:800px;height:300px;border:1px solid red;">
                <textarea style="width:100%;height:100%"></textarea>
            </td>
        </tr>
    </table>
</body>
</html>

在本地測試的時候是徹底正常的, 界面以下圖:html5

image

可是發佈到服務器上之後再訪問, 呈現的界面卻變成了這樣: chrome

image

即,中間的TextArea高度不對, 100%的設定不起做用了. 瀏覽器

進一步的, 我繼續在本地試驗, 原先我用的地址是localhost, 把localhost改爲個人機器名, 果真, 現象跟服務器如出一轍, textarea的高度出問題了. 服務器

ps: 我用的瀏覽器是IE10. 工具

我又在另外一臺電腦(IE6) 上訪問這個頁面, 結果也是如圖2那樣, 沒有正確呈現高度.   開發工具

若是換用chrome, 則在全部狀況下都能正確按100%呈現高度. 測試

 

研究了一下這個問題, 發現原來IE對localhost是作了特殊處理的, localhost和其它域名所採用的默認文檔模式是不一樣的. ui

 

文檔模式spa

 

在IE上按F12, 打開開發工具窗口( 應該IE7以上都有這個功能) , 最右側即顯示文檔模式:

image

IE10支持如上圖所示的6種文檔模式, 能夠經過鼠標點擊, 或快捷鍵來切換文檔模式, 切換之後, 頁面的呈現即當即改變.

其中, Standards模式是」最新的」,即, 儘可能按照w3c的標準來呈現, 這個結果通常與chrome等瀏覽器一致.

而Quirks模式是來自IE5以及更早版本的IE. 是一種向下兼容模式.

除了這兩種典型模式之外, 還同時支持IE7,8,9 三種不一樣的標準, 以及IE5 quirks .

IE選擇文檔模式的標準是取決於文檔頂部的<!DOCTYPE>, 當文檔沒有doctype聲明時, IE認爲這是很早以前的老頁面, 將以quirks模式呈現. 當有doctype時, 則按照doctype的不一樣自動選擇. 

中, 上述代碼中<!DOCTYPE html> 標記代表這是html5頁面.

原本, IE發現這是html5頁面, 應該採用standards模式呈現, 爲何在實踐中卻自動選擇了IE7 standards? 我找了一下, 在Tools->Compatibility View Settings窗口中, 默認勾選了Display intranet sites in compatibility view選項:

image

意思是對局域網的全部網頁開啓兼容模式, 這致使IE10 對html5頁面選擇了IE7 標準, 而localhost則不一樣, 它被作了特殊處理, 不以兼容模式呈現. 取消此項, 再用機器名測試一下, 果真正常呈現了, 檢查文檔模式, 確實是Standards模式. 徹底符合預期.

 

此外, 能夠經過兼容性元數據來告訴IE 某個頁面要用哪一個模式去呈現:

<meta http-equiv="X-UA-Compatible" content="IE=9" />

在頁面的head中增長上述元數據後, 從新用IE訪問該頁面, 能夠發現IE使用了IE9 standards模式.

把上述代碼中的IE=9換成IE=7或IE=8 或IE=10,  則能夠分別讓IE用IE7 standards, IE 8 standards, 以及Standards( IE10 標準) 模式呈現.  (即便啓用了上節的局域網兼容選項, 也仍然如此) 

除了具體指定IE的版本, 通常來講, 更好的選擇是使用"IE=edge" , 該指令要求IE使用最新的版本解析(而沒必要在IE升級的時候去改代碼). 

文檔模式也能夠在JS中經過document.documentMode屬性讀出.

所以, 爲了讓頁面可以符合預期地呈現, 應該在html代碼中增長上述指令, 明確地告訴IE選擇哪一個文檔模式, 避免不一樣的客戶端出現不一樣的呈現結果.

 

Textarea呈現BUG

 

還回到本文開頭所說起的textarea呈現bug. 

測試代表, 該bug僅在IE6下, 以及IE7 standards模式下出現,  在Quriks模式下正常.

所以, 對於IE7以上版本的瀏覽器, 只要增長X-UA-Compatible元數據便可.

而對於IE6以及IE7, 就沒有什麼好辦法了, 只能取消100%這個設定, 採用絕對像素法設定它的高度.

 

關於Textarea:

在aspx頁面中, 當<asp:TextBox /> 的TextMode爲MultiLine時, 將在客戶端呈現爲Textarea,

所以在aspx文件中也能夠很容易地複製上述問題, 以下一行代碼便可:

<asp:TextBox ID="txt1" runat="server" TextMode="MultiLine" Width="100%" Height="100%" />

相關文章
相關標籤/搜索