避免不必要的復(fù)雜性
下面我就給大家介紹一些這份文檔中記載的設(shè)計原理。第一個,非常簡單:避免不必要的復(fù)雜性。好像很簡單吧。我用一個例子來說明。
假設(shè)我使用HTML 4.01規(guī)范,我打開文檔,輸入doctype。這里有人記得HTML 4.01的doctype嗎?好,沒有,我猜沒有。除非……我的意思是說,你是傻冒,F(xiàn)場恐怕真有人背過,這就是HTML 4.01的doctype:
<!DOCTYPE html PUBLIC "-//W3C/DTD HTML 4.01//EN" "
我不記這個兩行代碼,不然還要記事本、要Google、要模板有什么用呢?
要是我使用XHTML 1.0呢,這個規(guī)范我都已經(jīng)用了10年了。有誰記得住這個doctype嗎?沒錯,它的長度跟HTML 4.01的差不太多:
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "
是不是,基本上相同。它要告訴瀏覽器的是:這個文檔是XHTML 1.0的文檔。那么在HTML 5中,省掉不必要的復(fù)雜性,doctype就簡化成了:
<!DOCTYPE html>
僅此而已。好了,就連我也能過目不忘了。我用不著把這幾個字符記在記事本里了。我得說,在我第一次看到這個doctype的時候——我當(dāng)然以為這是一個HTML文檔的doctype——被它嚇了一跳:“是不是還少一個數(shù)字5。俊蔽倚睦锵耄骸斑@個doctype想告訴瀏覽器什么呢?就說這個文檔是HTML嗎?難道這是有史以來唯一一個HTML版本嗎,這件事我得首先搞清楚,HTML今后永遠(yuǎn)不會再有新版本了嗎?”好一副唯我獨尊的架式!我錯了,因為這個doctype并沒有這個意思。為此,必須先搞清楚為什么文檔一開頭就要寫doctype。它不是寫給瀏覽器看的。Doctype是寫給驗證器看的。也就是說,我之所以要在文檔一開頭寫那行XHTML 1.0的doctype,是為了告訴驗證器,讓驗證器按照該doctype來驗證我的文檔。
瀏覽器反倒無所謂了。假設(shè)我寫的是HTML 3.2文檔,文檔開頭寫的是HTML 3.2的doctype。而在文檔中某個地方,我使用了HTML 4.01中才出現(xiàn)的一個元素。瀏覽器會怎么處理這種情況?它會因為這個元素出現(xiàn)在比doctype聲明的HTML版本更晚的規(guī)范中,就不解釋呈現(xiàn)該元素嗎?不會,當(dāng)然不會!它照樣會解釋呈現(xiàn)該元素,別忘了伯斯塔爾法則,別忘了健壯性。瀏覽器在接收的時候必須要開放。因此,它不會檢查任何格式類型,而驗證器會,驗證器才關(guān)心格式類型。這才是存在doctype的真正原因。
而按照HTML5的另一個設(shè)計原理,它必須向前向后兼容,兼容未來的HTML版本——不管是HTML6、HTML7,還是其他什么——都要與當(dāng)前的HTML版本,HTML5,兼容。因此,把一個版本號放在doctype里面沒有多大的意義,即使對驗器證也一樣。
剛才,我說doctype不是為瀏覽器寫的,這樣說大多數(shù)情況下沒有問題。在有一種情況下,你使用的doctype會影響到瀏覽器,相信在座諸位也都知道。但在這種情況下,Doctype并非真正用得其所,而只是為了達(dá)到某種特殊的目的才使用doctype。當(dāng)初微軟在引入CSS的時候,走在了標(biāo)準(zhǔn)的前頭,他們率先在瀏覽器中支持CSS,也推出了自己的盒模型——后來標(biāo)準(zhǔn)發(fā)布了,但標(biāo)準(zhǔn)中使用了不一樣的盒模型。他們怎么辦?他們想支持標(biāo)準(zhǔn),但也想向后兼容自己過去推出的編碼方式。他們怎么知道網(wǎng)頁作者想使用標(biāo)準(zhǔn),還是想使用他們過去的方式?
于是,他們想出了一個非常巧妙的主意。那就是利用doctype,利用有效的doctype來觸發(fā)標(biāo)準(zhǔn)模式,而不是兼容模型(quiks mode)。這個主意非常巧妙。我們今天也都是這樣在做,在我們向文檔中加入doctype時,就相當(dāng)于聲明了“我想使用標(biāo)準(zhǔn)模式”,但這并不是發(fā)明doctype的本意。這只是為了達(dá)到特殊的目的在利用doctype。
下面我出一道有獎?chuàng)尨痤},聽好:“一分鐘后開始,如果你手快的話,第一個在文檔前面寫完doctype html,然后我用Internet Explorer打開你的文檔,會觸發(fā)它的標(biāo)準(zhǔn)模式,還是會觸發(fā)它的兼容模式?”
答案是,這是在Internet Explorer中觸發(fā)標(biāo)準(zhǔn)模式的最少字符數(shù)目。我認(rèn)為這也說明了HTML5規(guī)范的本質(zhì):它不追求理論上的完美。HTML5所體現(xiàn)的不是“噢,給作者一個簡短好記的doctype不好嗎?”,沒錯,簡短好記是很好,但如果這個好記的doctype無法適應(yīng)現(xiàn)有的瀏覽器,還不如把它忘了更好。因此,這個平衡把握得非常好,不僅理論上看是個好主意——簡短好記的doctype,而且實踐中同樣也是個好主意——仍然可以觸發(fā)標(biāo)準(zhǔn)模式。應(yīng)該說,Doctype是一個非常典型的例子。
還有一個例子,同樣可以說明規(guī)范是如何省略不必要的復(fù)雜性,避免不必要的復(fù)雜性的。如果前面的文檔使用的是HTML 4.01,假設(shè)我要指定文檔的字符編碼。理想的方式,是通過服務(wù)器在頭部信息中發(fā)送字符編碼,不過也可以在文檔這個級別上指定:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
同樣,我也不會把這行代碼背下來。我還想省下自己的腦細(xì)胞去記點別的更有價值的東西呢。不過,如果我想指定文檔使用UTF-8編碼,只能添加這行代碼。這是在HTML 4.01中需要這樣做。要是你在XHTML 1.0指定同樣的編碼,就得多敲一下鍵盤,因為你還得聲明meta元素位于一個開始的XML標(biāo)簽中。
<?xml version="1.0" encoding="UTF-8" ?> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
在HTML5中,你要敲的字符只有:
<meta charset="utf-8">
簡短好記。我能背下來。
同樣,這樣寫也是有效的。它不僅適用于最新版本的瀏覽器,只要是今天還有人在用的瀏覽器都同樣有效。為什么?因為在我們把這些meta元素輸入瀏覽器時,瀏覽器會這樣解釋它:“元數(shù)據(jù)(meta)點點點點點,字符集(charset)utf-8。”這就是瀏覽器在解釋那行字符串時真正看到的內(nèi)容。它必須看到這些內(nèi)容,根據(jù)就是伯斯塔爾法則,對不對?
我多次提到健壯性原理,但總有人不理解。我們換一種說法,瀏覽器會想“好,我覺得作者是想要指定一個字符集……看,沒錯,utf-8。”這些都是規(guī)范里明文規(guī)定的。如今,不僅那個斜杠可以省了,而且總共只要寫meta charset=”utf-8″就行了。
關(guān)于省略不必要的復(fù)雜性,或者說避免不必要的復(fù)雜性的例子還有不少。但關(guān)鍵是既能避免不必要的復(fù)雜性,還不會妨礙在現(xiàn)有瀏覽器中使用。比如說,在HTML5中,如果我使用link元素鏈接到一個樣式表,我說了rel=”stylesheet”,然后再說type=”text/css”,那就是重復(fù)自己了。對瀏覽器而言,我就是在重復(fù)自己。瀏覽器用不著同時看到這兩個屬性。瀏覽器只要看到rel=”stylesheet”就夠了,因為它可以猜出來你要鏈接的是一個CSS樣式表。所以就不用再指定type屬性了。你不是已經(jīng)說了這是一個樣式表了嘛;不用再說第二次了。當(dāng)然,愿意的話,你可以再說;如果你想包含type屬性,請便。
同樣地,如果你使用了script元素,你說type=”text/javascript”,瀏覽器差不多就知道是怎么回事了。對Web開發(fā)而言,你還使用其他的腳本語言嗎?如果你真想用其他腳本語言,沒人會阻攔你。但我要奉勸你一句,任何瀏覽器都不會支持你。
愿意的話,你可以添加一個type屬性。不過,也可以什么都不寫,瀏覽器自然會假設(shè)你在使用JavaScript。避免-不必要的-復(fù)雜性。
出處:
責(zé)任編輯:bluehearts
上一頁 HTML5設(shè)計原理 [4] 下一頁 HTML5設(shè)計原理 [6]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|