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

首頁 > 編程 > HTML > 正文

正確使用XHTML的冒險(xiǎn)以及解決辦法

2020-03-24 19:04:06
字體:
供稿:網(wǎng)友
我使用XHTML有些年了,但直至去年夏天我才著眼于如何正確使用,那就是說,以application/xhtml+xml的MIME類型來伺服(server)它。我知道我碰到問題的一些,但問題遠(yuǎn)非如此。就如你即將發(fā)現(xiàn)的一樣,當(dāng)你開始使用真正的XHTML,你會(huì)遭遇很多似乎細(xì)小但讓人困惑的問題。

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

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

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

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

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

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

每一個(gè)基本的教程都有一些HTML和XHTML的明顯區(qū)別:元素和屬性名字使用小寫,屬性值總要用引號(hào)。不要使用簡(jiǎn)化屬性,確保所有的元素都有結(jié)束標(biāo)簽和沒有不正確的嵌套等等。但是,當(dāng)XHTML伺服為application/xhtml+xml時(shí)還需要知道更多東西。
良構(gòu)是必須的

文檔必須是良構(gòu)(well-formed)的XML(跟合法的(valid)XHTML不必然相同)。對(duì)錯(cuò)誤沒有妥協(xié),沒有機(jī)會(huì)。如果文檔不良構(gòu),符合標(biāo)準(zhǔn)的瀏覽器(當(dāng)前我知道Mozilla,F(xiàn)irefox,Netscape,Camino,Opera,Safari和OmniWeb——相當(dāng)多的瀏覽器除了IE)將會(huì)顯示一條錯(cuò)誤信息和在某種方式或其他方式上中止處理文檔。

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

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

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

總體上,不應(yīng)該在協(xié)議頭為XML數(shù)據(jù)指定字符編碼因?yàn)閿?shù)據(jù)本身已描述。

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

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

就是說,在XML聲明中指定字符編碼是好的習(xí)慣: ?xml version="1.0" encoding="UTF-8"? 只有五個(gè)實(shí)體是安全的

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

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

SGML注釋(HTML風(fēng)格注釋, !-- 注釋 -- )可能會(huì)(并且會(huì))被瀏覽器當(dāng)作注釋,就算是在script或者style元素內(nèi)部使用。

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

在XHTML中,這樣做會(huì)引起瀏覽器忽略掉注釋里的任何內(nèi)容。

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

樣式和腳本元素是PCDATA(parsed character data,解析字符數(shù)據(jù))塊,不是CDATA(character data,字符數(shù)據(jù))塊。因此,在其內(nèi)看起來像XML的任何東西都會(huì)被當(dāng)作XML來解析,并且會(huì)引發(fā)錯(cuò)誤除非是良構(gòu)的。

為了在stylee或者script塊中使用 、 或者--,你需要用CDATA部分來包裹其內(nèi)容:1. script type="text/javascript"
2. ![CDATA[
3. ...
4. ]]
5. /script 在CDATA部分內(nèi),你可以任何順序的字符,它們不會(huì)被當(dāng)作XML來解析(除了結(jié)束CDATA部分]] 。)

需要以text/html發(fā)送的文檔中,CDATA部分的起始和結(jié)束標(biāo)簽需要注釋掉,以便在不能處理CDATA部分的瀏覽器中隱藏:1. script type="text/javascript"
2. // ![CDATA[
3. ...
4. // ]]
5. /script

1. style type="text/css"
2. /* ![CDATA[ */
3. ...
4. /* ]] */
5. /style 如果要確保夠老的瀏覽器隱藏CDATA部分,需要使用更為復(fù)雜的方法,像在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 一個(gè)更好的辦法可能是在發(fā)送text/html的文檔前使用content negotiation腳本來刪除任何CDATA部分。

當(dāng)然,最聰明和安全的途徑是把所有的CSSJavaScript都移動(dòng)到外部文件中,但不總是現(xiàn)實(shí)的做法。
沒有會(huì)自動(dòng)補(bǔ)全的元素

在HTML中,假如表格的tbody元素漏寫的話瀏覽器會(huì)自動(dòng)補(bǔ)全,而XHTML不會(huì)。如果你沒有清楚地添加tbody,它就不會(huì)出現(xiàn)。在編寫CSS選擇器和JavaScript的時(shí)候請(qǐng)銘記在心。
用document.write編寫的腳本不再工作

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

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

在XHTML中,為了兼容定義CSS規(guī)則的XML方法,你應(yīng)該使用XML樣式表聲明(訪問 XHTML 1.0, Second Edition: Referencing Style Elements when serving as XML的XML樣式表聲明和Associating Style Sheets with XML documents的xml-stylesheet處理說明)。要載入外部CSS文件,我們需要使用style元素,同時(shí)應(yīng)該使用XML樣式表聲明來引入樣式元素。為此,使用id屬性給style元素一個(gè)分解的標(biāo)識(shí)符,然后在XML樣式表聲明中引入該標(biāo)識(shí)符: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 我不知道在實(shí)際中究竟有多必要,比且不使用XML樣式表聲明的話會(huì)有什么問題。或許有人會(huì)指點(diǎn)我的。
CSS的應(yīng)用規(guī)則有些不一樣

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

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

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

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

HTML和XHTML可能比我在這里提到的還有更多地不同,所以在這里把你在使用application/xhtml+xml的XHTML時(shí)遇到的問題提出來,如果你知道任何的錯(cuò)誤或者忽略,務(wù)必告訴我。
本文作者:html教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 策勒县| 平果县| 津市市| 宝清县| 察雅县| 吴旗县| 台北县| 仙居县| 齐河县| 明星| 崇州市| 英德市| 南城县| 来宾市| 屏山县| 宁武县| 永登县| 玛沁县| 平乐县| 封丘县| 凌海市| 徐水县| 德庆县| 临潭县| 乐山市| 基隆市| 南和县| 闽清县| 连城县| 汕尾市| 罗定市| 新余市| 增城市| 苏州市| 五常市| 神木县| 吉隆县| 洪洞县| 铜陵市| 方城县| 长武县|