HTML
HTML最早是從2.0版開始的。從來(lái)就沒有1.0版。如果有人告訴你說,他最早是從HTML 1.0開始使用HTML的,那他絕對(duì)是在忽悠你。從前確實(shí)有一個(gè)名叫HTML Tags的文檔,其中的部分標(biāo)簽一直用到現(xiàn)在,但那個(gè)文檔并非官方的規(guī)范。
使用標(biāo)簽、尖括號(hào)、p或h1,等等,并不是蒂姆·伯納斯-李首創(chuàng)的想法。當(dāng)時(shí)的SGML里就有了這些概念,而且當(dāng)時(shí)的CERN(Conseil Europeen pour la Recherche Nucleaire,歐洲核子研究委員會(huì))也在使用SGML的一個(gè)特定的版本。也就是說,即便在那個(gè)時(shí)代,他也沒有白手起家;這一點(diǎn)在HTML后來(lái)的發(fā)展過程中也體現(xiàn)了出來(lái):繼往開來(lái)、承前啟后,而不是另立門戶、從頭開始。
換句話說,這篇名為HTML Tags的文檔可以算作HTML的第一個(gè)版本,但它卻不是一個(gè)正式的版本。第一個(gè)正式版本,HTML 2.0,也不是出自W3C之手。HTML 2.0是由IETF,因特網(wǎng)工程任務(wù)組(Internet Engineering Task Force)制定的。在W3C成立之前,IETF已經(jīng)發(fā)布了不少標(biāo)準(zhǔn)。但從第三個(gè)版本開始往后,W3C,萬(wàn)維網(wǎng)聯(lián)盟(World Wide Web Consortium)開始接手,并負(fù)責(zé)后續(xù)版本的制定工作。
20世紀(jì)九十年代HTML有過幾次快速的發(fā)展。眾所周知,在那個(gè)時(shí)代要想構(gòu)建網(wǎng)站,可是一項(xiàng)十分復(fù)雜的工程。瀏覽器大戰(zhàn)曾令人頭疼不已。市場(chǎng)競(jìng)爭(zhēng)的結(jié)果就是各家瀏覽器里都塞滿了各種專有的特性,都試圖在專有特性上勝人一籌。當(dāng)時(shí)的混亂程度不堪回首,HTML到底還重不重要,或者它作為Web格式的前景如何,誰(shuí)都說不清楚。
從1997年到1999年,HTML的版本從3.2到4.0到4.01,經(jīng)歷了非?斓陌l(fā)展。問題是到了4.01的時(shí)候,W3C的認(rèn)識(shí)發(fā)生了倒退,他們說“好了,這個(gè)版本就這樣了,HTML也就這樣了;HTML 4.01是HTML的最后一個(gè)版本了,我們用不著HTML工作組了。”
W3C并沒有停止開發(fā)這門語(yǔ)言,只不過他們對(duì)HTML不再感興趣了。在HTML 4.01之后,他們提出了XHTML 1.0。雖然聽起來(lái)完全不同,但XHTML 1.0與HTML 4.01其實(shí)是一樣的。我的意思是說,從字面上看這兩個(gè)規(guī)范的內(nèi)容是一樣的,詞匯表是一樣的,所有的元素是一樣,所有的屬性也都是一樣的。唯一一點(diǎn)不同之處,就是XHTML 1.0要求使用XML語(yǔ)法。也就是說,所有屬性都必須使用小寫字母,所有元素也必須使用小寫字母,所有屬性值都必須加引號(hào),你還得記著使用結(jié)束標(biāo)簽,記著對(duì)img和br要使用自結(jié)束標(biāo)簽。
從規(guī)范本身的內(nèi)容來(lái)看,實(shí)際上是相同的,沒有什么不同。不同之處就是編碼風(fēng)格,因?yàn)閷?duì)瀏覽器來(lái)說,讀取符合HTML 4.01、HTML 3.2,或者XHTML 1.0規(guī)范的網(wǎng)頁(yè)都沒有問題,對(duì)瀏覽器來(lái)說這些網(wǎng)頁(yè)都是一樣的,都會(huì)生成相同的DOM樹。只不過人們會(huì)比較喜歡XHTML 1.0,因?yàn)椴簧偃苏J(rèn)同它比較嚴(yán)格的編碼風(fēng)格。
到了2000年,Web標(biāo)準(zhǔn)項(xiàng)目(Web Standards Project)的活動(dòng)開展得如火如荼,開發(fā)人員對(duì)瀏覽器里包含的那些亂七八糟的專有特性已經(jīng)忍無(wú)可忍了。大家都很生氣,就罵那些瀏覽器廠商“遵守個(gè)規(guī)范就他媽的真有那么難嗎?”當(dāng)時(shí)CSS有了長(zhǎng)足的發(fā)展,而且與XHTML 1.0結(jié)合得也很緊密,CSS加XHTML 1.0基本上就可以算是“最佳實(shí)踐”了。雖然在我看來(lái)HTML 4.01與XHTML 1.0沒有本質(zhì)上的不同,但大家都接受了。專業(yè)的開發(fā)人員能做到元素全部小寫,屬性全部小寫,屬性值也全部加引號(hào):由于專業(yè)人員起到了模范帶頭作用,越來(lái)越多的人也都開始支持這種語(yǔ)法。
我就是一個(gè)例子!過去的10年,我一直都使用XHTML 1.0文檔類型,原因是這樣一來(lái)驗(yàn)證器就能給我?guī)蜕虾艽蟮拿Γ瑢?duì)不對(duì)?只要我寫的是XHTML 1.0,然后用驗(yàn)證器測(cè)試,它就能告訴我是不是忘了給屬性值加引號(hào),是不是沒有結(jié)束某個(gè)標(biāo)簽,等等等等。而如果我寫的是HTML 4.01,同樣的問題就變成了有效的了,驗(yàn)證器就不一定會(huì)提醒我了。
這就是我一直使用XHTML 1.0的原因。我估計(jì)很多人都……使用XHTML 1.0的朋友,請(qǐng)把手舉起來(lái)。好的。HTML 4.01呢?人少多了。一直沒有舉手的呢,大聲點(diǎn),你們用什么?HTML5,也很好!更早的呢,還有人使用更早的文檔類型嗎?沒有了?
10年來(lái)我一直使用XHTML 1.0,就是因?yàn)轵?yàn)證器能夠真正幫到我。有人用XHTML 1.1嗎?你知道有人用嗎?請(qǐng)舉手,別放下。有人把網(wǎng)頁(yè)標(biāo)記為XML文檔嗎?有嗎?那你們使用的就不是XHTML 1.1。
這就是個(gè)大問題。XHTML 1.0之后是XHTML 1.1,只是小數(shù)點(diǎn)后面的數(shù)字加了一個(gè)1,而且從詞匯表的角度看,規(guī)范本身沒有什么新東西,元素也都相同,屬性也都相同。但對(duì)XHTML 1.1來(lái)說,唯一的變化是你必須把自己的文檔標(biāo)記為XML文檔。在使用XHTML 1.0的時(shí)候,還可以把文檔標(biāo)記為HTML,而我們也正是這樣做的,否則把文檔標(biāo)記為XML沒準(zhǔn)真會(huì)把人逼瘋的。
為什么這么說呢?首先,把文檔標(biāo)記為XML后,Internet Explorer不能處理。當(dāng)然,IE9是可以處理了?峙掠腥藭(huì)講“真是太可愛了”,他們到現(xiàn)在居然都沒有忘了這件事。這艘船終于靠岸了!不過那時(shí)候,作為全球領(lǐng)先的瀏覽器,IE無(wú)法處理接收到的XML文檔類型的文檔,而規(guī)范又要求你以XML文檔類型來(lái)發(fā)送文檔,這不把人逼瘋才怪呢。
所以說XHTML 1.1有點(diǎn)脫離現(xiàn)實(shí),而你不想把文檔以XML格式發(fā)送給那些能夠理解XML的瀏覽器,則是因?yàn)閄ML的錯(cuò)誤處理模型。XML的語(yǔ)法,無(wú)論是屬性小寫,元素小寫,還是始終要給屬性值加引號(hào),這些都沒有問題,都很好,事實(shí)上我也喜歡這樣做,但XML的錯(cuò)誤處理模型卻是這樣的:解析器如果遇到錯(cuò)誤,停止解析。規(guī)范里就是這么寫的。如果你把XHTML 1.1標(biāo)記為XML文檔類型,假設(shè)你用Firefox打開這個(gè)文檔,而文檔中有一個(gè)和號(hào)(&)沒有正確編碼,就算整個(gè)頁(yè)面中就這一處錯(cuò)誤,你看到的也將是黃屏,瀏覽器死掉了。Firefox會(huì)說:“沒戲了,頁(yè)面中有一個(gè)錯(cuò)誤,你看不到這個(gè)網(wǎng)頁(yè)了。”根據(jù)XML規(guī)范,這樣處理是正確的,對(duì)Firefox而言,遇到錯(cuò)誤就停止解析,并且不呈現(xiàn)其他任何內(nèi)容是嚴(yán)格按照XML規(guī)范做的。因?yàn)樗皇荋TML,HTML根本就沒有錯(cuò)誤處理模型,但根據(jù)XML規(guī)范,這樣做沒錯(cuò)。
這就是為什么你不會(huì)把文檔標(biāo)記為XML的另一個(gè)原因。接下來(lái),新的版本是XHTML 2,大家注意后面沒有日期,因?yàn)檫@個(gè)規(guī)范并沒有完成。
現(xiàn)在就說說XHTML 2,我很愿意把問題說清楚,XHTML 2實(shí)際上真是一個(gè)非常非常好的規(guī)范,確實(shí)非常好……從理論的角度來(lái)說。我的意思是說,制定這個(gè)規(guī)范的人都是非常非常有頭腦的。直說吧,領(lǐng)導(dǎo)制定這個(gè)規(guī)范的家伙是斯蒂芬·彭伯頓(Stephen Pemberton),他應(yīng)該是本地人,是一個(gè)聰明過人的家伙。規(guī)范本身也很了不起,如果所有人都同意使用的話,也一定是一個(gè)非常好的格式。只不過,還不夠?qū)嶋H。
首先,XHTML 2仍然使用XML錯(cuò)誤處理模型,你必須保證以XML文檔類型發(fā)送文檔;這一點(diǎn)不言自明:沒人愿意這樣做。其次,XHTML 2有意不再向后兼容已有的HTML的各個(gè)版本。他們甚至曾經(jīng)討論過廢除img元素,這對(duì)每天都在做Web開發(fā)的人來(lái)說確實(shí)有點(diǎn)瘋了的味道。但我們知道,他們之所以這樣做,理論上確實(shí)有充足的理由——使用object元素可能會(huì)更好。
因此,無(wú)論XHTML 2在理論上是多么完美的一種格式,但卻從未有機(jī)會(huì)付諸實(shí)踐。而之所以難以將其付諸實(shí)踐,就是因?yàn)橄衲阄疫@樣的開發(fā)人員永遠(yuǎn)不會(huì)支持它,它不向后兼容。同樣,瀏覽器廠商也不會(huì),瀏覽器廠商必須要保證向后兼容。
為什么XHTML 1.1沒有像XML那樣得到真正廣泛地應(yīng)用,為什么XHTML 2從未落到實(shí)處?因?yàn)樗`反了一條設(shè)計(jì)原理,這條設(shè)計(jì)原理就是著名的伯斯塔爾法則(Postel’s Law)。大家都知道:
發(fā)送時(shí)要保守;接收時(shí)要開放。
沒錯(cuò),接收的時(shí)候要開放,而這也正是Web得以構(gòu)建的基礎(chǔ)。開發(fā)瀏覽器的人必須敞開胸懷,接收所有發(fā)送給瀏覽器的東西,因?yàn)樗鼈冞^去一直都在接收那些不夠標(biāo)準(zhǔn)的東西,對(duì)不對(duì)?Web上的很多文檔都不規(guī)范,但那正是Web發(fā)展的動(dòng)力。從某種角度講,Web走的正是一條混沌發(fā)展之路,雖然混沌,但卻非常美麗誘人。在Web上,格式不規(guī)范的文檔隨處可見,但那又怎樣呢?如果所有人都能夠?qū)懗鼍珳?zhǔn)的XML,所有文檔的格式都十分正確,那當(dāng)然好了?墒牵遣滑F(xiàn)實(shí),F(xiàn)實(shí)是伯斯塔爾法則。
作為專業(yè)人士,在發(fā)送文檔的時(shí)候,我們會(huì)盡量保守一些,盡量采用最佳實(shí)踐,盡量確保文檔格式良好。但從瀏覽器的角度說,它們必須以開放的姿態(tài)去接收任何文檔。
有人可能會(huì)說XML有錯(cuò)誤處理模型,XHTML 1.1和XHTML 2都使用該模型,但那個(gè)錯(cuò)誤處理模型太苛刻了。它絕對(duì)不符合接收時(shí)開放這個(gè)法則,遇到一個(gè)錯(cuò)誤就停止解析怎么能叫開放呢?我們只能說它與健壯性法則(也就是伯斯塔爾法則)是對(duì)立的。
出處:
責(zé)任編輯:bluehearts
上一頁(yè) HTML5設(shè)計(jì)原理 [2] 下一頁(yè) HTML5設(shè)計(jì)原理 [4]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|