




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
之外,JavaScript也 ,不過是在服務器端進行。JavaScript是一種語言,用于開發(fā)基于第 年月 第 年月Ajax概念1的提出。其間打了第一場瀏覽器 ,IEVSNetscape。這兩者的DOMAPI出入很大,前端開發(fā)人員被迫改進技術,為了不想兼容某一個瀏覽器,發(fā)明UA(navigator.userAgent) 技術。這個時期的杰出代支持能在EXT看到的各種控件,如菜單、樹、表格、滑動條、切換卡、彈出層、測量儀表(使用VML實現(xiàn),現(xiàn)在又支持SVG)。其他比較著名的還有,Dojo(2004年)、Sarissa(2003年)JavaScriptRemoteScripting(2000年)。Dojo有IBM做 做,質(zhì)量有保證,被廣泛整合到各大Java框架內(nèi)(struct2、Tapestry、EclipseATF、MyFaces)。特點是功能無所不包,主要分為Core、Dijit、animations、JSON等相關操作API。Dijit是一個可更換皮膚,基于模板的WebUI控件庫。DojoX包括一些新穎的代碼和控件,如DateGrid、chartsJavaScriptRemoteScripting是較經(jīng)典 第2時期,Prototype“ ”,2005年~2008年。其間打了第2次瀏覽器 Firefox3大勝。瀏覽器“ ”中,Prototype積極進行升級,加入諸多DOM功能,因此,JSer比之前好過多了。加之,有rails、script.aculo.usPrototype時期,面向?qū)ο蠹夹g發(fā)展到極致,許多組件成套推出。DOM特 JavaScript文件,不 誤。比如它一個很好用的API-ge ementsByClassName,由于W3C的標準化,Prototype升級慢了,它對DOM的擴展成為了它的“ ,2008年到現(xiàn)在200771日,jQuery1.1.3 停滯不前的Prototype已經(jīng)跟不上時代的節(jié)奏,jQuery在1.3x版本時更換Sizzle,更純凈的CSS選擇器引擎,易用性與性能大大提高,被程序員一致看好的mouseenter、mouseleave及 YUI與EXT。接著出現(xiàn)的是以類工廠為導向的框架,如著名的Prototype,還有 塊都是一個由類工廠衍生出來的類對象。尤其是mootoos1.3把所有類型都封裝成Type類型。不起的東西:“無new實例化”技術,$(expr)就是返回一個實例,不需要顯式地new出來;getfirstsetall y-InvokedFunction第4種就是以加載器串聯(lián)起來的框架,它們都有復數(shù)個JavaScript文AMD。模塊化是JavaScript 工業(yè)化的標志。《Unix編程藝術》列本采取這種架構,如Dojo、YUI、kissy、qwrap和mass等。現(xiàn)在叫CanJS),backbonejs和spinejs,然后更符合前端實際的MVVM框架中,原有DOM操作被 要依據(jù)它們在中的源碼,基本上都是一個模塊一個JavaScriptjQuery,jQuery強在它專注于DOM操作的思路一開始就是對的,以后龐大的插件與完善的Bug提交 的“類”。其中Enumerable只是一個普通的方法包,ObjectRange、 t則是用Class類工廠生產(chǎn)出來的。Class類 受Prototype.js影響,是最早期以命名空間為導向的框架的典范。覽器版本的渲染Bug、安全策略或某些BUG的修正,還是要用到瀏覽器 用到pare(anotherObject)上。這允許兩個不同的類之間建立。將一個接受類作為參數(shù)的函數(shù)可改為接受一個接口作為函數(shù)測和調(diào)試變得更加簡單。在類似與JS這樣的弱類型語言中,類型匹配錯誤非常。但使用接口就會讓這變得簡單一些,因為如果一。常。并對系統(tǒng)性能造成影響。如果你擔心這點,你可以在開發(fā)完成后跳過這 了所要實現(xiàn)的接口,這些被想要與這些類結合的對象檢查,接口 有它需要實現(xiàn)的某個接口,就會出現(xiàn)錯誤。你可以利用這些錯誤強迫其它程序員這些接口。它“自稱”實現(xiàn)了接口。創(chuàng)建一個了卻忘了實現(xiàn)接口的類是非常問題。當然,顯示的類所要支持的接口無疑也增加了工作兩。用鴨子類型模擬接口,事實上,一個類是否了它所支持的接口是無關緊 。都會被使用。給你的自由去優(yōu)化和重構你的代碼。 //ResultSet 名為execute,run,orundo),通過使用接口,你可以創(chuàng)建能夠執(zhí)行這盡管JS是一種OO語言,但是他沒有任何內(nèi)建的機制來一個成員是成的方案來創(chuàng)建包含公共,私有和方法的對象。每種方案都有優(yōu)。,這確保了你的人會用同樣的方法請求信息。一天,你決定要更頻繁的接受這些信息。你找到了原始數(shù)據(jù)的地點,自己檢索并計 口中定義的存取函數(shù)和賦值函數(shù)。在現(xiàn)實世界中很少用到這些特?varbill=="BillEbill.sound=function()console.log('bahhh!' varbill=name:"BillEconsole.log('bahhh!' ;//"BillE bill['name'];//"BillE bill.sound("brrr!");//"brrr!"He'scold console.log( o"+ oBillE varsound=sound('moo!');// ) console.log( o"+ oBillE varsound=sound('moo!');// )varsally=;//" ="BillE oBillEvarsayName= "建為全局變量時,當它碰到時,它會在全局查找namevarname="Bearded oBearded functionGame()varzelda=newvarsmb=newzelda.title="Legendofsmb.title="SuperMariozelda.title;//"Legendofsmb.title;//"SuperMariofunctionGame(title)this.title=typeoftitle!=='undefined'?title:varzelda=newGame("Legendofzelda.title;//"Legendofzelda.title="Ocarinaofzelda.title;//"Ocarinaofvarblank=newblank.title;//面標準的ifelse語句是一個意思。if(typeoftitle!=='undefined')this.title=}elsethis.title=}//Isthesamethis.title=typeoftitle!=='undefined'?title: console.log("Ilove"+this.titlezelda.loveTitle();//"IloveOcarinaofconsole.log("Iheart"+this.titlezelda.heartIt();//"IheartOcarinaofsmb.heartIt();//"IheartSuperMario 第 年月變量是用來臨 數(shù)值的容器。在程序,變量 的數(shù)值是可以變化的。在JavaScript中,當網(wǎng)頁窗口被關閉以后, 變量可以包含數(shù)字、從A到Z的大寫字母第4頁變量區(qū)分大小寫 第 年月
局部變量是在一個函數(shù)中的變量,僅對該函數(shù)可用,中的其他函數(shù)都不能訪第 年月 第 年月第 年月“o空第 年月 第 年月 。第 年月+加-減/除*乘%++xxx第 年月><第 年月值!第 年月第 年月第 年月 第 年月第 年月 第 年月 第數(shù)組的開頭添加一年月多元素,并返回new。第 年月。第 年月
年月日。第 年月 第 年月頁第 年月第 年月第頁條語句的 年月第 年月第 年月;在用戶填寫信息時,經(jīng)常會驗證用戶輸入的郵箱格式和號碼是否符合特第 年月第 年月New第 年月 第 年月igm第 年月.第 年月第 年月.第 年月第 年月[a-第 年月第 年月
第 年月number第 年月第 年月第 年月
第 年月流 第 年月 。第 年月第 年月第 年月第 年月第 年月 如HTML,CSS,JavaScript和DOM中。并能夠嵌入WebKit在其他好嵌入的API。HTML格式的內(nèi)容繪制出來,包括,aHTML的布局,譬如左邊是什么,體還是楷書,大小尺寸,重體斜體等等。c.顯示不同格式的,譬如JPG,GIF,PNG等等。所以,WebKit是一個渲染機(RenderingEngine)。說來,JavaScriptEngine不屬于WebKit,但是WebKit自帶了一個JavaScriptEngine,SquirrelFish。不過在WebKit框架下,可以把SquirrelFishJavaEngine替換成其它版本,而不影響WebKit整體工作。 其界面渲染,使用了微軟的RenderingEngine,Trident。甚至微軟的第一層為業(yè)務應用層,用戶可在webkit基礎上構建 第四層為平臺和操作系統(tǒng)支持層,提供webkit平臺 是只有一個mainFrame,其它Frame是頁面內(nèi)的 和mainFrame在page.cpp文件里,還有個重要;allPages在PagePagewindow,才會新數(shù)據(jù)的加載(FrameLoader)、頁面內(nèi)的各種有個子類是HTML Text,CommentCDATASectionElement…… XHTMLSVGWML都有響應的能力,由于DOM的位置,因此在窗口發(fā)生時,它第一個接收到,并尋找到發(fā)生的目標元素,然后從目標元素開始以樹的路徑向上依次處理。用RenderObjectRender結點并最終RenderRender樹各種結點類的基類,它的一個孫子類——RenderView,就Render樹的根結點。 Dom樹Rendering 到根直到得到結果。現(xiàn)在已經(jīng)擁有了目標ip和端 :GET HTTP1.0200OK 正在運行的HTTP版本號和應答代碼。代碼"200OK"表示請求完成。
理,在這里報文打上了傳輸頭的包頭,主要包含端,以及tcp的各種制信數(shù)據(jù)傳送單位segmenttcp是一種端到端的協(xié)議,利用這些信息,比如tcp首址。首先在本機,要查找本機的路由表,在windows上運行routeprint就可以ActiveRoutesDefaultRoutePersistent路由器收到數(shù)據(jù)后,它再次為主機或網(wǎng)絡查詢路由,若還未找 。 gateway 01剛好對應則返回自己的mac地址,同時將請求者的ipmac保存。這樣 路由表,真正的數(shù)據(jù)傳協(xié)議:SDLC(SynchronousDataLinkControl)HDLC(High-levelDataLinkControl) TCP和UDP 和UDP的 TCP/UDP提供的傳輸服務,并且這 基于tcp:netFTPSMTPDNS基于udp:RIPNTP(網(wǎng)落時間協(xié)議)和DNS(DNS也使用TCP)SNMP1.方便開發(fā),吸引 史(History)WebKit能夠用戶對于每個頁面做WebCore以及JavaScriptCore來打交道,也不需要和它們打交道,而是同我 了WebCore和JavaSriptCore部分。Webkit模塊實際上抽象出了大多數(shù)應用程序所需要的那一部分,這里所說的大多數(shù)應用程序其實就是指的瀏覽器,對于實現(xiàn)一個瀏覽器而言,覽器應用程序的話,你只需要了解Webkit模塊部分就足夠了,更確切的說 分都是關于方法就像是其他可視組件一樣,在應用程序中應用起來非常方便。比如,某平臺提供了叫做WebView的可視化組件,我們就可以通過如下幾行代碼來展示一個網(wǎng)頁,使用的代碼僅僅三行:WebView*view=new Tree大致相同,基本上DOMTree里面每一個節(jié)點,在DOMTree與RenderingTree 3月,在歐洲原子能研究組織(CERN)工作的TimBerners-Lee,提議在 hyperlink。在撰寫網(wǎng)頁時,可以對于某些詞句,設置隱含的hyperlinks。當讀規(guī)范就是“超文本標識語言”,簡稱HTML。最初的HTML制訂了22個標識,標注兩方面的功能,1.內(nèi)容,包括 ,2.顯示格式。在同一份HTML文件里,把內(nèi)容和格式混雜在一起,這是一個設計錯誤。20年過去了,現(xiàn)在的HTML文件內(nèi)容與格式分離,并不等同于DOMTree與RenderingTree并存。假如內(nèi)容由HTML承載, 視角,有旁觀者視角,還有俯瞰視角等等。換句話說,Webkit不僅滿足了 普通需要,而且提供了一些尚沒有被廣泛利用的潛在的功能。把DOMTree與Rendering代碼,給RenderingTree結構的異化,也埋下了伏筆。RenderingTree的結構,不一定與一次打開某個頁面的時候,看到的是標準的頁面,也就是RenderingTree與DOMTree保 的段落,改變 們可以看到個性化的RenderingTree,與DOMTree保持一致的標準的RenderingTree,兩DOMclass與之對應。譬如<HTML>tag對應HTMLHtmlElement,<HEAD>tag較特別的是DOMTree的根節(jié)點,HTML 一言以蔽之,DOMTree就是把HTML文本文件翻譯成object樹狀結構。需要強調(diào)的是,DOMTree是一個通用數(shù)據(jù)結構,任何XML文本文件都可以翻譯成DOMTree,而不僅僅限于HTML文本文件。webkit/webcore/html中 總總htmlclasses,基本上都是webkit/webcore/dom中的某個class的子類,也就是說,/html是/dom際上是一個HTMLDOMTree。 整個RenderingTree樹狀結構,與HTMLDOMTree樹狀結構一一對應。也就是Tree中,沒有相應的葉子節(jié)點。原因是,RenderingTree各個節(jié)點,都涉及頁經(jīng)融入RenderingTree中RenderImage葉子節(jié)點的屬性中去了。另外,因為RenderingTree中不存在與HTMLStyleElement相應的葉子節(jié)點,所以,與webkit/webcore/rendering中各個class與HTMLtags并沒有一一對應的關系。RenderingTree是一個通用的規(guī)劃頁面布局和渲染的機制,這個通用機制可以RenderingTree來規(guī)劃其它格式的頁面的布局和渲染。以DOMTree和Rendering webkitcss部分的實現(xiàn)代碼為于 的用戶中,大多數(shù)人都不會在對<div> 呢,這自然需要通過詞法語法分析。在這里,Webkit使用了自動代碼生成工自動生成的代碼來CallBack,用過其他各類解析器的朋友們應該很熟悉這個。 成代碼中需要的CallBack也需要在這里實現(xiàn)。StyleRule將被轉(zhuǎn)化為Webkit的內(nèi)部模型對象CSSStyleRule對象, 析所要的結果是什么?通過調(diào)用CSSStyleSheetparseString函數(shù),上CSS解析過程將啟動,解析完一遍后,所有的Rule都將在對應的CSSStyleSheet對象轉(zhuǎn)換為CSSRuleSet中的rule,這樣所有的純樣式規(guī)則都會放在對應的集合DOMTree與RenderingTree 是一個比較特殊的class,它是整個HTMLDOMTree的根節(jié)點,但是不對應任何HTMLtag。JavaScript中經(jīng)常出現(xiàn)的, ,與RenderingTree的根節(jié)點RenderView。而這DOMTree與RenderingTreeDOMTree的根節(jié)點HTML ,與RenderingTree的根節(jié)點RenderView, RenderingTree的 什么的內(nèi)容無關。同時HTML 同一個DOMTree的根節(jié)點可以懸掛多個HTML 。在我們目前所見到的瀏覽器中,每一個每個frame承載一個獨立的HTML文件,但是從DOMTree結構來講, HTMLHtmlElement,它領銜某個HTML文本文件對應的 DOMTree與RenderingTree 同時負責RenderingTree的構筑。從第8步到第11步,HTMLParser根據(jù)一個HTMLTag生成一個HTMLDOMTree節(jié)點。從第12步到第17步,生成相應的RenderingTree的節(jié)點,并把它和HTMLDOMTree的節(jié)點勾連在一起。值得注意的是,每當HTMLParser生成一個DOMTree的節(jié)點的時候,相連在一起。換而言之,RenderingTree與DOMTree同步生長。Webkit值得贊賞的地方非常多,但是HTMLParser讓DOMTree和RenderingTree同步生長的做法,卻值得商榷。如果同步生長,那么RenderingTree必然平鋪直敘地刻板地忠實于DOMTree。假設先生成Layout負責確定RenderTree中,每個葉子和中間節(jié)點的位置。每個節(jié)在Layout過程,WebkitPaint過程,負責把RenderTree中交給第圖形工具庫(GraphicsLibrary)去完成。常用的第圖形工 Layout涵蓋了所有CSS規(guī)定的布局要素。包括頁面邊緣與內(nèi)容之間的 器插件,Applet等等,在Layout被稱作Re RenderObject。這些Re ced元素的寬度和高度可以由CSS規(guī)定。如 RenderTree中每個節(jié)點在屏幕上的顯示,都呈長方形格局。前面描述了寬度對于Re ced元素來說,它的高度相對比較容易確定,而文字段落的高度,LayoutRepaint為開頭的子過程,例如RenderTree所有可以顯示的葉子節(jié)點。所謂“可以顯示的 {alert(v) <imgonclick="myfunction('World')"height="250"width="290" onclick事件的,是Webkit還是JavaScriptEngine?兩個彈出的窗口,是Webkit還是JavaScriptEngine?注意到有兩個onclick="myfunction(...)",當用戶在第一張里點擊鼠除了PC上的瀏覽器以外,是否也可以完成同樣的及其響應?假如上沒有鼠標,但是有觸摸屏,如何把onclick定義成用手指點 從Webkit角度看,它不必關心interrupt以及interrupthandling的具體實現(xiàn),因為Webkit建筑在GUIToolkit之上,而GUIToolkit已經(jīng)把底層的 FundationClasses)。一個是IBMEclipse的SWT。有了GUIToolkit,應用程序處理鼠標和鍵盤等等UI 化了許多,只需要做兩件事情。1.把 來源(eventsource),與處理邏輯(eventlistener)綁定。2.解析并執(zhí)行 <imgonclick="myfunction('World')"height="250" 一個HTMLImageElement節(jié)點,相應地,在RenderTree里有一個RenderImage節(jié)點。在layout()過程結束后,根據(jù)<img>語句中規(guī)定的RenderImage節(jié)點,與DOMTree的HTMLElement節(jié)點一一對應,所以 ,經(jīng)過layout()過程以后,新 方式,1.直接調(diào)用HTMLDOMmethod,2.間接調(diào)用外設的Script。 改成,<imgonclick=" 在AdobeFlash的ActionEngine中。 同樣是Webkit渲染機,可以調(diào)用不同的JavaScriptEngine。之所以能做到這一點,是因為Webkit的架構設計,在設置JavaScriptEngine的時候,利用 Thelistenerbindingof HTMLElement節(jié)點,以及RenderTree中RenderImage節(jié)點。如前文所述。在生成HTMLElement節(jié)點的過程中,因為注意到有onclick屬性,Webkit把所有EventListener的創(chuàng)建工作,交給 似于DesignPatterns中,Singleton的用法。也就是說,DOMTree的根 一個HTMLElement節(jié)點,如果有多個類似于onclick的屬性,那么就需要多個相應的EventListenerobjectinstances與之綁定。每個節(jié)點的每個屬性,都對應一個獨立的EventListenerobjectinstance。同的屬性,對應的也是不同的EventListenerobjectinstances。這是 objectinstances,這種做法給不同節(jié)點之間的信息傳遞,造成了很大 反過來設想一下,如果能夠有一種機制,讓同一個objectinstance,穿梭于多個HTMLElementNodes之間,那么瀏覽器的表現(xiàn)能力將會大大增強,DOMTree的根節(jié)點, 件屬性的值,分成HTMLDOMmethods和JavaScript兩類。但是不管某個 器,生成一個EventListener。kjs 如果想把JavaScriptCore替換成其它JavaScriptEngine,例如 不能簡單地更改configurationfile,而需要修改一部分源代碼。所幸的 .{h,cpp}以及其它少數(shù)源代碼中,涉及kjs JSLazyEventListener命名的寓意,JS容易理解,意思是把 交給JavaScriptengine負責。所謂lazy指的是,除非用戶在 點擊了鼠標,否則,JavaScriptEngine不主動處理 與lazy做法相對應的是JIT即時編譯,譬 一些JavaScriptEngine,在 可能會有一些JavaScriptfunctions,雖然編譯過了,但是從來沒有被真 EventTargetNode:當用戶觸發(fā)某個,例如點擊鼠標,根據(jù)鼠標所在位置,從RenderTree的根節(jié)點開始,一路搜索到鼠標所在位置對應的葉子節(jié)點。RenderTree根節(jié)點對應的是整個瀏覽器頁面,而對應一個DOMTreeNode。這一串DOMTreeNodes中,有些節(jié)點響應 ,另一些不響應。例如在本文的例子中,<body>tag對應的DOMTreeNode,和第一張 的<img>tag對應的DOMTree 個DOMTreeNode,而且是對 多個DOMTreeNodes對 JavaScriptEngine依次處理這一串節(jié)點中,每一個節(jié)點定義的 o')">,這意味著,有兩個DOMTreeNodes對 處理邏輯分別是myfunction('World')和 當JavaScriptEngine獲得 則,解析為一棵樹狀結構,稱作ParseTree。有了這棵 本文的例子中,“myfunction('World')"這個字符串本身并沒有定義 值。當JavaScriptEngine得到這個字符串以后,解析,執(zhí)行。執(zhí)行的結果JavaScriptEngine把這一句解析成ParseTree,然后執(zhí)行。 由bubblingpath決定,如前面圖形所示。在HTML文件中,可以規(guī)定event.bubbles屬性。如果沒有規(guī)定,那就按照bubbling的順序進行,所以本文的例子,是先執(zhí)行<img>,彈出“World”的窗口,關掉 o”的窗口。 HTMLXML文檔與。通過插件(或瀏覽器擴展程序)PDFPDF文檔。公司“”的呈現(xiàn)引擎。而HTML文檔,并將各標記逐個轉(zhuǎn)化成“內(nèi)容樹”據(jù)。HTML中這些帶有視覺指令的樣式信息將用于創(chuàng)建另一個樹結構配一個應出現(xiàn)在屏幕上的確切坐標。下一個階段是繪制呈現(xiàn)引擎會 語法分析是應用語言的語也稱為標記),負責將輸入內(nèi)容分解成一個個有效標記;而解析器負責根據(jù)語言的語則分析文檔的結構,從而構建解析樹。詞求一個新標記,并嘗試將其與某條語則進行匹配。如如果沒有規(guī)則可以匹配,解析器就會將標記到內(nèi)部,并繼續(xù)請求標記,直至找到可與所有內(nèi)部的標記匹配的規(guī)則。如果找不到任何匹配規(guī)則,解析器就會一個我們分析一下231:匹配語則的第一個子串是25條語則,這是一個項。匹配語則的第二個子串是23,而根據(jù)PLUS:+MINUS:expression:=termoperationtermoperation:=PLUS|MINUSterm:=INTEGER|地來說,自上而下的解析器從語法的結構出發(fā),嘗試從中找到匹化為語則,直至滿足規(guī)則。自上而下的解析器會從的規(guī)則開始:首先將2+3標識為一個表達式,然后將231標識為一個表達式(標識表達式的過程涉及到匹配其他規(guī)則,但是起點是別的規(guī)則)。器。您只要向其提供您所用語言的語法(詞匯和語則情,所以解析器是非常實用的。 到Lex和Yacc這樣的別名)。Flex的輸入是包含標記的正則表達式定義的文件。Bison的輸入是采用BNF格式的語 DOM 含個 :在HTML中, work/multipage/parsing.html。此算法由兩 HTML標記。該算法使用狀 oworld oworld中的H字符時,將創(chuàng)建并發(fā)送字符標記,直到接收 現(xiàn)在我們回到“標記打開狀態(tài)”。接收下一個輸入字符/時,會創(chuàng)建endtag。 o“initialmode”。接收HTML標記后轉(zhuǎn)為“beforehtml”模式,并在這 現(xiàn)在我們進入了“inhead”模式,然后轉(zhuǎn)入“afterhead”模式。系統(tǒng)對現(xiàn)在,接收由“oworld”字符串生成的一系列字符標記。接收第一 接收 其與<br>做同樣的處理。if(t->isCloseTag(brTag)&&m_ reportError(MalformedBRError);t->beginTag=true;}table</td></tr</table<tabletr><td>innertable</td></tr></table> ); {unsignedi=for(HTMLStackElem*curr=m_blockStack;i<&&curr&&curr->tagName==tagName;curr=curr->next,{returni!=cMaxRedundantTagDepth;end()來執(zhí)行關閉操作:if(t->tagName==htmlTag||t->tagName==bodyTag) 請編寫格式正確的HTML代碼。CSS種解析器進行解析。事實上,CSSCSS的詞法和語法。num[0-9]+|[0-9]*"."[0-9]+nmstart[_a-z]|{nonascii}|{escape}name{nmchar}+ident) CSSCSS{rulesetselector[','S*selector]*'{'S*declaration[';'S*declaration]*的一個或多個(數(shù)量可選)由分號分隔的。“”和“選擇器BNF格式定義。Webkit使用Flex和Bison解析器 ,通過CSS解析器。Firefox使用的是人工編寫的自上而下的解析器。這兩種解析器都會將CSS文件解析成StyleSheet對象,且每個對象都包含CSS規(guī)則。CSS規(guī)則對象則包含選擇器和 與CSS語法對應的對象。 預解析:Webkit和Firefox都進行了這項優(yōu)化。在執(zhí)行 應用樣式表不會更改DOM樹,因此似乎沒有必要等待樣 在 Firefox在樣式表加載和解析的過程中,會 而對于Webkit而言,僅當 。DOM樹構建的同時,瀏覽器還會構建另一個樹結構:呈現(xiàn)樹。這 Webkit代碼描述了根據(jù)dis 在Webkit,,元素不會插入呈現(xiàn)樹中,例如“head”元素。如果元素的dis y屬性值為“none”,那么也不會顯示在呈現(xiàn)樹中(但是visibility屬性值為另一個關于多呈現(xiàn)器的例子是格式無效的HTML。根據(jù)CSS規(guī)范, 的block呈現(xiàn)器,以包裹inline元素。在Firefox中,系統(tǒng)會針對DOM更新 在Webkit中,解析樣式和創(chuàng)建呈現(xiàn)器的過程稱為“附加”。每個DOM樹需要調(diào)用新的節(jié)點“attach”方法。CSS樣式屬性。己喜歡的樣式表放在“FirefoxProfile”文件夾下)。如果不進行優(yōu)化,為每一個元素查找匹配的規(guī)則會造能問題。要為每一個元divdivdiv{...3個div元素的子代的<div>。如果您要檢查Webkit節(jié)點會 元素中不能有任何inline不能使用任何同級選擇器。WebCore在遇到任何同級選擇器時,只會 局開關,并停用整個文檔的樣式共享(如果存在)。這包括+選擇器以及:first-child和:last-child等選擇器。為了簡化樣式計算,F(xiàn)irefox還采用了另外兩種樹:規(guī)則樹和樣式上下文樹。Webkit也有樣式對象,但它們不是保存在類似樣式上下文樹這DOM節(jié)點指向此類對象的相關樣式。幕大小的百分比,則需要換算成單位。規(guī)則樹的點子真的很巧 是BE-I(按照此順序)A-B-E-I-L,因此就已經(jīng)有了此路徑,這就減少了現(xiàn)在所需的工作量。別(border或color)的樣式信息。結構中的屬性都是繼承的或非。reset類型的結構,則會使用默認如果最特殊的節(jié)點確實添加了值,那么我們需要另行一些計算,以便將這些值轉(zhuǎn)化成實際值。然后結果6條規(guī)則(F節(jié)點)。F節(jié)點。margin規(guī)則的最上層節(jié)點(B節(jié)點)上找到該結構。我們已經(jīng)有了color結構的定義,因此不能使用緩存的結構。由于color有一個屬性,我們無需上溯規(guī)則樹以填充其他屬性。 第二個<span>元素處理起來更加簡單。 在Webkit中沒有規(guī)則樹,因此會對匹配的 p<pstyle="color:blue"HTML可視化屬性(映射到相關的樣式規(guī)則<pbgcolor="blue"CSS規(guī)則添加到某個哈希表中。這這種處理可以大大簡化規(guī)則匹配。我們無需查看每一條,只要從哈希表<pclass="error">anerroroccurred</p><divid="messageDiv">thisisap元素尋找匹配的規(guī)則。類表中有一個“error”鍵,在tablediv{margin:5px}這條規(guī)則仍然會從標記表中提取出來,因為鍵是table祖先。 要。這稱為“層疊”順序。根據(jù)CSS2規(guī)范,層疊的順序為(優(yōu)先級 記為選擇器中元素名稱和偽元素的個數(shù)(= 對于以下規(guī)則,Webkit通過替換“>”運算符來實現(xiàn)排序:Webkit使用一個標記來表示是否所有的頂HTML采用基于流的布局模型,這意味著大多數(shù)情況下只要一次遍歷歷(3.5)。布局是一個遞歸的過程。它從根呈現(xiàn)器(HTML文檔的<html>layout方法。 有兩種標記:“dirty”和“childrenaredirty”。。dirty增量布局是異步執(zhí)行的。Firefox將增量布局的“reflow命令”加入隊列,而調(diào)度程序會觸發(fā)這些命令的批量執(zhí)行。Webkit也有用于執(zhí)行增量布局的計時器:對呈現(xiàn)樹進行遍歷,并對dirty呈現(xiàn) 。在某些情況下,只有一個進行了修改,因此 Width()-paddingLeft()-Width 。。域設為無效,這導致OS將其視為一塊“dirty區(qū)域”,并 。OS會很巧妙地將多個區(qū)域合并成一個瀏覽器的呈現(xiàn)器不在主進程上。Chrome瀏覽器會在某種程度上模擬OS的行為。展示層會偵聽這些 。:Firefox遍歷整個呈現(xiàn)樹,為繪制的矩形建立一個,然后繪制所有,再繪制所有邊框等等)Webkit矩形 Firefox和Safari中,該線程就Chrome瀏覽器中,該線程是標26Firefox36個)。 while(!mExiting) CSS框模型描述的是針對文檔樹中的元素而生成,并根據(jù)可視化格式 none-noboxis DOM樹中的位置相似,并根據(jù)其框類型和尺寸進行布局。absolute和fixed 。 o() } o=function(){ } oWorld。而非 oWorld的形式題(代碼見備注): vara
返回值//返回值
調(diào)用函數(shù),返回值}。
varf=function(){} 雖然變量和函數(shù)可以在文檔任意位置,但是良好的習慣應該是在所有JavaScript代碼之前全局變量和函數(shù),并對變量進行初始化賦值。在函數(shù)內(nèi)部也是先變量,然后再。 塊中的變量或函數(shù)就會提示語法錯誤。例如,當JavaScript解釋器 如果在一個頁面中存在多個windows.onload處理函數(shù),則只有最后一個才是有效的,為了解決這個問題,可以把所有或調(diào)用函數(shù)都放在同一個onload處理函 window.onload= 而且通過這種方式可以改變函數(shù)的執(zhí)行順序,方法是:簡單地調(diào)整onload處理函除了頁面初始化外,我們還可以通過各種交互來改變JavaScript代碼的執(zhí)行順序,如鼠標、鍵盤及時鐘觸發(fā)器等方法 ?問題一,找不到通過 varn= ?問題二,不同JavaScript引擎對輸出的外部導入 varn=1; 1.<scriptsrc=" "></script>同步模式,又稱阻塞模式,會 (如圖像)js之所以要同步執(zhí)行,是因為js中可能有輸出 簡單說:加載的網(wǎng)絡timeline是瀑布模型,而異步加載的timeline是并發(fā)模2.常見異步加載(ScriptDOMElement)(function()vars .createElement('script');s.type=s.async=s.src= varga ': + vars= {varpo (function()functionvars .createElement('script');s.type=s.async=s.src= varx x.parentNode.insertBefore(s,if(window.attachEvent)window.attachEvent('onload',async_load);window.addEventListener('load',async_load,這和前面的方式差不多,但關鍵是它不是立即開始異步加載jsonload 補充:DOMContentLoadedDOMContentLoaded:頁面( XHREvalScriptinScriptvarxhrObj=getXHRObject();xhrObj.onreadystatechange=function(){if(xhrObj.readyState!=4)return;variframe vardoc=iframe.contentWindow. 時候,獲取scripttexteval執(zhí)行。<scriptasync和defer1.defer 屬性。 2.async Firefox3.6、Opera10.5、IE9和 HTML4.01與HTML5沒有async屬性,script將立即獲取( 另參 說明:script態(tài)創(chuàng)建script元素)的方式?么直接在script中加上async屬性是最簡單的方式。。的js,而是在需要的時候或稍后再通過js的控制來異步加載。 andexecute)。 我們都知道通過網(wǎng)絡 script需要明顯的時間,但容易忽略了第二階段, 這些script可以延遲執(zhí)行,先異步 1.模擬較長 :vart_start=Number(newwhile(t_start+5000>Number(newDate())) <script 在IE6-7中script是順序 的,而不是現(xiàn)在的“并行 2.script放在頁面底部<script 在IE6-7中script是順 3.異步加載varse= se.src= ')[0].appendChild(se); 4.異步 +按需執(zhí)行(2010)varse=newImage();se.onload=registerScript();se.src= js與解析執(zhí)行js分離出 但是,前面已經(jīng)了,正常情況下,這是辦不到的,只functionvarfunctionf2(){alert(n);// Javascript語言特有的"鏈式作用域"結構(chainscope),。 functionvarn=999;}return}result();// 以函數(shù)內(nèi)部的變量,另一個就是讓這些變量的值始終保持在內(nèi)存內(nèi)存中,不會在調(diào)用結束后,被回收機制(garbagecollection 的公用方法(PublicMethod),把內(nèi)部變量當作它的私有屬性(privatevalue),這時一定要 Node-Node是一個命令行工具,你可 一個源碼包令行中輸入:nodemy_app.js。JS代碼將由V8javascriptengine運行,是它讓Chrome運行- ,然后大家開始工作。一旦有完成了一項任務,他就在國王房間外面排隊等著報告。國王在一個時間點只讓一個報告,有時候國王還會給這個的任務去解決。這樣我們不用擔心代碼同時相同的數(shù)據(jù),這就是JavaScript的單線程/循環(huán)機制的優(yōu)雅。據(jù)庫查詢花費掉了。有了node,你可以執(zhí)行所有查詢,這樣就Node.js被設計用來開發(fā)大規(guī)模高并發(fā)的網(wǎng)絡應用,這種網(wǎng)絡應用的瓶頸之一是在I/O的處理效率上。由于硬件及網(wǎng)絡的限制,I/O的速度往 模型,Node.js使用單一的Eventloop線程處理客戶請求,將I/O操作分派至各異步處理模塊,既解決了單線程模式下I/O阻塞的問題,又避上完成,即采用上面的第法。一旦遇到大量任務或者遇到一個模式"(synchronousI/O)或"堵塞模式"(blockingI/O)。"EventLoop是一個程序結構,用于等待和發(fā)送消息和 programmingconstructthatwaitsforanddispatcheseventsormessagesinaprogram.)“為"主線程";另一個負責主線其他進程(主要是各種I/O操作)的通信,被稱為"EventLoop線程"(可以譯為"消息線程")。 讓EventLoop線程去通知相應的I/O程序, 以用很少的資源,應付大流量的原因。 I/O請求,然后等I/O結果,結果返回后再對其進行操作,但這種請求I/O。這種處理方式雖然簡單,務器每創(chuàng)建一個線程,每個線程大概會占用2M的系統(tǒng)內(nèi)存,而且線 while(newDate().getTime()<now+1000)//do 操作,比如說,重置的尺寸,那也將阻塞所有其他的請求。 。 First-classfunction:例如function作為數(shù)據(jù)傳遞,包裹他們以在需I/O之后執(zhí)行。回調(diào)計數(shù)器:對于基于的回調(diào),你無法保證對于任何特殊令,I/O都會被執(zhí)行。所以,一旦你需要多次查詢來完成某個處理,通常回調(diào)中,通過對返回的數(shù)據(jù)庫查詢進行計數(shù))。查詢會被并發(fā)執(zhí)行,varhttp=varurl=varqs=URL地址,querystring模塊負責處理 varproverbs=["Theturtlewinstherace.","Godhidesinthedetails.","Therearetwowaystowrite programs;onlythethirdoneworks.","Perfectpracticemakesperfect."];這里為了方便,使用全局變量proverbs已有據(jù)庫。//Web服務器console.log("serverisrunning...");用Node.js發(fā)Web應用非常簡單,甚至不用 驅(qū)動模型的編程風格,在Node.jsvarpathname=console.log("Reqeustfor"+pathname+"if(pathname==="/"||pathname==="/index"||pathname==="/proverb"){}elseif(pathname==="/add")if(request.method.toLowerCase()=='post'){varbody='';request.on('data',function(data){body+=data;});request.on('end',function(){varPOST=
});}else}else in”}getProverb(response){varbody='<html>’++'charset=UTF-8"/>’++'</blockquote>'+'</body>’+'</html>';response.writeHead(200,{}
functionaddProverb(response){varbody='<html>'+'<head>'+'charset=UTF-8"++'<bodystyle="font-size:4em;line-height:1.2;margin-top:+'<formaction="/add"+'<textareaname="text"rows="10"+'<inputtype="submit"/>'+'</form>'++response.writeHead(200,{"Content-Type":}
functionadd(proverb,response){varbody='<html>’++'charset=UTF-8"/>’++'<bodystyle="font-size:4em;line-height:1.2;margin-top:+'<blockquote>'+proverb+'</blockquote>'++"Content-Type":} }} varmodule1=new_count:m1:functionm2:function = y-InvokedFunction varmodule1=var_count=varm1= varm2=function(){//... return{m1:m1,m2:m2 varmodule1=(functionmod.m3=function()varmodule1=(functionvarmodule1=(function($,YAHOO) Cherry的著名文章《JavaScriptModulePattern:In-Depth》。 模塊現(xiàn)在還沒有規(guī)范,這一點就更重要了。2009年,程序員RyanDahl創(chuàng)造了node.js項目,將javascript語言用 math.js,就可以像下面這樣加載:varmath=require('math');varmath=require('math');math.add(2,3);//5:varmath= math.add(2, AMD是"AsynchronousModuleDefinition"的縮寫,意思就是"異步模塊math.add(2,3); 一大堆的全局變量。通過延遲和按需加 阻塞式的并發(fā)式快速加載JavaScript代碼,使Web頁面上其他不依賴 、CSS以及其他DOM節(jié)點得以先加載完 AMD格式提供了幾個關鍵的好處。首先,它提供了一種緊湊的依 ,模塊名僅依賴其文件名通過將依賴性映射為局部變量,AMD鼓勵高效能的編碼實 或者模塊。如果 會造成全局變量的查找和眾多屬性的查找,增加了額外的開發(fā)工作同時降低了程序的性能。通過將模塊依賴性映射 某個功NeedJS一個輕量級的AMD : return{}define(['base'],function(base){return{//todowithmodule}}//initusers:[],// define(function(require,exports,module){varbase=require('base');//todowithmodule}除了define外,AMD還保留一個關鍵字require。require 留的全局標識符,可以實現(xiàn)為moduleloader。也可以不實現(xiàn)。RequireJScurlDojobdLoadJSLocalnetNodules如MooTools、jQuery、qwery、 甚至還有firebug<script<script <script js下面的main.js,這個文件會第一個被require.js加載。由于 ////somecode paths:"jquery":"jquery.min","backbone":"backbone.min"} paths:"jquery":"lib/jquery.min","backbone":"lib/backbone.min" baseUrl:paths:"jquery":"jquery.min","backbone":"backbone.min"}paths:} varadd=function(x,y){returnx+y;};return{add:add};加載方法如下://main.jsfunctionfoo(){}foo: require(['domready!'],function(doc){//calledoncetheDOMis paths:{}if(typeofdefine==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){returnjQuery;});} //ExposejQuerytotheglobalobject型)2、collections(集合)3、views(視圖) 銷毀和保存到服務端,當models中值被改變時自動觸發(fā)一個"change"、所有用于展示models數(shù)據(jù)的views都會偵聽到這個,然后進行重新渲染。Backbone.View中可以綁定domel和客戶端。頁面中的html就是通過views數(shù)據(jù),例如:varview=newEmployeeView({model:employee});models的創(chuàng)建,銷毀,校驗等一系列改變都會觸發(fā)相應的;邏輯。 備注中的代碼定義一個CollectionChapters,并通過add函數(shù)往該框的顯示信息為:“TheBeginningTheMiddleTheEnd”。 。我們可以通過備注中代碼所示方式定義為li varemployee=new 。model: <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0 <p><script te"type="text/tem </BODY></HTML>varApp=Models:Views:{},Controllers:{},Collections:{},new()//} url:function(){ } el:$("body"), te:$("#<spanstyle="font-family:monospace;white-space:pre; initialize:function(options){this.options=options;this.bind('change',this.render); returnthis}routes:{ o": o:function() oModel=newApp.Models. oView=newApp.Views. }}) 數(shù)據(jù)顯示分離的方法,這個方法的假設前提是如果業(yè)務邏輯被到一個的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶的方式。擊Web頁面中的超和發(fā)送HTML表單時,控制器本身不輸出任何東西高重用性:多個視圖可以共個模型,一個模型可以有多個視圖,人員可以自由發(fā)揮,做視圖的人和開發(fā)模型的人可以各定自己的 的 的速度,2.0WebformMVP MVP具有很多的變體,其中最為常用的一種變體成為PassiveView(被PassiveView,顧名思義,View是View盡可能不數(shù)據(jù)狀態(tài),因為其本身僅僅實現(xiàn)單純的、獨立的UI操作;Presenter才是整系的協(xié)調(diào)者,它根據(jù)處理用于交互的邏輯MVP是從經(jīng)典的模式MVC演變而來,它們的基本思想有相通的地方:并不直接使用Model,它們之間的通信是通過Presenter(MVC中的 數(shù)據(jù)而不是通過Controller。 在MVP里,P完全把Mo和Vw進行了分離,主要的程序邏輯在PPVw關過定義好的接口進行交,從而使得在變更Vw時候可以保持P的不!Vw,模擬用戶的各種操P試—。甚至可以Mo和Vw都沒有完成時候,就可以通過編寫MockOc(即Mod和Vw但內(nèi)P。在MVP里,應用程序的邏輯主要在P來實現(xiàn),其中的Vw是很薄的一層。因此就有人提出了Prt的設計模式,就是根據(jù)rory來首先PVw的息清楚就可以。在后面,根據(jù)需要再隨便更改Vw,而對P沒有任何的。I比較復雜,而且相關的顯示邏輯還跟Mo有關系,就可以Vw和Pr之間放置一個a個a來 Mol和Vw,避免兩者之間的關聯(lián)。而同,因為ar實現(xiàn)了Vw的接口,從P保Vw和P之間接口的簡I。MVPVw/的方法,用戶輸入和設置界面顯示的內(nèi)容,除
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務詳細供貨方案及質(zhì)量保證措施
- 教育資助支付保證措施
- 江西省宜春三中2025屆高二物理第二學期期末質(zhì)量跟蹤監(jiān)視模擬試題含解析
- 部編版三年級語文下冊教學學生測評范文
- 認罪認罰案件程序從簡問題研究
- 我國城市社區(qū)活動存在的問題及治理對策研究
- 農(nóng)產(chǎn)品產(chǎn)地到市場貨物供應及配送保障措施
- 學生自主學習教研計劃
- 中職旅游類專業(yè)學生課堂問題行為的成因與應對策略研究
- 蘇教版四年級數(shù)學階段目標復習計劃
- 商場夏季餐飲活動方案
- 2025年中國普通聚醚市場調(diào)查研究報告
- 倉儲部標簽管理制度
- 風機吊裝安全培訓
- 公司貿(mào)易合規(guī)管理制度
- CJ/T 461-2014水處理用高密度聚乙烯懸浮載體填料
- 小學保潔承包協(xié)議書
- 重慶中考:數(shù)學高頻考點
- 廠房圍墻承包協(xié)議書
- 國際壓力性損傷-潰瘍預防和治療臨床指南(2025年版)解讀
- 熊貓旅居簽署協(xié)議書
評論
0/150
提交評論