国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

正確使用XHTML的冒險以及解決辦法

2024-04-27 13:54:42
字體:
來源:轉載
供稿:網友
我使用XHTML有些年了,但直至去年夏天我才著眼于如何正確使用,那就是說,以application/xhtml+xml的MIME類型來伺服(server)它。我知道我碰到問題的一些,但問題遠非如此。就如你即將發現的一樣,當你開始使用真正的XHTML,你會遭遇很多似乎細小但讓人困惑的問題。

請注意這不是一篇討論支持或反對使用XHTML的文章。我只是寫下我所知道的潛在的易犯錯誤,并且讓你自己來決定自己的選擇:HTML 4.01,為所有瀏覽器伺服為text/html的XHTML 1.0或者為能夠處理其的瀏覽器伺服為application/xhtml+xml而其他瀏覽器則伺服為text/html的XHTML 1.0。否則有些東西會完全不一樣。

每當我遭遇到它們發生的場合,我開始了解一個又一個的問題。有些情況下我必須花很多時間來查找問題并且在找到解決辦法之前求助于其他人。但我在其中學到不少東西,我將把我已經使用XHTML后應該知道的都告訴你。

注意我這里提及的問題只會發生在能正確處理application/xhtml+xml MIME類型的用戶代理中,而因此XHTML被作為XML。這也可能是這里不提及XHTML的早期使用的原因——很少有人使用這樣的瀏覽器,所以幾乎不會有人因只伺服為text/html的XHTML所煩憂。

今天,實際上把XHTML伺服為application/xhtml+xml正慢慢變得平常。我所知道的理由有兩個:

1. 使用Firefox,Mozilla,Opera。Safari和其他兼容XHTML瀏覽器的人數增加了很多,所以你不再僅僅為自己和伙伴這樣做。嗯?;蛟S你就這樣做,當將影響更多人。
2. 在web開發者之間,對XHTML的真正面目是什么的覺醒越來越多了。使用XHTML已經有多次多時的熱烈的討論,尤其是伺服為text/html的時候。如果你參與了任何一次討論,你知道我在說什么。

假如你,像我,決定實現某些類型的content negotiation和在傳送XHTML的時候使用正確的媒體類型,你需要知道什么能(和將)在你發布的文檔中發生,并且知道怎樣避免問題的發生。對于對content negotiation同進行content negotiation的腳本例子有興趣的讀者,我推薦你閱讀Content Negotiation和Serving up XHTML with the correct MIME type(本站早有翻譯:使用正確的MIME類型伺服XHTML)。還有很多這種類型的文章,但這是我讀到的最精彩的兩篇。

每一個基本的教程都有一些HTML和XHTML的明顯區別:元素和屬性名字使用小寫,屬性值總要用引號。不要使用簡化屬性,確保所有的元素都有結束標簽和沒有不正確的嵌套等等。但是,當XHTML伺服為application/xhtml+xml時還需要知道更多東西。
良構是必須的

文檔必須是良構(well-formed)的XML(跟合法的(valid)XHTML不必然相同)。對錯誤沒有妥協,沒有機會。如果文檔不良構,符合標準的瀏覽器(當前我知道Mozilla,Firefox,Netscape,Camino,Opera,Safari和OmniWeb——相當多的瀏覽器除了IE)將會顯示一條錯誤信息和在某種方式或其他方式上中止處理文檔。

此外,這還意味著不再未編碼的“&”號。
XML聲明可能是必須的

如果要使用除了UTF-8或者UTF-16字符編碼,XML聲明是必須的除非HTTP頭已經提供編碼。

在HTTP頭中是否要指定字符編碼有些模糊,Architecture of the World Wide Web, Volume One: Media Types for XML如此陳述

總體上,不應該在協議頭為XML數據指定字符編碼因為數據本身已描述。

另一方面,XHTML 1.0, Second Edition: Character Encoding說:

為了讓文檔使用指定的字符編碼,最好的辦法是保證web服務器發送正確的頭。

就是說,在XML聲明中指定字符編碼是好的習慣:

<?xml version="1.0" encoding="UTF-8"?>
只有五個實體是安全的

只有五個預定義的實體(&lt;、&gt;、&amp;、 &quot;和&apos;)的支持是有擔保的。其他的可能完全被忽略或者直接輸出。比如,如果XHTML文檔包含如 或者”的實體,Safari會生成。直接地。Opera反而選擇忽略未知的實體,同時Mozila家族會認得這些實體并且就像HTML中“如果文檔引用公共的映射瀏覽器偽DTD目錄中的標識符并且沒有單獨聲明的文檔” 來處理。

使用UTF-8字符編碼是備受推薦的最好實踐,讓你(幾乎)可以使用你需要鍵入文檔的任意字符,不需要實體或者字符編號。如果你不能或不愿使用UTF-8,數字式的字符編號是可以支持和安全使用的。
SGML式注釋的內容可能會被忽略

SGML注釋(HTML風格注釋, <!-- 注釋 -->)可能會(并且會)被瀏覽器當作注釋,就算是在script或者style元素內部使用。

在HTML中,普遍地把sript和style塊的內容裝入注釋中,為的是在不認識script或者style元素的瀏覽器中隱藏他們,并且在頁面上把其內容生成平白文本。

在XHTML中,這樣做會引起瀏覽器忽略掉注釋里的任何內容。

在老舊的瀏覽器中隱藏script和style元素的實踐是退回到1990年代中期的一個習慣。我的經驗是,有如此表現的瀏覽器是十分罕見的,所以你可以安全地忽略它們,并且停止在腳本和樣式中裝入SGML式注釋,就算你使用的是HTML。
腳本和樣式元素的內容也被當作XML

樣式和腳本元素是PCDATA(parsed character data,解析字符數據)塊,不是CDATA(character data,字符數據)塊。因此,在其內看起來像XML的任何東西都會被當作XML來解析,并且會引發錯誤除非是良構的。

為了在stylee或者script塊中使用<、&或者--,你需要用CDATA部分來包裹其內容:

1. <script type="text/javascript">
2. <![CDATA[
3. ...
4. ]]>
5. </script>

在CDATA部分內,你可以任何順序的字符,它們不會被當作XML來解析(除了結束CDATA部分]]>。)

需要以text/html發送的文檔中,CDATA部分的起始和結束標簽需要注釋掉,以便在不能處理CDATA部分的瀏覽器中隱藏:

1. <script type="text/Javascript">
2. // <![CDATA[
3. ...
4. // ]]>
5. </script>

1. <style type="text/CSS">
2. /* <![CDATA[ */
3. ...
4. /* ]]> */
5. </style>

如果要確保夠老的瀏覽器隱藏CDATA部分,需要使用更為復雜的方法,像在Ian Hickson的Sending XHTML as text/html Considered Harmful中描述的那樣:

1. <script type="text/javascript">
2. <!--//--><![CDATA[//><!--
3. ...
4. //--><!]]>
5. </script>

1. <style type="text/css">
2. <!--/*--><![CDATA[/*><!--*/
3. ...
4. /*]]>*/-->
5. </style>

一個更好的辦法可能是在發送text/html的文檔前使用content negotiation腳本來刪除任何CDATA部分。

當然,最聰明和安全的途徑是把所有的CSS和JavaScript都移動到外部文件中,但不總是現實的做法。
沒有會自動補全的元素

在HTML中,假如表格的tbody元素漏寫的話瀏覽器會自動補全,而XHTML不會。如果你沒有清楚地添加tbody,它就不會出現。在編寫CSS選擇器和JavaScript的時候請銘記在心。
用document.write編寫的腳本不再工作

在XHTML中使用JavaScript,document.write不會工作。Ian Hickson在Why document.write() doesn’t work in XML(本站早已翻譯:為什么document.write在XML中不工作)解釋了原因。你需要使用document.createElementNS()代替。關于更多可以在Experts Exchange中的論壇主題中找到。

這也是Google AdSense不在XHTML中工作的原因之一。那些希望以application/xhtml+xml伺服XHTML并且使用Google廣告的人,這兒有一個解決辦法:Simon Jessey的 Making AdSense work with XHTML(本站早有翻譯:使Google廣告AdSense在XHTML中工作)。盡管有點麻煩,但還是工作了(我在這里也使用了),同時被Google所認可。
引入樣式元素

在XHTML中,為了兼容定義CSS規則的XML方法,你應該使用XML樣式表聲明(訪問 XHTML 1.0, Second Edition: Referencing Style Elements when serving as XML的XML樣式表聲明和Associating Style Sheets with XML documents的xml-stylesheet處理說明)。要載入外部CSS文件,我們需要使用style元素,同時應該使用XML樣式表聲明來引入樣式元素。為此,使用id屬性給style元素一個分解的標識符,然后在XML樣式表聲明中引入該標識符:

1. <?xml-stylesheet href=”stylesheet1.css” type=”text/css”?>
2. <?xml-stylesheet href=”#stylesheet2” type=”text/css”?>
3. <!DOCTYPE html
4. PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
5. “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
6. <html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>
7. <head>
8. <title>XML stylesheet declaration</title>
9. <style type=”text/css” id=”stylesheet2”>
10. @import “stylesheet2.css”;
11. </style>
12. </head>

我不知道在實際中究竟有多必要,比且不使用XML樣式表聲明的話會有什么問題。或許有人會指點我的。
CSS的應用規則有些不一樣

CSS應用到body的性質(PRoperty)并不應用到XHTML的整個文檔。最值得注意的是應用背景顏色或者圖片。在HTML中,應用到body元素的背景將會覆蓋整個頁面。在XHTML中,你必須同時樣式化html。在Juicy Studio的 CSS body Element Test中有這個行為的演示。

在XHTML中作為CSS規則的元素和屬性名字是大小寫敏感的(而且必須是小寫的)。避免問題最簡單的辦法是,不管在HTML,XHTML還是CSS中所有東西都保持小寫。
有挑戰,但不是不可能

當我開始為兼容的瀏覽器伺服XHTML為application/xhtml+xml時,在作出決定前假如我能讀到想這篇一樣的文章,或許我的頭痛可以減輕不少。我甚至考慮使用HTML 4.01 Strict。雖然如此,我還是從經驗中學到不少,而學習總是一個好東西。

正確地使用真正的XHTML,十分希望這篇文章能為你提供一些更有用的信息,并且可以為是否需要走這條路提供更多有根據的決定。

HTML和XHTML可能比我在這里提到的還有更多地不同,所以在這里把你在使用application/xhtml+xml的XHTML時遇到的問題提出來,如果你知道任何的錯誤或者忽略,務必告訴我。


更易閱讀格式請點擊http://neoone.51.net/tech/perils.php

上一篇:中文網頁制作中段落縮進的方法

下一篇:制作三維表格效果

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 南皮县| 平顶山市| 永丰县| 达州市| 苍山县| 河南省| 饶阳县| 鄂伦春自治旗| 柳州市| 甘孜县| 梓潼县| 麦盖提县| 墨玉县| 观塘区| 京山县| 宝山区| 泸西县| 汉阴县| 永康市| 乌鲁木齐县| 丽江市| 出国| 安乡县| 嵩明县| 双辽市| 南京市| 宁武县| 锦州市| 石景山区| 阳谷县| 和田市| 二手房| 辽阳市| 迁安市| 云南省| 松江区| 阳信县| 项城市| 项城市| 平顶山市| 荔波县|