Javascript 學習筆記(ch13)《犀牛書》

客戶端JavaScript

web瀏覽器中的JavaScript

一. 客戶端JavaScript

1. document

web 瀏覽器中呈現(xiàn)靜態(tài)信息的頁面叫做文檔(由于加入了JavaScript,靜態(tài)頁面的信息看上去會動來動去,但信息本身是靜態(tài)的)

2. window
  • Window 對象是所有客戶端 JavaScript 特性和 API 的主要接入點,是一個全局對象,處于作用域鏈的頂部。

  • 引用自身:window

  • Window 對象的屬性(全局變量):location 屬性(指代 Location 對象,Location 對象指定當前顯示在窗口中的URL)、document(引用 Document 對象,Document 對象表示窗口中的文檔)

window.location = "http://www.oreilly.com/";
//設置location屬性,從而跳轉到新的web頁面
  • Window 對象的方法(全局函數(shù)):alert(),setTimeout()
4. 事件處理程序
  • 事件處理程序的屬性名是以 on 開始的。
  • 為事件處理程序綁定一個函數(shù),函數(shù)會在某個事件發(fā)生時以異步的方式調用。
  • Window 對象的 onload 處理程序是最重要的事件處理程序之一。當顯示在窗口中的文檔內容穩(wěn)定并可以操作時會觸發(fā)它。
5. JavaScript的角色
  • 動態(tài) HTMLDHTMLJavaScript 程序可以通過 Document 對象和它包含的 Element 對象遍歷和管理文檔的內容。它可以通過操縱 CSS 樣式和類,修改文檔內容的呈現(xiàn)。并且可以通過注冊適當?shù)臅r間處理程序來定義文檔元素的行為。內容、呈現(xiàn)和行為的組合,叫做動態(tài) HTMLDHTML
  • Web 文檔里的 JavaScript :設計良好的文檔需要在禁用 JavaScript 后還能工作。JavaScript 用于增強用戶的瀏覽體驗,使信息的獲取和傳遞更加容易。如可通過以下方式:
  • 創(chuàng)建動畫和其他視覺效果,巧妙地引導和幫助用戶進行頁面導航;
  • 對表格的列進行分組,讓用戶更容易找到所需要的;
  • 隱藏某些內容,當用戶“深入”到內容時,再逐漸展示詳細信息。
  • Web 應用里的 JavaScriptJavaScript 訪問瀏覽器提供的高級服務(比如網絡、圖像和數(shù)據(jù)存儲),例如常見的XMLHttpRequest 對象。

二. 在 HTML 里嵌入 JavaScript

1. 內聯(lián),放置在 <script> 和 </script> 之間;
2. 放置在由 <script> 標簽的 src 屬性指定的外部文件中;(最好)
  • 可以把大塊 JavaScript 代碼從 HTML 文件中刪除,這有助于保持內容和行為的分離,從而簡化 HTML 文件。
  • 如果多個 web 頁面共用相同的 JavaScript 代碼,用 src 屬性可以讓你只管理一份代碼,而不用在代碼改變時編輯每個 HTML 文件。
  • 如果一個 JavaScript 代碼文件由多個頁面共享,就只需要下載它一次,通過使用它的第一個頁面,隨后的頁面可以從瀏覽器緩存檢索它。
  • 由于 src 屬性的值可以是任意的 URL,因此來自一個 web 服務器的 JavaScript 程序或 web 頁面可以使用由另一個 web 服務器輸出的代碼。
3. 放置在 HTML 事件處理程序中,該事件處理程序由 onclick 或 onmouseover 這樣的 HTML 屬性值指定。
4. 放置一個 URL 里,這個 URL 使用特殊的 “javascript:” 協(xié)議。

三. JavaScript 程序的執(zhí)行

1. JavaScript 程序執(zhí)行的兩個階段

第一個階段,載入文檔內容,并執(zhí)行 <script> 元素里的代碼(包括內聯(lián)腳本和外部腳本)。腳本通常會按照它們在文檔里出現(xiàn)的順序執(zhí)行。所有腳本里的 JavaScript 代碼都是從上往下,按照它在條件、循環(huán)以及其他控制語句中的出現(xiàn)順序執(zhí)行的。
文檔載入完成,并且所有腳本執(zhí)行完成后, JavaScript 執(zhí)行進入第二階段。這個階段是異步的,而且是由事件驅動的。在事件驅動階段, web 瀏覽器調用事件處理程序函數(shù)來響應異步發(fā)生的事件,調用事件處理程序通常是響應用戶輸入,還可以由網絡活動、運行時間或者 JavaScript 代碼中的錯誤來觸發(fā)。

JavaScript 是單線程執(zhí)行的,腳本和事件處理程序在同一個時間只能執(zhí)行一個,沒有并發(fā)性,這保持了 JavaScript 編程的簡單性。單線程執(zhí)行時為了讓編程更加簡單,編寫代碼時可以確保兩個事件處理程序不會同一時刻運行,操作文檔內容時也不必擔心會有其他線程試圖同時修改文檔。
單線程執(zhí)行意味著瀏覽器必須在腳本和事件句處理程序執(zhí)行的時候停止響應用戶輸入。

2. 同步、異步和延遲的腳本

當HTML解析器遇到 <script> 元素時,它默認必須先執(zhí)行腳本,然后再恢復文檔的解析和渲染。這對于內聯(lián)腳本沒什么問題,但是如果腳本源代碼時一個由 src 屬性指定的外部文件,這意味著腳本后面的文檔部分在下載和執(zhí)行腳本之前,都不會出現(xiàn)在瀏覽器中。

腳本的執(zhí)行只是在默認的情況下是同步和阻塞的。

<script> 標簽可以有 deferasync 屬性,這可以改變腳本的執(zhí)行方式。瀏覽器可以在加載腳本時繼續(xù)解析和渲染文檔。
defer 屬性使得瀏覽器延遲腳本的執(zhí)行,直到文檔的載入和解析完成,并可以操作。(先載入文檔,再執(zhí)行腳本)
aync 屬性使得瀏覽器可以盡快地執(zhí)行腳本,而不用在下載腳本時阻塞文檔解析。(同時執(zhí)行腳本和解析文檔)
如果 <script> 標簽同時有兩個屬性,同時支持兩者的瀏覽器會遵從 async 屬性并忽略 defer 屬性。
延遲的腳本會按它們在文檔里的出現(xiàn)順序執(zhí)行,而異步腳本在它們載入后執(zhí)行,這意味著它們可能會無序執(zhí)行。

3. 事件驅動的 JavaScript
  • 事件的名字:clickchange 等指示發(fā)生的事件的通用類型。
  • 事件的目標:是一個對象,并且事件就是在它上面發(fā)生的。
  • 如果想要程序響應一個事件,寫一個函數(shù),叫做“事件處理程序”“事件監(jiān)聽器”或“回調”。然后注冊這個函數(shù),這樣他就會在事件發(fā)生時調用它。
  • 注冊事件處理程序最簡單的方法是把 JavaScript 函數(shù)賦值給目標對象的屬性。
function handleResponse() {...}
request.onreadystatechange = handleResponse;
  • 事件處理程序的屬性的名字是以 on 開始,后面跟著事件的名字。還要注意在上面的任何代碼里<strong>沒有函數(shù)調用</strong>:只是把函數(shù)本身賦值給這些屬性。瀏覽器會在事件發(fā)生時執(zhí)行調用。
  • 為一個事件注冊多個事件處理程序函數(shù),大部分可以用 addEventListener() 方法,允許注冊多個監(jiān)聽器。
    ie9 之前用 attachEvent() 方法
  • 傳遞給 setTimeout() 的函數(shù)和真實事件處理程序的注冊不同,他們通常叫做“回調邏輯”而不是“處理程序”,但他們也是異步的。
4. 客戶端 JavaScript 時間線
  1. web 瀏覽器創(chuàng)建 Document 對象,并且開始解析 web 頁面,解析 HTML 元素和它們的文本內容后添加 Element 對象和 Text 節(jié)點到文檔中。在這個階段 document.readyState 屬性的值是 loading

  2. HTML 解析器遇到沒有 asyncdefer 屬性的 <script> 元素時,它把這些元素添加到文檔中,然后執(zhí)行行內或外部腳本。這些腳本會同步執(zhí)行,并且在腳本下載和執(zhí)行時解析器會暫停。這樣腳本就可以用 document.write() 來把文本插入到輸入流中。解析器恢復時這些文本會成為文檔的一部分。同步腳本經常簡單定義函數(shù)和注冊后面使用的注冊事件處理程序,但它們可以遍歷和操作文檔樹,因為在它們執(zhí)行時已經存在了。這樣,同步腳本可以看到它自己的 <script> 元素和它們之前的文檔內容。

  3. 當解析器遇到設置了 async 屬性的 <script> 元素時,它開始下載腳本文本,并繼續(xù)解析文檔。腳本會在它載入完成后盡快執(zhí)行,但是解析器沒有停下來等它下載。異步腳本禁止使用 document.write() 方法。它們可以看到自己的 <script> 元素和它之前的所有文檔元素,并且可能或者干脆不可能訪問其他的文檔內容。

  4. 當文檔完成解析, document.readystate 屬性變成 interactive

  5. 所有有 defer 屬性的腳本,會按它們在文檔里的出現(xiàn)順序執(zhí)行。異步腳本可能也會在在這個時間執(zhí)行。延遲腳本能訪問完整的文檔樹,禁止使用 document.write() 方法。

  6. 瀏覽器在 Document 對象上觸發(fā) DOMContentLoaded 事件。這標志著程序執(zhí)行從同步腳本執(zhí)行階段轉換到了異步事件驅動階段。但要注意,這時可能還有異步腳本沒有執(zhí)行完成。

  7. 這時,文檔已經完全解析完成,但是瀏覽器可能還在等待其他內容載入,如圖片。當所有這些內容完成載入時,并且所有異步腳本完成載入和執(zhí)行, document.readyState 屬性改變?yōu)?complete ,web 瀏覽器觸發(fā) Window 對象上的 load 事件。

  8. 從此刻起,會調用異步事件,以異步響應用戶輸入事件、網絡事件、計時器過期等。

四. 兼容性和互用性

  • 客戶端 JavaScript 兼容性和交互性的問題可以歸納為:
  • 演化:不同的瀏覽器、新特性
  • 未實現(xiàn):有些現(xiàn)代瀏覽器實現(xiàn)的功能在老舊瀏覽器中沒實現(xiàn)。
    同樣實現(xiàn)一個功能在不同瀏覽器中有很大差別。
  • bug:每個瀏覽器都有 bug,并且沒有按照規(guī)范準確地實現(xiàn)所有客戶端的 JavaScript API
  • 處理不兼容問題其中一種最簡單的方法是使用類庫。
  • 功能測試:
if (element.addEventListener) {
element.addEventListener("keydown",handler,false);
element.addEventListener("keypress",handler,false);
}
else if (element.attachEvent) {
element.attachEvent("onkeydown",handler);
element.attachEvent("onkeypress",handler);
}
else {
element.onkeydown = element.onkeypress = handler;
}
  • 瀏覽器測試:確定當前瀏覽器的廠商和版本的代碼通常叫做瀏覽器嗅探器或者客戶端嗅探器。
  • IE里的條件注釋
  • html里的條件注釋
<!--[if IE6]>
this content is actually inside an html comment.
it will only be displayed in IE6
<![endif]-->
<!--[if lte IE7]>
displayed by IE5,6 and 7 and earlier
<![endif]-->
<!--[if !IE]><-->
IE will not display id
<!--><![endif]-->
  • javascript 里的條件注釋:
/*@cc_on
@if (@_jscript)
alert("In IE");
@end
@*/

五. 可訪問性

  • 如果你設計的站點過于依賴 JavaScript 來呈現(xiàn)數(shù)據(jù)的話,可能會把讀屏軟件的用戶拒之門外,因為一些讀屏軟件只能在禁用JavaScript 時才會工作得更好。
  • JavaScript 的角色應該是增加信息的表現(xiàn)力,而不是負責信息的呈現(xiàn)。
  • JavaScript 可訪問性的一條重要原則是,設計的代碼即使在禁用 JavaScript 解釋器的瀏覽器中也能正常使用。

六. 安全性

  • 瀏覽器針對惡意代碼的第一條防線就是它們不支持某些功能:

  • 客戶端 JavaScript 沒有權限來寫入或刪除客戶計算機上的任意文件或列出任意目錄。

  • 客戶端 JavaScript 沒有任何通用的網絡能力。

  • 瀏覽器針對而已代碼的第二條防線是在自己支持的某些功能上施加限制,如:

  • 限制打開新窗口的功能。

  • 不允許未經用戶允許關閉用戶打開的窗口。

  • HTML FileUploadvalue 屬性是只讀的。

  • 腳本不能讀取從不同服務器載入的文檔的內容,除非這個就是包含該腳本的文檔。一個腳本不能再來自不同服務器的文檔上注冊事件監(jiān)聽器。

  • 同源策略:是對 JavaScript 代碼能夠操作哪些 web 內容的一條完整的安全限制。

  • 跨站腳本(XSS),用來表示一類安全問題,也就是攻擊者向目標 web 站點注入 html 標簽或者腳本。
    防止XSS攻擊的方式是,在使用任何不可信的數(shù)據(jù)來動態(tài)的創(chuàng)建文檔內容之前,從中移除 html 標簽。

  • 拒絕服務攻擊:如果訪問了啟用 JavaScript 功能的一個惡意web 站點,這個站點可以使用一個 alert() 對話框的無限循環(huán)占用瀏覽器,或者用一個無限循環(huán)或沒有意義的計算來占用CPU。

————————————————分割線—————————————————

END:Answer

  1. Window對象是全局對象,它有屬性和方法,alert()方法是它的一個方法,是一個全局函數(shù),可以直接使用。

  2. DOM: document object model 文檔對象模型
    BOM: browser object model 瀏覽器對象模型
    BOM的最根本對象是window,是對瀏覽器窗口的操作。
    DOM的最根本對象是document,是對頁面文檔的操作。
    BOM包含DOM。
    DOM常用來獲取文檔的節(jié)點、元素,操作他們的樣式呈現(xiàn)和行為。
    JavaScript的DOM常用來增強用戶體驗。
    一個瀏覽器進程中一般有四個線程:javascript引擎線程、渲染引擎線程、瀏覽器事件線程、http請求線程。

  3. 同步:等前一個任務完成之后再執(zhí)行下一個任務,是順序的。如果前一個任務耗時很長,后一個任務將總是等不到執(zhí)行。
    異步:后一個任務是通過前一個任務執(zhí)行回調執(zhí)行的。

  4. <script>標簽可以是內聯(lián)的,放在html文檔中,當解析的時候遇到內聯(lián)的<script>標簽的時候就會停止文檔的解析,執(zhí)行腳本代碼。直到腳本執(zhí)行完后繼續(xù)解析文檔。
    <script>標簽放在<head>標簽中,文檔的解析要等到腳本全部加載完后才解析。
    <script>標簽放在</body>前,先解析文檔,再執(zhí)行腳本代碼。

  5. 事件驅動三要素:事件、事件的目標、事件回調函數(shù)。
    事件處理機制:事件冒泡、事件傳播、事件捕獲、事件委托。

  6. JavaScript 是單線程的,默認是同步的,阻塞的;可以通過 defer 和 async 屬性改變腳本的執(zhí)行方式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 一、JS前言 (1)認識JS 也許你已經了解HTML標記(也稱為結構),知道了CSS樣式(也稱為表示),會使用HT...
    凜0_0閱讀 2,788評論 0 8
  • 簡介網絡瀏覽器很可能是使用最廣的軟件。在這篇入門文章中,我將會介紹它們的幕后工作原理。我們會了解到,從您在地址欄輸...
    wengjq閱讀 2,056評論 2 15
  • 她是公主,齊王的心頭寶,整個齊國子民的驕傲。 六歲識百家,八歲數(shù)兵法。 她的計謀,不亞于任何一位身經百戰(zhàn)的大將軍。...
    羽萌520閱讀 319評論 0 0
  • 很多人會問沒有紙筆怎樣畫好思維導圖?流程圖也是一種思維導圖,是用來描述工作步驟和思維導圖是一樣的,那么沒有紙筆怎樣...
    仰望_8a79閱讀 404評論 0 0