摘要:在本例中,使用屬性指定鏈接的目標(biāo),其中表示超文本鏈接。您應(yīng)該認(rèn)為和元數(shù)據(jù)隱式出現(xiàn)在示例中,即使它們沒有實(shí)際顯示在文本中。
來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:JavaScript and the Browser
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
部分參考了《JavaScript 編程精解(第 2 版)》
Web 背后的夢(mèng)想是公共信息空間,其中我們通過共享信息進(jìn)行交流。 其普遍性至關(guān)重要:超文本鏈接可指向任何東西,無論是個(gè)人的,本地的還是全球的,無論是草稿還是高度潤(rùn)色的。
Douglas Crockford,《JavaScript 編程語言》(視頻講座)
本書接下來的章節(jié)將會(huì)介紹 Web 瀏覽器??梢哉f,沒有瀏覽器,就沒有 JavaScript。就算有,估計(jì)也不會(huì)有多少人去關(guān)心這門編程語言。
Web 技術(shù)自出現(xiàn)伊始,其演變方式和技術(shù)上就是以分散的方式發(fā)展的。許多瀏覽器廠商專門為其開發(fā)新的功能,有時(shí)這些新功能被大眾采納,有時(shí)這些功能被其他功能所代替,最終形成了一套標(biāo)準(zhǔn)。
這種發(fā)展模式是把雙刃劍。一方面,不會(huì)有一個(gè)集中式的組織來管理技術(shù)的演進(jìn),取而代之的是一個(gè)包含多方利益集團(tuán)的松散協(xié)作架構(gòu)(偶爾會(huì)出現(xiàn)對(duì)立)。另一方面,互聯(lián)網(wǎng)這種無計(jì)劃的發(fā)展方式所開發(fā)出來的系統(tǒng),其內(nèi)部很難實(shí)現(xiàn)一致性。事實(shí)上,它的一些部分令人疑惑,并且毫無設(shè)計(jì)。
網(wǎng)絡(luò)和 Internet計(jì)算機(jī)網(wǎng)絡(luò)出現(xiàn)在 20 世紀(jì) 50 年代。如果在兩臺(tái)或多臺(tái)計(jì)算機(jī)之間鋪設(shè)電纜,那么你可以通過這些電纜互相收發(fā)數(shù)據(jù),并實(shí)現(xiàn)一些神奇的功能。
如果通過連接同一個(gè)建筑中的兩臺(tái)機(jī)器就可以實(shí)現(xiàn)一些神奇的功能,那么如果可以連接全世界的機(jī)器,就可以完成更偉大的工作了。20 世紀(jì) 80 年代,人們開發(fā)了相關(guān)技術(shù)來實(shí)現(xiàn)這個(gè)愿景,我們將其產(chǎn)生的網(wǎng)絡(luò)稱為 Internet。而 Internet 的表現(xiàn)名副其實(shí)。
計(jì)算機(jī)可以使用這種網(wǎng)絡(luò)向其他計(jì)算機(jī)發(fā)送位數(shù)據(jù)。為了在傳輸位數(shù)據(jù)的基礎(chǔ)上,實(shí)現(xiàn)計(jì)算機(jī)之間的有效通信,網(wǎng)絡(luò)兩端的機(jī)器必須知道這些位所表達(dá)的實(shí)際含義。對(duì)于給定的位序列,其含義完全取決于位序列描述的信息類型與使用的編碼機(jī)制。
網(wǎng)絡(luò)協(xié)議描述了一種網(wǎng)絡(luò)通信方式。網(wǎng)絡(luò)協(xié)議非常多,其中包括郵件發(fā)送、郵件收取和郵件共享,甚至連病毒軟件感染控制計(jì)算機(jī)都有相應(yīng)的協(xié)議。
例如,HTTP(超文本傳輸協(xié)議,Hypertext Transfer Protocol)是用于檢索命名資源(信息塊,如網(wǎng)頁或圖片)的協(xié)議。 它指定發(fā)出請(qǐng)求的一方應(yīng)該以這樣的一行開始,命名資源和它正在嘗試使用的協(xié)議的版本。
GET /index.html HTTP/1.1
有很多規(guī)則,關(guān)于請(qǐng)求者在請(qǐng)求中包含更多信息的方式,以及另一方返回資源并打包其內(nèi)容的方式。 我們將在第 18 章中更詳細(xì)地觀察 HTTP。
大多數(shù)協(xié)議都建立在其他協(xié)議之上。 HTTP 將網(wǎng)絡(luò)視為一種流式設(shè)備,您可以將位放入這些設(shè)備,并使其按正確的順序到達(dá)正確的目的地。 我們?cè)诘?11 章]中看到,確保這些事情已經(jīng)是一個(gè)相當(dāng)困難的問題。
TCP(傳輸控制協(xié)議,Transmission Control Protocol)就可以幫助我們解決該問題。所有連接到互聯(lián)網(wǎng)的設(shè)備都會(huì)使用到這種協(xié)議,而多數(shù)互聯(lián)網(wǎng)通信都構(gòu)建在這種協(xié)議之上。
TCP 連接的工作方式是一臺(tái)電腦必須等待或者監(jiān)聽,而另一臺(tái)電腦則開始與之通信。一臺(tái)機(jī)器為了同時(shí)監(jiān)聽不同類型的通信信息,會(huì)為每個(gè)監(jiān)聽器分配一個(gè)與之關(guān)聯(lián)的數(shù)字(我們稱之為端口)。大多數(shù)協(xié)議都指定了默認(rèn)使用的端口。例如,當(dāng)我們向使用 SMTP 協(xié)議發(fā)送一封郵件時(shí),我們需要通過一臺(tái)機(jī)器來發(fā)送郵件,而發(fā)送郵件的機(jī)器需要監(jiān)聽端口 25。
隨后另一臺(tái)機(jī)器連接到使用了正確端口號(hào)的目標(biāo)機(jī)器上。如果可以連接到目標(biāo)機(jī)器,而且目標(biāo)機(jī)器在監(jiān)聽對(duì)應(yīng)端口,則說明連接創(chuàng)建成功。負(fù)責(zé)監(jiān)聽的計(jì)算機(jī)名為服務(wù)器,而連接服務(wù)器的計(jì)算機(jī)名為客戶端。
我們可以將該連接看成雙向管道,位可以在其中流動(dòng),也就是說兩端的機(jī)器都可以向連接中寫入數(shù)據(jù)。當(dāng)成功傳輸完這些位數(shù)據(jù)后,雙方都可以讀取另一端傳來的數(shù)據(jù)。TCP 是一個(gè)非常便利的模型。我們可以說TCP就是一種網(wǎng)絡(luò)的抽象。
Web萬維網(wǎng)(World Wide Web,不要將其與 Internet 混淆)是包含一系列協(xié)議和格式的集合,允許我們通過瀏覽器訪問網(wǎng)頁。詞組中的 Web 指的是這些頁面可以輕松地鏈接其他網(wǎng)頁,因此最后可以連接成一張巨大的網(wǎng),用戶可以在網(wǎng)絡(luò)中瀏覽。
你只需將一臺(tái)計(jì)算機(jī)連接到 Internet 并使用 HTTP 監(jiān)聽 80 端口,就可以成為 Web 的一部分。其他計(jì)算機(jī)可以通過網(wǎng)絡(luò),并使用 HTTP 協(xié)議獲取其他計(jì)算機(jī)上的文件。
網(wǎng)絡(luò)中的每個(gè)文件都能通過 URL(統(tǒng)一資源定位符,Universal Resource Locator)訪問,如下所示:
http://eloquentjavascript.net/13_browser.html | | | | protocol server path
該地址的第一部分告訴我們 URL 使用的是 HTTP 協(xié)議(加密的 HTTP 連接則使用https://來表示)。第二部分指的是獲取文件的服務(wù)器地址。第三部分是我們想要獲取的具體文件(或資源)的路徑。
連接到互聯(lián)網(wǎng)的機(jī)器獲得一個(gè) IP 地址,該地址是一個(gè)數(shù)字,可用于將消息發(fā)送到該機(jī)器的,類似于"149.210.142.219"或"2001:4860:4860::8888"。 但是或多或少的隨機(jī)數(shù)字列表很難記住,而且輸入起來很笨拙,所以你可以為一個(gè)特定的地址或一組地址注冊(cè)一個(gè)域名。 我注冊(cè)了eloquentjavascript.net,來指向我控制的機(jī)器的 IP 地址,因此可以使用該域名來提供網(wǎng)頁。
如果你在瀏覽器地址欄中輸入上面提到的 URL,瀏覽器會(huì)嘗試獲取并顯示該 URL 對(duì)應(yīng)的文檔。首先,你的瀏覽器需要找出域名eloquentjavascript.net指向的地址。然后使用 HTTP 協(xié)議,連接到該地址處的服務(wù)器,并請(qǐng)求/13_browser.html這個(gè)資源。如果一切順利,服務(wù)器會(huì)發(fā)回一個(gè)文檔,然后您的瀏覽器將顯示在屏幕上。
HTMLHTML,即超文本標(biāo)記語言(Hypertext Markup Language),是在網(wǎng)頁中得到廣泛使用的文檔格式。HTML 文檔不僅包含文本,還包含了標(biāo)簽,用于說明文本結(jié)構(gòu),描述了諸如鏈接、段落、標(biāo)題之類的元素。
一個(gè)簡(jiǎn)短的 HTML 文檔如下所示:
My home page My home page
Hello, I am Marijn and this is my home page.
I also wrote a book! Read it here.
標(biāo)簽包裹在尖括號(hào)之間(<和>,小于和大于號(hào)),提供關(guān)于文檔結(jié)構(gòu)的信息。其他文本則是純文本。
文檔以開頭,告訴瀏覽器將頁面解釋為現(xiàn)代 HTML,以別于過去使用的各種方言。
HTML 文檔有頭部(head)和主體(body)。頭部包含了文檔信息,而主體則包含文檔自身。在本例中,頭部將文檔標(biāo)題聲明為"My home page",并使用 UTF-8 編碼,它是將 Unicode 文本編碼為二進(jìn)制的方式。文檔的主體包含標(biāo)題(,表示一級(jí)標(biāo)題,到可以產(chǎn)生不同等級(jí)的子標(biāo)題)和兩個(gè)段落(
)。
標(biāo)簽有幾種形式。一個(gè)元素,比如主體、段落或鏈接以一個(gè)起始標(biāo)簽(比如
)開始,并以一個(gè)閉合標(biāo)簽(比如
)結(jié)束。一些起始標(biāo)簽,比如一個(gè)鏈接(),會(huì)包含一些額外信息,其形式是name="value"這種鍵值對(duì),我們稱之為屬性。在本例中,使用屬性href="http://eloquentjavascript.net"指定鏈接的目標(biāo),其中href表示“超文本鏈接(Hypertext Reference)”。某些類型的標(biāo)簽不會(huì)包含任何元素,這種標(biāo)簽不需要閉合。元數(shù)據(jù)標(biāo)簽就是一個(gè)例子。
譯者注:最好還是這樣閉合它們:。
盡管 HTML 中尖括號(hào)有特殊含義,但為了在文檔的文本中包含這些符號(hào),可以引入另外一種形式的特殊標(biāo)記方法。普通文本中的起始尖括號(hào)寫成<(less than),而閉合尖括號(hào)寫成>(greater than)。在 HTML 中,我們將一個(gè)&字符后跟著一個(gè)單詞和分號(hào)(;)這種寫法稱為一個(gè)實(shí)體,瀏覽器會(huì)使用實(shí)體編碼對(duì)應(yīng)的字符替換它們。
與之類似的是 JavaScript 字符串中反斜杠的使用。由于 HTML 中的實(shí)體機(jī)制賦予了&特殊含義,因此我們需要使用&來表示一個(gè)&字符。在屬性的值(包在雙引號(hào)中)中使用"可以插入實(shí)際的引號(hào)字符。
HTML 的解析過程容錯(cuò)性非常強(qiáng)。當(dāng)應(yīng)有的標(biāo)簽丟失時(shí),瀏覽器會(huì)重新構(gòu)建這些標(biāo)簽。標(biāo)簽的重新構(gòu)建已經(jīng)標(biāo)準(zhǔn)化,你可以認(rèn)為所有現(xiàn)代瀏覽器的行為都是一致的。
下面的文件與之前版本顯示效果相同:
My home page My home page
Hello, I am Marijn and this is my home page.
I also wrote a book! Read it here.
、和標(biāo)簽可以完全丟棄。瀏覽器知道和
本書的示例通常都會(huì)省略、和標(biāo)簽,以保持源代碼簡(jiǎn)短,避免太過雜亂。但我會(huì)明確關(guān)閉所有標(biāo)簽并在屬性兩旁包含引號(hào)。
本書也會(huì)經(jīng)常忽略doctype和charset聲明。這并不是鼓勵(lì)大家省略它們。當(dāng)你忘記它們時(shí),瀏覽器往往會(huì)做出荒謬的事情。 您應(yīng)該認(rèn)為doctype和charset元數(shù)據(jù)隱式出現(xiàn)在示例中,即使它們沒有實(shí)際顯示在文本中。
HTML 和 JavaScript對(duì)于本書來說,最重要的一個(gè) HTML 標(biāo)簽是。該標(biāo)簽允許我們?cè)谖臋n中包含一段 JavaScript 代碼。
Testing alert
當(dāng)瀏覽器在讀取 HTML 時(shí),一旦遇到標(biāo)簽就會(huì)執(zhí)行該代碼。這個(gè)頁面在打開時(shí)會(huì)彈出一個(gè)對(duì)話框 - alert函數(shù)類似prompt,因?yàn)樗鼜棾鲆粋€(gè)小窗口,但只顯示一條消息而不請(qǐng)求輸入。
在 HTML 文檔中包含大程序是不切實(shí)際的。標(biāo)簽可以指定一個(gè)src屬性,從一個(gè) URL 獲取腳本文件(包含 JavaScript 程序的文本文件)。
Testing alert
這里包含的文件code/hello.js是和上文中相同的一段程序,alert("hello")。當(dāng)一個(gè)頁面將其他 URL 引用為自身的一部分時(shí)(比如圖像文件或腳本),網(wǎng)頁瀏覽器將會(huì)立即獲取這些資源并將其包含在頁面中。
即使script標(biāo)簽引用了一個(gè)文本文件,且并未包含任何代碼,你也必須使用來閉合標(biāo)簽。如果你忘記了這點(diǎn),瀏覽器會(huì)將剩余的頁面會(huì)作為腳本的一部分進(jìn)行解析。
你可以在瀏覽器中加載ES模塊(參見第 10 章),向腳本標(biāo)簽提供type ="module"屬性。 這些模塊可以依賴于其他模塊,通過將相對(duì)于自己的 URL 用作import聲明中的模塊名稱。
某些屬性也可以包含 JavaScript 程序。下面展示的標(biāo)簽(顯示一個(gè)按鈕)有一個(gè)onclick屬性。該屬性的值將在點(diǎn)擊按鈕時(shí)運(yùn)行。
需要注意的是,我們?cè)?b>onclick屬性的字符串中使用了單引號(hào),這是因?yàn)槲覀冊(cè)谑褂昧穗p引號(hào)來引用整個(gè)屬性。我們也可以使用"。
沙箱直接執(zhí)行從因特網(wǎng)中下載的程序存在潛在危險(xiǎn)。你不了解大多數(shù)的網(wǎng)頁開發(fā)者,他們不一定都心懷善意。一旦運(yùn)行某些不懷好意的人提供的程序,你的電腦可能會(huì)感染病毒,這些程序還會(huì)竊取數(shù)據(jù)會(huì)并盜走賬號(hào)。
但網(wǎng)絡(luò)的吸引力就在于你可以瀏覽網(wǎng)站,而不必要信任所有網(wǎng)站。這就是為什么瀏覽器嚴(yán)重限制了 JavaScript 程序的能力—— JavaScript 無法查看電腦中的任何文件,也無法修改與其所在頁面無關(guān)的數(shù)據(jù)。
我們將這種隔離程序運(yùn)行環(huán)境的技術(shù)稱為沙箱。以該思想編寫的程序在沙箱中運(yùn)行,不會(huì)對(duì)計(jì)算機(jī)造成任何傷害。但是你應(yīng)該想象,這種特殊的沙箱上面有一個(gè)厚鋼筋籠子,所以在其中運(yùn)行的程序?qū)嶋H上不會(huì)出去。
實(shí)現(xiàn)沙箱的難點(diǎn)是:一方面我們要給予程序一定的自由使得程序能有實(shí)際用處,但又要限制程序,防止其執(zhí)行危險(xiǎn)的行為。許多實(shí)用功能(比如與服務(wù)器通信或從剪貼板讀取內(nèi)容)也會(huì)存在問題,有些侵入者可以利用這些功能來侵入你的計(jì)算機(jī)。
時(shí)不時(shí)會(huì)有一些人想到新方法,突破瀏覽器的限制,并對(duì)你的機(jī)器造成傷害,從竊取少量的私人信息到掌握?qǐng)?zhí)行瀏覽器的整個(gè)機(jī)器。瀏覽器開發(fā)者的對(duì)策是修補(bǔ)漏洞,然后一切都恢復(fù)正常。直到下一次問題被發(fā)現(xiàn)并廣為傳播之前,某些政府或秘密組織可以私下利用這些漏洞。
兼容性與瀏覽器之爭(zhēng)在 Web 技術(shù)發(fā)展的早期,一款名為 Mosaic 的瀏覽器統(tǒng)治了整個(gè)市場(chǎng)。幾年之后,這種平衡被 Netscape 公司打破,隨后又被微軟的 Internet Explorer 排擠出市場(chǎng)。無論什么時(shí)候,當(dāng)一款瀏覽器統(tǒng)治了整個(gè)市場(chǎng),瀏覽器供應(yīng)商就會(huì)覺得他們有權(quán)利單方面為網(wǎng)絡(luò)研發(fā)新的特性。由于大多數(shù)人都使用相同的瀏覽器,因此網(wǎng)站會(huì)開始使用這些獨(dú)有特性,也就不再考慮其他瀏覽器的兼容性問題了。
這是兼容性的黑暗時(shí)代,我們通常稱之為瀏覽器之爭(zhēng)。網(wǎng)絡(luò)開發(fā)者總是為缺乏統(tǒng)一的 Web 標(biāo)準(zhǔn),而需要去考慮兩到三種互不兼容的平臺(tái)而感到煩惱。讓事情變得更糟糕的是 2003 年左右使用的瀏覽器充滿了漏洞,當(dāng)然不同瀏覽器的漏洞都不一樣。網(wǎng)頁編寫者的生活頗為艱辛。
Mozilla Firefox,作為 Netscape 瀏覽器的非盈利性分支,在20世紀(jì)初末期開始挑戰(zhàn) Internet Explorer 的霸主地位。因?yàn)楫?dāng)時(shí)微軟并未特別關(guān)心與其競(jìng)爭(zhēng),導(dǎo)致 Firefox 迅速占領(lǐng)了很大的市場(chǎng)份額。與此同時(shí),Google 發(fā)布了它的 Chrome 瀏覽器,而 Apple 的 Safari 也得到普及,導(dǎo)致現(xiàn)在成為四個(gè)主要選手的競(jìng)爭(zhēng),而非一家獨(dú)大。
新的參與者對(duì)標(biāo)準(zhǔn)有著更認(rèn)真的態(tài)度,和更好的工程實(shí)踐,為我們減少了不兼容性和錯(cuò)誤。 微軟看到其市場(chǎng)份額極速下降,在其 Edge 瀏覽器中采取了這些態(tài)度,取代了 Internet Explorer。 如果您今天開始學(xué)習(xí)網(wǎng)絡(luò)開發(fā),請(qǐng)認(rèn)為自己是幸運(yùn)的。 主流瀏覽器的最新版本行為非常一致,并且錯(cuò)誤相對(duì)較少。
這并不是說就沒有問題了。某些使用網(wǎng)絡(luò)的人,出于惰性或公司政策,被迫使用舊版本的瀏覽器。直到這些瀏覽器完全退出市場(chǎng)之前,為舊版本瀏覽器編寫網(wǎng)站仍需要掌握很多不常見的特性,了解舊瀏覽器的缺陷和特殊之處。本書不會(huì)討論這些特殊的特性,而著眼于介紹現(xiàn)代且健全的網(wǎng)絡(luò)程序設(shè)計(jì)風(fēng)格。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105050.html
摘要:來源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版,這是一本關(guān)于指導(dǎo)電腦的書。在可控的范圍內(nèi)編寫程序是編程過程中首要解決的問題。我們可以用中文來描述這些指令將數(shù)字存儲(chǔ)在內(nèi)存地址中的位置。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地...
摘要:為了運(yùn)行包裹的程序,可以將這些值應(yīng)用于它們。在瀏覽器中,輸出出現(xiàn)在控制臺(tái)中。在英文版頁面上運(yùn)行示例或自己的代碼時(shí),會(huì)在示例之后顯示輸出,而不是在瀏覽器的控制臺(tái)中顯示。這被稱為條件執(zhí)行。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Program Structure 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《J...
摘要:相反,當(dāng)響應(yīng)指針事件時(shí),它會(huì)調(diào)用創(chuàng)建它的代碼提供的回調(diào)函數(shù),該函數(shù)將處理應(yīng)用的特定部分?;卣{(diào)函數(shù)可能會(huì)返回另一個(gè)回調(diào)函數(shù),以便在按下按鈕并且將指針移動(dòng)到另一個(gè)像素時(shí)得到通知。它們?yōu)榻M件構(gòu)造器的數(shù)組而提供。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Project: A Pixel Art Editor 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...
摘要:來源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版在機(jī)器的表面之下,程序在運(yùn)轉(zhuǎn)。本章將會(huì)介紹程序當(dāng)中的基本元素,包括簡(jiǎn)單的值類型以及值運(yùn)算符。示例中的乘法運(yùn)算符優(yōu)先級(jí)高于加法。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Values, Types, and Operators 譯者:飛龍 協(xié)議:CC BY-NC...
摘要:事件與節(jié)點(diǎn)每個(gè)瀏覽器事件處理器被注冊(cè)在上下文中。事件對(duì)象雖然目前為止我們忽略了它,事件處理器函數(shù)作為對(duì)象傳遞事件對(duì)象。若事件處理器不希望執(zhí)行默認(rèn)行為通常是因?yàn)橐呀?jīng)處理了該事件,會(huì)調(diào)用事件對(duì)象的方法。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Handling Events 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分...
閱讀 1666·2023-04-26 00:25
閱讀 980·2021-09-27 13:36
閱讀 989·2019-08-30 14:14
閱讀 2240·2019-08-29 17:10
閱讀 1072·2019-08-29 15:09
閱讀 2003·2019-08-28 18:21
閱讀 1034·2019-08-26 13:27
閱讀 1040·2019-08-26 10:58