按照W3C的定義,HTML中的注釋以<!–開頭,以–>結尾,但是真相并不僅僅如此。HTML是由SGML(標準通用標記語言)衍生而來,而在SGML中注釋的定義如下:
一個注釋以<!開頭,以>結尾。注釋中可以包含零個或多個注釋塊,每個注釋塊以–開頭,并以–結尾。并且,注釋塊之間可以包含空格。
因此,以下注釋都是正確的:
<!--Hello--> <!--Hello-- --World--> <!----> <!>
用正則表達式來表示的話,/<!(–[^-]*–)?(\s*–[^-]*–)*>/能夠匹配的注釋都是正確的。因此,下邊這種詭異的注釋雖然是一個正確的SGML注釋,但是按照W3C的定義來說就不正確了。
<!--Hello---->World-->
反過來,下邊兩種注釋是正確的W3C注釋,但是卻不是正確的SGML注釋,因為包裹注釋塊的–沒有配對。
<!---- >--> <!------>
然后問題就來了。Firefox按照SGML的標準來解釋注釋的。而IE、Chrome、Opera按照W3C的標準來解釋注釋。所以<!–Hello—->World–>這種注釋在Firefox下正常,但是在其它瀏覽器下會把World–>顯示在頁面里。反過來,<!——>在其它瀏覽器里正常,但是Firefox下會把<!——>顯示在頁面里,因為Firefox認為這不是一個注釋。另外,對于<!—- >–>來說,Firefox會認為<!—- >才是注釋,把后邊的–>顯示出來,IE和Chrome下這個是一個正確的注釋,而Opera會“智能”地認為<!—- >–>中間的空格是不小心多出來的,所以“好心”地把空格去掉后,把不適注釋部分的–>給顯示出來。
由于注釋中間的中劃線在各種瀏覽器中的表現如此不一致,因此為了避免種種意想不到的驚喜,最直接的做法就是避免在注釋中包含中劃線。
有的同學或許要問,這個或許是一個不錯的知識,可是和我們的日常開發有什么關系呢?那么請看下邊這段html:
<!--<a href="Sedan'>http://www.alibaba.com/products/used_cars/--1217----------------6-5574,.html">Sedan <span>(79727)</span></a>-->
在我們的網站里這種鏈接很常見,而且href的value是模板變量生成的。因此,如果我們在模板里這么寫:
<!--<a href="${Url}">${Name}<span>(${num})</span></a>-->
可能覺得不會有問題,但是最后生成的頁面在Firefox下就會把注釋部分顯示成下邊這樣:
Sedan (79727)-->
這個例子作為理由來講的確很不充分,畢竟沒有誰會用HTML注釋來刪掉頁面里不需要的內容,但是說不定以后的什么時候這些關于注釋的知識會在各位的工作中派上用場,這就是豆知識。
PS:如果有同學對HTML注釋特別感興趣,可以繼續閱讀本文的參考文獻:
本文鏈接:http://www.jipiao100.net/tech/web/2011/8695.asp
出處:Alibaba.com UED
責任編輯:bluehearts
◎進入論壇網頁制作、WEB標準化版塊參加討論,我還想發表評論。
|