丨浏览器一个是如何工作阶段二_第1页
丨浏览器一个是如何工作阶段二_第2页
丨浏览器一个是如何工作阶段二_第3页
丨浏览器一个是如何工作阶段二_第4页
丨浏览器一个是如何工作阶段二_第5页
已阅读5页,还剩14页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们面讲到了HTTP的构成,但是我们有一部分没有详细讲解,那就是Response的bodyHTTPResponsebody,就要交给我们今天学习的内容去处HTML的结构不算太复杂,我们日常开发需要的90%的“词”(指编译原理的术语CDATA节点几种。HTMLSGML1<pclass="a">texttext如果我们从最小有意义单元的定义来拆分,第一个词(tokn)tokn个p肯是过大了(它甚至可以嵌套)。那么,只用p的开头是不是合适吗?我们考虑到起始也是会包含属性的,最小的意义单元其实是“<p”,所以“<p”就是我们的第一个词(token)。class=“a”属性;>“开始”的结束texttexttext</p>结束这是一段最简单的例子,类似的还有什么呢?现在我们可以来来看看这些词(tokn)在接受第一个字符之前,我们完全无法判断这是哪一个词(toknxCDATA的。在这样的条件下,浏览器工程师要想实现把字符流解析成词(token),绝大多数语言的词法部分都是用状态机实现的。那么我们来把部分词(tokn一个状态机看看:HTML的多。更详细的内容,你可以参考HTML文档,HTML文档规定了80个状态(顺便一说,HTML状态机的初始状态,我们仅仅区分“<”和“非<”:如果获得的是一个<字符,那么进入一个状态。CDATA如果下一个字符是“/”,那么可以确定进入了一个结束。HTMLC/C++和JavaScript异:我们把每个函数当做一个状态,参数是接受的字符,返回值是下一个状态函数。(我希望再次强调下,状态机真的是一种没有办法封装的东西,所以我们不要试图封装状JavaScriptdata1vardata=2{34}5{67}8else9{return}else{return}elsereturn}tagOpenState=functionif(c=="/")return}if(c.match(/[A-Z]/))token=new=return}if(c.match(/[a-z]/))token=new=return}if(c=="?") }elsereturn}这段代码给出了状态机的两个状态示例:data,tagOpenState个“<”字符,来判断类型的状态。这里的状态机,每一个状态是一个函数,通过“ifelse”来区分下一个字符做状态迁移。这varstate=varwhile(char=state=这段代码的关键一句是“state=state(char)”,不论我们用何种方式来字符串流,state来自TCP的输出流。emitTokentoken(词),我们只需要覆盖function2//状态函数们functiondata()// 7functiontagOpen()// //varstate=this.receiveInput=function(char)state= 16构建DOM接下来我们要把这些简单的词变成DOM树,这个过程我们是使用栈来实现的,任何语言几乎都有栈,为了给你跑着玩,我们还是用JavaScript来实现吧,毕竟JavaScript中的栈只functionvarstack=[newHTMLthis.receiveInput=function(token)45}6this.getOutput=7return8}9}我们这样来设计HTML的语法分析器,receiveInput(token),通常可以由emitToken在接收的同时,即开始构建DOM树,所以我们的主要构建DOM树的算法,就写在receiveInputDOM就是这个stack的第一项。DOMNodeNodeHTMLNode简化,就不完整实现这个继承体系了。我们仅仅把Node分为Element和Text(如果是基于类的OOP的话,我们还需要抽象工厂来创建对象),functionthis.childNodes=3functionthis.value=value||6tagstarttagendTextText(token)入栈时,检查栈顶是否是Text节点,如果是的话就合并Text节点<htmlmaaa=a<imgsrc="a"通过这个栈,我们可以构建DOM树:tagstart遇到tagend就出栈一个节点(还可以检查是否匹配)。我在文章里面放了一个,你可以点击查看用栈构造DOM树的全过程0:000:00/当我们的源代码完全遵循xhtml(这是一种比较严谨的HTML语法)时,这非常简单问HTMLtagendstarttagW3C我们只要翻译成对应的代码就好了,以下这个呈现了全部规则。你可以点击查看。解析代码和构建DOM树两个步骤。在解析代码的环节里,我们一起详细地分析了一个词 售卖。页面已增加防盗追踪,将依 上一 10|浏览器:一个浏览器是如何工作的?(阶段一下一 12|浏览器:一个浏览器是如何工作的(阶段三阿 40参考了上的一个gist,才算写出来个能跑起来的曼塔 9returntagOpenreturn 作者回复: 7之前在看Webkit技术这本书,记的笔记。结合老师的文章,了解的更深了。谢谢是零壹 3 王 2瞧,这个 Marph

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论