我們都知道XHtml裡面的img標記應該這樣寫:<img alt="" src="" />,這種寫法也就是所謂的自關閉,在XML中是完全合法的寫法。如果你熟悉XML相關的開發,可能也就習慣於這種寫法,想著XML中任何不含子節點的元素都可以這樣寫,那麼XHTML中沒有內容的標簽也都可以這樣寫。XHtml中理論上當然允許任何標簽以自關閉的方法來書寫,然而浏覽器兼容性卻帶來了新問題,那就是IE無法正確識別某些標簽的自關閉寫法。
請嘗試輸入以下XHtml代碼並在IE中浏覽:<p>hello <script type="text/Javascript" /> world</p>,你會發現只能看到前面的hello而不見後面的world,這事情讓人挺無法解釋的吧。可能有不少人都曾經遇到過這個問題,並且花了幾個小時在上面都找不到合理的解釋。
解釋源自另外一段類似的代碼:<p>hello <textarea /> world</p>,你在IE中看看其顯示效果,能夠得到合理的解釋了嗎?我們能夠看到前面的hello正常顯示了,而後面的world則顯示在textarea裡面,這證明IE並沒有正確識別textarea標簽已經自關閉了,而是當它沒有關閉,並將後面的內容識別為textarea內部的內容。
這時候我們就明白前面那段代碼為什麼看不到後面的world了,因為它被當作script的一部分來識別了。這就說明了,在我們使用XHtml時並不能好像XML那樣隨意的使用自關閉的寫法,只有少數原本不需要關閉的標簽可以用自關閉的寫法,其他標簽即使沒有任何內容最好也用成對的關閉寫法。
最後需要提醒大家的是,其實弱智的parser不僅僅IE有,很多地方都可能碰到由於parser不嚴謹而引起的問題,所以我們在書寫XHTML的時候還是要遷就一些老Html繼承下來的習慣,不能好像真的XML那樣自以為符合標准了就隨意寫。不信?那麼再試一個吧:<p>hello <br></br> world</p>,留意IE與Opera中的顯示效果。
Update: 有部分讀者認為我舉的例子是不符合XHTML規范的,那麼請先閱讀XHTML規范。Empty Elements一節的中文翻譯如下:“空元素必須要麼有一個結束標記,要麼以/>結束,例如<br/>或<hr></hr>。請參考HTML兼容性標准以獲取關於確保向後兼容HTML4浏覽器的信息。”可以看得到,規范中也給出了<hr></hr>這樣的例子,說明<br></br>的寫法是符合XHTML規范的,只是沒有兼容HTML4標准。那麼到底XHTML是否兼容HTML4呢?我們來看Compatibility Issues一節,中文翻譯如下:“雖然並沒有要求XHTML1.0文檔兼容現有的浏覽器,但在實踐中這並不難做到。”因此,XHTML是沒有規定文檔必須向下兼容,我給出的例子都是合法的XHTML文檔片斷,當出現在完整的XHtml裡面時也全部能通過W3C Markup Validation Service的驗證。
Update again: 其實我寫這篇文章的目的不是為了強調只符合XHTML規范就行了,也不是強調符合XHTML同時兼容HTML4就夠了,而是應該考慮更多需要兼容的情況。例如你的CMS中允許用戶提交HTML,提交的HTML經過SgmlReader或者其他方法格式化為XHtml,同時或許還做了其它XML處理,這時候就有可能將用戶提交的<textarea></textarea>轉換為<textarea />,這種情況下你需要通過跟蹤調試找出問題並不容易,因為XML處理並沒有違反任何規范,每一步的處理都是符合語義的。另外最好不要把<br />寫成<br/>,因為確實有些弱智的parser僅僅因為少了一個空格就無法正確識別。