web瀏覽器就是簡單地操作系統(tǒng)
在 HTML中嵌入javascript
- 內(nèi)鏈嵌入蚯涮,放置在script標(biāo)簽中
- 放置在由script標(biāo)簽的src屬性指定的外部文件
- 放置在HTML事件處理程序中眯娱,該事件處理程序由onclick或onmouseover這樣的HTML屬性值指定
- 放在一個URL里啤它,這個URL使用特殊的"javascript:"協(xié)議
后兩種不常使用
使用外部文件的優(yōu)勢
- 有益于保持內(nèi)容和行為的分離,從而簡化HTML文件
- 對于公用一個javascript文件的HTML來說糟把,只需要維護(hù)一份代碼即可袜炕。
- 公用一個javascript文件的HTML來說麻诀,在客戶端加載時只需要加載一次锭吨,之后使用緩存蠢莺。
- src屬性值可以是任意的URL,因此來自一個web服務(wù)器的javascript程序或web頁面可以使用由另一個web服務(wù)器提供的代碼零如。
URL中的javascript
URL后面跟一個javascript:協(xié)議限定符躏将,是另一種嵌入javascript代碼到客戶端的方式。這種協(xié)議類型指定URL內(nèi)容為任意字符串考蕾,這個字符串是會被javascript解釋器運(yùn)行的javascript代碼祸憋。他會被當(dāng)做一行代碼對待,因此語句間需使用分號肖卧。
javascript:url能識別的“資源”是轉(zhuǎn)換成字符串的執(zhí)行代碼的返回值蚯窥。該種方式可以使用在任何href的地方。部分瀏覽器會執(zhí)行URL中的代碼喜命,并使用返回的字符串作為帶顯示新文檔的內(nèi)容。其他瀏覽器不允許URL像上面一樣覆蓋當(dāng)前文檔內(nèi)容河劝,他們會忽略代碼的返回值壁榕。
同步、異步和延遲腳本
腳本的執(zhí)行只在默認(rèn)情況下是同步和阻塞的赎瞎。
defer和async屬性都在高速瀏覽器連接進(jìn)來的腳本不會使用document.write()牌里,也不會生成文檔內(nèi)容,因此瀏覽器可以在下載腳本時繼續(xù)解析和渲染文檔务甥。
ascyn屬性是得瀏覽器可以盡快執(zhí)行腳本牡辽,而不用在下載腳本時阻塞文檔的解析。
defer屬性會使瀏覽器延遲腳本的執(zhí)行敞临,直到文檔的在載入和解析完成态辛。
如果同時使用兩個屬性,瀏覽器會遵照async屬性忽略defer挺尿。
javascript單線程模式
HTML5 定義了一種并發(fā)的控制方式奏黑,叫做web worker,運(yùn)行在web worker線程里的代碼不能訪問文檔內(nèi)容编矾,不能和主線程或其他worker共享狀態(tài)熟史,只能和主線程和其他worker通過異步事件進(jìn)行通信,所以主線程不能檢測并發(fā)性窄俏。
javascript 時間線
- 瀏覽器創(chuàng)建document對象蹂匹,解析web頁面,把element對象中文本節(jié)點渲染到dom中凹蜈,這個階段 document.readystate = 'loading'限寞。
2.同步加載的script元素忍啸,把元素添加到文檔中,執(zhí)行內(nèi)部或外部腳本昆烁,并且在腳本下載和執(zhí)行時解析器會暫停吊骤,這樣腳本就可以用document.write()來把文本輸入到輸入流中。同步script會看見自己和他們之前的文檔內(nèi)容静尼。
3.遇到異步script開始下載腳本白粉,并繼續(xù)解析文檔。腳本會在他下載完成后盡快執(zhí)行鼠渺,但是解析器沒有停下來等他下載鸭巴。一步腳本禁止使用document.write()方法。
4.文檔解析完成 document.readyState='interactive'
5.defer腳本在這里按出現(xiàn)順序執(zhí)行拦盹,異步腳本可能也會在這個時間執(zhí)行鹃祖,延遲腳本能訪問文檔樹,禁止使用write()方法
6.瀏覽器觸發(fā)DOMContentLoad事件普舆,同步執(zhí)行過渡到異步事件階段恬口。
7.文檔解析完成,瀏覽器等待其他內(nèi)容載入沼侣,如圖片祖能。所有內(nèi)容完成載入,一步腳本完成載入或執(zhí)行蛾洛,document.readyState 屬性改為complete养铸,web瀏覽器觸發(fā)window對象上load事件
8.此時起,會調(diào)異步事件轧膘。
同源策略以及跨域方案
使用jsonp進(jìn)行g(shù)et方式的跨域請求钞螟,更多移步文章
設(shè)置domain實現(xiàn)跨域
默認(rèn)情況下屬性domain存放的是載入服務(wù)器的主機(jī)名,可以設(shè)置這一屬性谎碍,不過使用的字符串必須又有效的域前綴或他本身鳞滨。domain值中必須有一個點號,不能設(shè)置為頂級域名蟆淀。
如果兩個窗口包含的腳本把domain設(shè)置成相同的值太援,那么這兩個窗口不受同源策略的約束,可以互相讀取對方的屬性扳碍。
修改請求頭部
服務(wù)器用頭信息顯示的列出可以訪問的源提岔。但是該種方式由后端設(shè)置。
跨文檔消息(cross-documnet messaging )
調(diào)用window對象上的postMessage方法笋敞,可以異步傳遞消息事件到窗口的文檔里碱蒙。之后使用onmessage事件處理程序函數(shù)來處理它。