<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    正確使用XHTML的冒險(xiǎn)

    原文: http://www.456bereastreet.com/archive/200501/the_perils_of_using_xhtml_properly/
    作者: Roger Johansson
    翻譯: Neo ( http://www.omemo.net/neo )
    修正:
    JunChen

    JunChen 注:omemo.net網(wǎng)站似乎已經(jīng)掛掉,鏈接都失效了。文章寫(xiě)得非常不錯(cuò),一直是Best of 456 Berea Street。在這里發(fā)布的時(shí)候我進(jìn)行了少量代碼上和翻譯上的修改,以忠實(shí)原著。

    我使用XHTML有些年了,但直至去年夏天我才著眼于如何正確使用,那就是說(shuō),以application/xhtml+xmlMIME類型來(lái)伺服(server)它。雖然我遇到了這些問(wèn)題,但我知道問(wèn)題遠(yuǎn)非如此。就如你即將發(fā)現(xiàn)的一樣,當(dāng)你開(kāi)始使用真正的XHTML,你會(huì)遭遇很多似乎細(xì)小但讓人困惑的問(wèn)題。

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

    只有在問(wèn)題發(fā)生的時(shí)候,我才有機(jī)會(huì)去了解和認(rèn)識(shí)這些東西。有些情況下我必須花很多時(shí)間來(lái)查找問(wèn)題和求助于其他人,來(lái)尋求一個(gè)解決方案。但我在其中學(xué)到不少東西,我會(huì)把我已經(jīng)使用XHTML后應(yīng)該知道的都告訴你。

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

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

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

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

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

    良好的結(jié)構(gòu)是必須的

    文檔必須是良好的結(jié)構(gòu)(well-formed)的XML(跟合法的(valid)XHTML不必然相同)。就是必須,不是可能。

    如果文檔結(jié)構(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這樣寫(xiě)的:總體上,不應(yīng)該在協(xié)議頭為XML數(shù)據(jù)指定字符編碼,因?yàn)閿?shù)據(jù)本身已描述。

    另一方面,XHTML 1.0, Second Edition: Character Encoding寫(xiě)到:

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

    就是說(shuō),在XML聲明中指定字符編碼是好的習(xí)慣:

    <?xml version="1.0" encoding="iso-8859-1"?>

    只有五個(gè)實(shí)體是安全的

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

    使用UTF-8字符編碼是最受推薦的,讓你(幾乎)可以使用你需要鍵入文檔的任意字符,不需要實(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中,普遍地把scriptstyle的內(nèi)容裝入注釋中,為的是在不認(rèn)識(shí)scriptstyle元素的瀏覽器中隱藏他們,并且在頁(yè)面上把其內(nèi)容生成平白文本。

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

    在老的瀏覽器中隱藏scriptstyle的習(xí)慣可以追溯到1990年代中期。我的經(jīng)驗(yàn)是,有如此表現(xiàn)的瀏覽器是十分罕見(jiàn)的,所以你可以安全地忽略它們,并且停止在腳本和樣式中裝入SGML式注釋,就算你使用的是HTML。

    腳本和樣式元素的內(nèi)容也被當(dāng)作XML

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

    為了在scriptstyle塊中使用<、&或者--,你需要用 CDATA

    < script? type ="text/javascript" >
    <! [CDATA[

    ]]
    >
    </ script >

    在CDATA里,你可以任何順序的字符,它們不會(huì)被當(dāng)作XML來(lái)解析(除了結(jié)束CDATA部分]]>)。

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

    < script? type ="text/javascript" >
    // ?<![CDATA[

    // ?]]>
    </ script >
    < style? type ="text/css" >
    /* ?<![CDATA[? */

    /* ?]]>? */
    </ style >

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

    < script? type ="text/javascript" >
    <!-- // --><![CDATA[//><!--

    // --><!]]>
    </ script >
    < style? type ="text/css" >
    <!--
    /* --><![CDATA[/*><!-- */

    /* ]]> */ -->
    </ style >

    一個(gè)更好的辦法可能是在發(fā)送text/html的文檔前使用content negotiation腳本來(lái)刪除任何CDATA部分。

    當(dāng)然,最聰明和安全的途徑是把所有的CSS和JavaScript都移動(dòng)到外部文件中,但不總是現(xiàn)實(shí)的做法。

    沒(méi)有會(huì)自動(dòng)補(bǔ)全的元素

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

    用document.write編寫(xiě)的腳本不再工作

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

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

    引入樣式元素

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

    <? xml-stylesheet?href="stylesheet1.css"?type="text/css" ?>
    <? xml-stylesheet?href="#stylesheet2"??type="text/css" ?>
    <! DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Strict//EN"?
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
    >
    < html? xmlns ="http://www.w3.org/1999/xhtml" ?xml:lang ="en" ?lang ="en" >
    < head >
    < title > XML?stylesheet?declaration </ title >
    < style? type ="text/css" ?id ="stylesheet2" >
    @import?"stylesheet2.css";
    </ style >
    </ head >

    我不知道在實(shí)際中究竟有多必要,并且不使用XML樣式表聲明的話會(huì)有什么問(wèn)題。或許有人會(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è)頁(yè)面。在XHTML中,你必須同時(shí)樣式化html。在Juicy Studio的 CSS body Element Test 中有這個(gè)行為的演示。

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

    有挑戰(zhàn),但不是不可能

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

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

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

    posted on 2006-11-25 12:04 Flyingis 閱讀(1016) 評(píng)論(0)  編輯  收藏 所屬分類: Technology

    主站蜘蛛池模板: 亚洲av无码偷拍在线观看| 亚洲av鲁丝一区二区三区| 激情五月亚洲色图| **一级毛片免费完整视| 亚洲黄色网址在线观看| 96免费精品视频在线观看| 亚欧乱色国产精品免费视频| 国产片免费福利片永久| 国产亚洲精品国产福利在线观看| 国产精品自在自线免费观看| 亚洲AV无码专区在线电影成人| 成人人观看的免费毛片| 青青青亚洲精品国产| 免费在线观看毛片| 国产成人无码免费网站| 亚洲不卡av不卡一区二区| 亚洲a一级免费视频| 亚洲一区中文字幕在线观看| 成人a免费α片在线视频网站| 国产成人亚洲综合a∨| 中文字幕第一页亚洲| 久久精品免费视频观看| 国产成+人+综合+亚洲专| 在线看片无码永久免费aⅴ| 2022国内精品免费福利视频| 亚洲视频在线播放| 18禁超污无遮挡无码免费网站国产 | 亚洲成AV人片一区二区| 亚洲精品视频在线观看免费| 亚洲日本VA午夜在线影院| 亚洲国产黄在线观看| 99精品视频在线视频免费观看 | 亚洲一级毛片在线播放| 免费中文字幕不卡视频| 久久爰www免费人成| 亚洲精品国产日韩| 在线A亚洲老鸭窝天堂| 美女内射毛片在线看免费人动物| 亚洲精品国产高清在线观看| 国产∨亚洲V天堂无码久久久| 欧美a级成人网站免费|