2012年7月26日

[.Net] Gotcha: Don't use <xhtmlConformance mode="Legacy"/> if you want to cross browser

好吧,我承認,這標題是學 Gotcha: Don't use <xhtmlConformance mode="Legacy"/> with ASP.NET AJAX 的。

不過情況有些不一樣,最近接手一個舊的 ASP.NET 網站,
雖然是 .Net Framework 2.0 的網站,但骨子裡其實是從 .Net Framework 1.1 升級的,
我們的需求不多,只要可以和時下流行的 Browser 相容就好,
也不打算引入 ASP.NET AJAX,
於是著手開始調整相容性相關的程式寫法,
調整得差不多後,開始測試,
沒想到一開始就遇到 Validator 不能正常執行的情況,
追了一下發現一個很特別的現象,

造成 Validator 不正常的問題出在 Asp.Net 的 ValidatorOnLoad 中,
會直接用 DOMObject.Attribute 去取值(如下程式碼片段),
但這在其他 IE 以外的瀏覽器是不允許的(IE9標準模式也不允許)!
function ValidatorOnLoad() {
if (typeof(Page_Validators) == "undefined")
return;
var i, val;
for (i = 0; i < Page_Validators.length; i++) {
val = Page_Validators[i];
if (typeof(val.evaluationfunction) == "string") {
eval("val.evaluationfunction = " + val.evaluationfunction + ";");
} // 略 .....
正確的作法應該要用 getAttribute('name') 才對,
但這不能解釋為什麼相同的程式碼在 .Net Framework 2.0 卻能正常的運作,
我用 evaluationfunction 這個關鍵字找了半天,
完全沒有找到相關的說明,
後來拿一個運作正常的網站所產生的 HTML 來和有問題的比較,
發現:

一般正常的應該要長得像這樣:

但他卻長成這樣:

到這裡,情況已經很明朗了,應該有什麼特別的設定,造成這樣的差異,
於是我改用別的關鍵字搜尋
.Net 1.0 and 2.0 hybrid validator not work
終於勉強找到了
Why might ASP.NET be putting JavaScript in HTML Comment blocks, not CDATA?
裡面提到了關鍵字 <xhtmlConformance mode="Transitional" />
再用 xhtmlConformance 就找到了 Gotcha: Don't use <xhtmlConformance mode="Legacy"/> with ASP.NET AJAX
原來,如果 xhtmlConformance mode="Legacy" 時,
不會處理那些不是標準 XHTML 的屬性,
反之,則會多產生一段 Javascript 把擴充屬性"塞"給 DOM Object ,
確保在不同的瀏覽器下都能夠用 DOMObject.attribute 的方式取到資料。

參考資料:
1. Why might ASP.NET be putting JavaScript in HTML Comment blocks, not CDATA?
2. Gotcha: Don't use <xhtmlConformance mode="Legacy"/> with ASP.NET AJAX
3. xhtmlConformance 項目 (ASP.NET 設定結構描述)
4. KB-由ASP.NET 1.1昇級的網站無法啟用MS AJAX


沒有留言 :

張貼留言