Writing forward-compatible websites
éåé é¢å°è§£éå¦ä½æ°å¯«å¨æ°çç覽å¨çæ¬ç¼å¸æä¸æé忝æçç¶²é ã
éå°å §é¨ç¶²è·¯åå ¶ä»éå ¬å ±ç¶²ç«å°¤å ¶éè¦ï¼å¦ææåä¸è½çå°ä½ çåå§ç¢¼ï¼æåå°ç¡æ³çå°å®æ¯å¦å·²é忝æãåºä¸ææå°çååå¯è½ç¡æ³å ¨æ¸åå°ï¼ä½ç¡å¯è½éµå®éäºååï¼å°æ¼ä½ çç¶²ç«å¨æªä¾ç¼å±ç¶è·ä¸ææå¹«å©ã
JavaScript
>以ãwindow.ãå綴修飾ææååæ¼ onfoo 屬æ§çå
¨åè®æ¸
ç¶ä¸åäºä»¶èçå¨å
§å®¹å±¬æ§ï¼ä¾å¦ï¼onclick, onmouseover ççï¼è¢«ä½¿ç¨å¨ HTML çå
ç´ ä¸æï¼ææå°æ¼å±¬æ§å
§åç¨±çæ¥æ¾é¦å
ç¼çå¨å
ç´ æ¬èº«ï¼è¥å
ç´ çºè¡¨å®æ§å¶é
ï¼åä¾å°æ¾å
ç´ ç表å®ï¼æ¥èæ¯ documentï¼æå¾æ¯ windowï¼ä½ å®ç¾©å
¨åè®æ¸çå°æ¹ï¼ãä¾å¦ï¼å¦æä½ æé樣çåå§ç¢¼ï¼
<div onclick="alert(ownerDocument)">黿ä¸ä¸</div>
å¨é»é¸æåæï¼div ä¸ç ownerDocument æè¢«æç¤ºï¼å³ä½¿æ¯å¨å ¨åç¯åå §å®£å var ownerDocument éç¨®æ æ³ä¾ç¶æç¼çã
éæå³èï¼ç¡è«ä½ 使å¨äºä»¶èçå¨å §å®¹å±¬æ§ååäºä¸åå ¨åè®æ¸ï¼å æ¬å¼å«ä»»ä½å ¨å彿¸ï¼ç¶è¦æ ¼ä¸æ°å¢äºåä½ è®æ¸æå½å¼ååç DOM 屬æ§å°å ç´ ææä»¶ä¹ä¸ï¼å¨ç覽å¨å¯¦ä½ä¹å¾ï¼å°±æç¢çå稱è¡çªãéæä½ çå½å¼å°çªç¶è¢«åæ¢å¼å«ãéç¨®æ æ³å¨ HTML5 çç¼å±ä¹ä¸ï¼å¤æ¬¡å¨ä¸åç¶²ç«ä¸ç¼çã
çºäºé¿å éç¨®æ æ³ï¼ä»¥ window ä¾éå®å ¨åè®æ¸çååï¼ä¾å¦ï¼
<script>
function localName() {
alert("å½å¼ localName 被å¼å«äº");
}
</script>
<div onclick="window.localName()">æä¸ä¸æè·åºä¸åæç¤ºè¨æ¯</div>
ä¸è¦ç´æ¥éå éä½ è½æ§å¶çè ³æ¬
"use strict;" æä»¤å¨ ECMAScript 裡ï¼ä½¿ç¨æ¼æªæ¡å±¤ç´æé©ç¨æ¼æªæ¡çææç¨å¼ç¢¼ãå æ¤ï¼è¥å°å決éå´æ ¼æ¨¡å¼è¡çºçè
³æ¬ï¼ç´æ¥éå å°è¦æ±å´æ ¼æ¨¡å¼çè
³æ¬æå°è´ä¸æ£å¸¸çè¡çºã
è¦æ± JavaScript å½å¼åº«çä½è éµå®éäºè¦å
åä½ åæ¡çå½å¼åº«éç¼è å建è°ä»åéµå¾ªéäºè¦ç¯ï¼å¦åä½ ç¡æ³ç¢ºä¿æªä¾éäºå½å¼åº«è½å¦ä¾èæ£å¸¸éä½ãå¯æçæ¯å½å¼åº«å¾å¾éåéäºæºåã
嵿¸¬
>嵿¸¬ç¹å®åè½æ¯æ´
å¦æä½ æç®ä½¿ç¨æäºåè½ï¼ç¡å¯è½ä½¿ç¨ç©ä»¶åµæ¸¬ä¾åµæ¸¬åè½æ¯å¦æ¯æ´ãç°¡å®ä¾èªªï¼ä¸è¦åè¨åªè¦ "filter" in body.style æ¸¬è©¦çµæçº true çç覽å¨å¿
宿¯ Microsoft Internet Explorerï¼é²èæåä¸å®ææ window.event ç©ä»¶æä¾äºä»¶èçå¨ãä¸è¦åè¨ä¸åææç¹å® DOM åè½çç覽å¨ä¸å®ä¹æå¦å¤ä¸å DOM åè½ï¼ç¹å¥æ¯éæ¨æºåè½ï¼ï¼æèåéä¾åè¨ä¸å®ä¸ææ¯ææäºåè½ï¼ä¾å¦ï¼åè¨å¨è
³æ¬å
ç´ ä¸æ¯æ´ onload çç覽å¨ä¸å®ä¸ææ¯æ´ onreadystatechangeï¼ãé¨èç覽å¨åæ´åä»åçè¡çºï¼å®åæåææ°å¢ååªé¤è¨±å¤åè½ä¸¦ä¿®æ£é¯èª¤ãéå»å³æ¯å¦æ¤ï¼æªä¾ä¹å°æå¦æ¤ã
æä»¥ï¼å¨åµæ¸¬ç¹å®åè½æï¼ä¸è¦æ¥èåå®ãåªè¦æååè½æ¯æ´èå¦ï¼å¦å¤ä¸æ¨£åè½å°±ä¸å®æ¯æ´èå¦ãã
å¥å UA 嵿¸¬
éå°±æ¯åè¨ä¸é åè½åå¨ï¼User Agent ä¸å å«ç¹å®çåå ï¼æï¼å¿ 宿åªäºæ±è¥¿å¯ç¨æä¸å¯ç¨ç常è¦å¯¦ä¾ã
å¦æä½ ä¸å¾ä¸å UA 嵿¸¬ï¼å éå°éå»çç覽å¨çæ¬
å¦æä½ éæ¯å¾è¨´è«¸ UAï¼User Agentï¼åµæ¸¬ï¼è«åªéå°ç¹å®ç覽å¨çéå»çæ¬é²è¡åµæ¸¬ãé¦å ï¼å°æ¼æªç¥çãææ¸¬è©¦ç覽å¨çç®åèæªä¾çæ¬å·è¡é è¨çç¨å¼å §å®¹ãæ¥èå¦æç¡æ³éé嵿¸¬ï¼æ¾åºéå»ç覽å¨çæ¬ä¸é è¨ç¨å¼å §å®¹ä¸ç¡æ³ä½¿ç¨çåè½ï¼å°±å¯ä»¥éé嵿¸¬ç¹å®ç覽å¨çéå»çæ¬ä¾è¿½å å°æçä¿®æ£ã
å¨éåææ¡ä¸ï¼ãç®åççæ¬ãææä½ æè½æ¸¬è©¦å°çææ°çæ¬ãå¦æä½ çé è¨ç¨å¼å §å®¹å¨ Firefox Aurora ä¸å¯ä»¥æ£å¸¸éä½ï¼èå¨ Beta åææ°éåºçä¸åå¨åé¡èç¡æ³éä½ï¼æ¤æä½ å¯ä»¥å°ä½ ææ¸¬è©¦ä¸ç Firefox Aurora çæ¬æ¨çºãç®åççæ¬ãï¼å° Beta 以åççæ¬é½è¦çºãéå»ççæ¬ãï¼å³ä½¿å®åéæ²æè¢«æ£å¼éåºçµ¦å¤§ç¾ã
ä¸è¦çºäºä¸åçç覽å¨è¨è¨å¤é¤çå°æç¨å¼
ç¶ä½ æç¨çä¸é¨åç¨å¼å §å®¹å¯è½å¨ææç覽å¨é½è½é使ï¼å¥é¨ä¾¿ééç©ä»¶æ UA 嵿¸¬ä¾æ±ºå®å·è¡ä¸åçç¨å¼ç¢¼ãç覽å¨å¾æå¯è½æ¹è®å®åçè¡çºä¸¦äºç¸æ´åï¼è¥ä½ ä»»æååºä¸åçæ¿ä»£ç¨å¼ï¼ä½ çç¶²ç«å°æå¯è½ææå£ã
測試
>測試ææä¸»æµå¼æ
è³å°å¨ FirefoxãChrome æ Safariï¼å çºå ©è é½åºæ¼ç¸åç WebKit 弿ï¼ãOpera å Internet Explorer æ¸¬è©¦ä½ çç¨å¼ç¢¼ãè¥éµå¾ªä»¥ä¸ååï¼ä½ æä¸åå®ä¸çç¨å¼ç¢¼å §å®¹å¨ç®åææçåæªç¥çç覽å¨é½æ¸¬è©¦éï¼å¨ææä¸»è¦å¼æé½è½éä½ä¸ï¼æ¥µæå¯è½è¡¨ç¤ºä½ çç¨å¼ç¢¼å°ä¸æå¨æªä¾è¢«ç ´å£ã
ææä¸åç覽å¨å°ç¹å®åè½ç實ä½ä¸ç¡ç¸åãå¦æä½ æä¸åå®ä¸çç¨å¼ç¢¼å §å®¹ï¼å¨ææå¸¸ç¨ç弿ä¸é½æ²åé¡ï¼éå¯è½è¡¨ç¤ºï¼ä½ 使ç¨äºåç覽å¨éå·²ç¶æ´åçè¡çºï¼æè使ç¨äºå°æªæ´åï¼èç¨å¼ç¢¼ç¡é弿çè¡çºæ¨æºæå æçé¨ä»½ã
ç¹å®çè¦½å¨æ¯æ´çåè½ååç¶´
>å¥éå°ç®åææªä¾çç覽å¨çæ¬åè¨ææ¹æ¡
é忝ä¸å常è¦ç實ä¾ï¼åè¨ç®åç覽å¨èè²ä¹éçéè¯æ§å¯ä»¥ä»£è¡¨æªä¾ä¹æç¹¼çºææå¦æ¤çéè¯ãéå°èç覽å¨ï¼å¦æä½ ç¨åè¨ææ¹æ¡çèè²å¨ç®åçç覽å¨å·²ç¶ä¸åå¨ï¼é£éå°èç覽å¨å¥ç¨æ¹æ¡æ²æåé¡ï¼åªéå°èç覽å¨ä¸ï¼ä¸æ¦ç覽å¨ä¿®æ£äº X èè²ï¼ä½ å¯ä»¥è¯å®ææå ·æèè² X çç覽å¨é½æèè² Yï¼å æ¤ä½¿ç¨èè² X çåå¨ä¾éå°èè² Y çåé¡åè§£å¥ã
è·ä¹å UA 嵿¸¬ä¸ç建è°ä¸æ¨£ï¼ãç®åççæ¬ãææä½ æè½æ¸¬è©¦å°çææ°çæ¬ã
é¿å ä¾è³´æ°æ½®ç鿍æºåè½
å°±ç®å äºåç¶´ï¼ä½¿ç¨æ°æ½®çåè½ä¾è鿝å¾å±éªï¼é¨èè¦æ ¼çç¼å±ï¼ç覽å¨åç¶´ç實ä½ä¹æéµå¾ªææ°çè¦ç¯èæ¹è®ã䏿¦åè½è¢«æ¨æºåï¼å«åç¶´ççæ¬æå¯è½æè¢«åªé¤ã
ç覽å¨éç¼è æä¾åç¶´è鿍æºåè½çµ¦ä½ æ¯çºäºå¯¦é©åæè¦åé¥ï¼èéè®ä½ å°éäºé ·ç©ææ£ä½åºå»ãå¦æä½ é¸æä½¿ç¨å®åï¼è«æºåç¶å¸¸æ´æ°ä½ çç¶²ç«ä»¥è¶ä¸è®åã
ç¶ä½¿ç¨æªæ®é實ä½ï¼å³ä½¿æ¯æ¨æºï¼çæ°æ½®åè½æï¼è¨å¾æ¸¬è©¦åæ´æ¹æ¡
è¦æª¢æ¥å¨æªå¯¦ä½æç¨åè½çç覽å¨ä¸çè¦½ç¶²é æç¼çä»éº¼äºï¼å°¤å ¶æ¯ä½ å¨å·¥ä½æä¸æç¶å¸¸ä½¿ç¨çç覽å¨ã
é¤ééå°é廿åé¡ççæ¬ï¼ä¸è¦ä½¿ç¨å» ååç¶´ï¼Vender-prefixï¼åè½
å» ååç¶´çåè½å¯ä»¥å¨å°ä¾ççæ¬ä¸æ¹è®ãç¶èï¼ä¸æ¦ç覽å¨å·²æä¾ä¸å¸¶åç¶´çåè½ï¼ä½ å¯ä»¥å¨ç¢ºä¿ä¸å¸¶åç¶´çå¨å¯ç¨æç¸½æè¢«å¥ç¨ä¸ï¼ä½¿ç¨åç¶´çæ¬éå°èçæ¬ãä¸åå¾å¥½çä¾åï¼åè¨-vnd å» åå·²ç¶å°ä¸å¸¶åç¶´ç make-it-pretty 屬æ§å¯¦ä½å å
¥æ°åºåçç覽å¨ï¼å
å«ä¸ååç¶´çèä¸å«åç¶´çä½ç¨ä¸åçå¼ãsometimesãï¼
<style>
.pretty-element {
-vnd-make-it-pretty: sometimes;
make-it-pretty: sometimes;
}
</style>
ä¸è¿°è¦åä¸ï¼è²æçé åºé常éè¦ï¼ç¡åç¶´è ä¸å®è¦æå¨æå¾ã
卿²æçè¦½å¨æ¯æ´åï¼ä¸è¦ä½¿ç¨ä¸å«åç¶´ç CSS å±¬æ§æ API
é¤éä¸å¸¶åç¶´ççæ¬å¾å°äºå»£æ³æ¯æï¼å ¶è¡çºå¯è½ä»æç¼çææ³ä¸å°çæ¹è®ãç¹å¥æ¯ï¼ç¶æ²æçè¦½å¨æ¯æ´ä¸å¸¶åç¶´ççæ¬æï¼å°±ä¸è¦ä½¿ç¨ä¸å¸¶åç¶´ççæ¬ãæçµçèªæ³ä¸ç¡ç¶æåä»»ä½å¸¶åç¶´çèªæ³ç¸åã
ç¨å¼ç¢¼ç¶è·
>å¥å¿äº >
ééé©èå¨å¯ä»¥ç¢ºä¿éååé¡ä¸æç¼çï¼ä½å³ä½¿ä½ çç¶²ç«æ²æå®å ¨é©èï¼ä½ ä»æç¢ºä¿ä½ ææç > åå 齿åºç¾ãå°äºå®å¯è½æè®æ¥ä¸ä¾ç Tag åç¨±è¢«ç¶æä¸ä¸å Tag æå±¬ç屬æ§ï¼èé æææ³ä¸å°ççµæãå¯è½ä¸å°æ®µæ²åé¡ï¼ä½æ¥ä¸ä¾å çºææ®µæå代表ä¸å屬æ§èå®å ¨è¢«ç ´å£ãèä¾ä¾èªªï¼ä»¥ä¸æ¯ä¸æ®µå¨ä¸æ¯æ´ HTML5 ç覽å¨ä¸å¯æ£å¸¸éä½ï¼ä½å»è®æ¯æ´ HTML5 çç覽å¨ç¡æ³æ£å¸¸éä½çç¶²é ç¨å¼ç¢¼ï¼
<form action="http://www.example.com">
<input type="submit" value="å³éæ¤è¡¨å®"
</form>
å çºå¨ input Tag çæå¾å¿äºå ä¸ >ã
奿失æç實é©åçå¨ä½ çç¶²é ç¨å¼ç¢¼è£¡
å¦æä½ æ³å試ä¸å CSS å±¬æ§æå ¶ä»çé ·æ±è¥¿ï¼ä½æ²æææï¼è«è¨å¾æ¿æãä¸ç¶ä½ ç¡æ³é ç¥éæ±è¥¿æªä¾æåä»éº¼å£äºã