dom构建渲染过程

dom构建渲染过程,第1张

1、构建DOM树(parse):渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM node(包括js生成的标签)生成内容树(Content Tree/DOM Tree);

2、构建渲染树(construct):解析对应的CSS样式文件信息(包括js生成的样式和外部css文件),而这些文件信息以及HTML中可见的指令(如<b></b>),构建渲染树(Rendering Tree/Frame Tree);

3、布局渲染树(reflow/layout):从根节点递归调用,计算每一个元素的大小、位置等,给出每个节点所应该在屏幕上出现的精确坐标;

4、绘制渲染树(paint/repaint):遍历渲染树,使用UI后端层来绘制每个节点。

重排必定引起重绘,重绘不一定是重排引起的。

不影响位置大小的,单纯为重绘即可 比如修改color 等。

(1)直接改变元素的className

(2)display:none;先设置元素为display:none;然后进行页面布局等 *** 作;设置完成后将元素设置为display:block;这样的话就只引发两次重绘和重排;

(3)不要经常访问浏览器的flush队列属性;如果一定要访问,可以利用缓存。将访问的值存储起来,接下来使用就不会再引发回流;

(4)使用cloneNode(true or false) 和 replaceChild 技术,引发一次回流和重绘;

(5)将需要多次重排的元素,position属性设为absolute或fixed,元素脱离了文档流,它的变化不会影响到其他元素;

(6)如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document;

js里没有用到‘#’的代码端,一般'#'是在jQuery 有用到,一般用于id选择元素使用。

JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。

它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档 *** 作、事件处理、动画设计和Ajax交互。

扩展资料

jQuery的模块可以分为3部分:入口模块、底层支持模块和功能模块。

在构造jQuery对象模块中,如果在调用构造函数jQuery()创建jQuery对象时传入了选择器表达式,则会调用选择器Sizzle(一款纯JavaScript实现的CSS选择器引擎,用于查找与选择器表达式匹配的元素集合)遍历文档。

查找与之匹配的DOM元素,并创建一个包含了这些DOM元素引用的jQuery对象。

浏览器功能测试模块提供了针对不同浏览器功能和bug的测试结果,其他模块则基于这些测试结果来解决浏览器之间的兼容性问题。

在底层支持模块中,回调函数列表模块用于增强对回调函数的管理,支持添加、移除、触发、锁定、禁用回调函数等功能;

异步队列模块用于解耦异步任务和回调函数,它在回调函数列表的基础上为回调函数增加了状态,并提供了多个回调函数列表,支持传播任意同步或异步回调函数的成功或失败状态;数据缓存模块用于为DOM元素和Javascript对象附加任意类型的数据;

队列模块用于管理一组函数,支持函数的入队和出队 *** 作,并确保函数按顺序执行,它基于数据缓存模块实现。

在功能模块中,事件系统提供了统一的事件绑定、响应、手动触发和移除机制,它并没有将事件直接绑定到DOM元素上,而是基于数据缓存模块来管理事件;Ajax模块允许从服务器上加载数据,而不用刷新页面,它基于异步队列模块来管理和触发回调函数;

动画模块用于向网页中添加动画效果,它基于队列模块来管理和执行动画函数;属性 *** 作模块用于对HTML属性和DOM属性进行读取、设置和移除 *** 作;DOM遍历模块用于在DoM树中遍历父元素、子元素和兄弟元素;DOM *** 作模块用于插入、移除、复制和替换DOM元素;

样式 *** 作模块用于获取计算样式或设置内联样式;坐标模块用于读取或设置DOM元素的文档坐标;尺寸模块用于获取DOM元素的高度和宽度。

参考资料来源:百度百科-jQuery

$(function(){})函数当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,执行。

此事件等同于jquery的ready()事件的一种语法,完整的三种如下:

$(document)ready(function)

$()ready(function)

$(function)

简单地说,这个方法纯粹是对向windowload事件注册事件的替代方法。通过使用这个方法,可以在DOM载入就绪能够读取并 *** 纵时立即调用你所绑定的函数,而9999%的JavaScript函数都需要在那一刻执行。

$(function () {var opName = getUrlParam('opname');// var opName = "OP3040";documentgetElementById("txtName")value = opName;getplan(opName);getopname(opName);// getplan(opName);connect();getFoucs();InitGrid();});

F5的时候,页面刷新,重新读取DOM节点完成后,自动执行ready()函数里面的函数体。

$('ID')只是选中某个元素,比如你的函数第三行:  documentgetElementById("txtName")。并没有执行函数的含义。

扩展资料

jQuery的模块可以分为3部分:入口模块、底层支持模块和功能模块。

在构造jQuery对象模块中,如果在调用构造函数jQuery()创建jQuery对象时传入了选择器表达式,则会调用选择器Sizzle(一款纯JavaScript实现的CSS选择器引擎,用于查找与选择器表达式匹配的元素集合)遍历文档,查找与之匹配的DOM元素,并创建一个包含了这些DOM元素引用的jQuery对象。

浏览器功能测试模块提供了针对不同浏览器功能和bug的测试结果,其他模块则基于这些测试结果来解决浏览器之间的兼容性问题。

在底层支持模块中,回调函数列表模块用于增强对回调函数的管理,支持添加、移除、触发、锁定、禁用回调函数等功能;异步队列模块用于解耦异步任务和回调函数,它在回调函数列表的基础上为回调函数增加了状态,并提供了多个回调函数列表,支持传播任意同步或异步回调函数的成功或失败状态。

数据缓存模块用于为DOM元素和Javascript对象附加任意类型的数据;队列模块用于管理一组函数,支持函数的入队和出队 *** 作,并确保函数按顺序执行,它基于数据缓存模块实现。

在功能模块中,事件系统提供了统一的事件绑定、响应、手动触发和移除机制,它并没有将事件直接绑定到DOM元素上,而是基于数据缓存模块来管理事件。

Ajax模块允许从服务器上加载数据,而不用刷新页面,它基于异步队列模块来管理和触发回调函数;动画模块用于向网页中添加动画效果,它基于队列模块来管理和执行动画函数;

属性 *** 作模块用于对HTML属性和DOM属性进行读取、设置和移除 *** 作;DOM遍历模块用于在DoM树中遍历父元素、子元素和兄弟元素。

DOM *** 作模块用于插入、移除、复制和替换DOM元素;样式 *** 作模块用于获取计算样式或设置内联样式;坐标模块用于读取或设置DOM元素的文档坐标;尺寸模块用于获取DOM元素的高度和宽度。

jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。

它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档 *** 作、事件处理、动画设计和Ajax交互。

jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 60+、FF 15+、Safari 20+、Opera 90+等。

技术应用

只需要少量的代码,即可将它们集成到网站上,并且能够帮助访问者分享网站上的内容。 [12]

移动端

JQuery Mobile 1 2是JQuery运行在手机和平板设备上的版本。JQuery Mobile 1 2给主流移动平台提供了JQuery的核心库,发布了一个完整统一的JQuery移动UI设计框架,在不同的智能手机和桌面电脑的web浏览器上形成统一的用户UI。

支持全球主流的移动平台,对每个平台的支持分为三个等级:A、B、C,实现了对Android 21-23、32、40、4 1、Palm WebOS 14-20、30、Firefox Mobile 15,Opera Mobile 115-12等平台的A级支持。

JQuery Mobile 1 2的核心使得基本的HTML标签在所有的浏览器中生效,并且对网页的行为和效果均进行了增强,让网页在等级较高的浏览器中能获得优秀的体验,在较差的浏览器中也能正常的使用。

参考资料:

百度百科 jQuery的工作原理

    1nodenodeName:查看节点名称(元素节点返回标签名(大写),文本节点返回 #text)

    2nodenodeType:查看节点类型(元素节点返回1,属性节点返回2,文本节点返回3)

    3nodenodeValue:查看节点的值(元素节点返回null,文本节点返回文本值)

    DOM对象集合了HTML标签中能被解析的属性(标准属性)作为DOM对象的属性

    查询到的input节点包含了type、name、value等属性,其他未设置值的属性也包含在节点对象中

    1nodeoffsetLeft:元素在页面中的水平坐标值

    2nodeoffsetTop:元素在页面中的垂直坐标值

    3nodeclientWidth:元素在页面视口区域占据的宽度(不含边框)

    4nodeclientHeight:元素在页面视口区域占据的高度(不含边框)

    5nodeoffsetWidth:元素在页面区域占据的宽度(含边框)

    6offsetHeight:元素在页面区域占据的高度(含边框)

    7scrollLeft:窗口或者容器内容水平滚动的距离

    8scrollTop:窗口或者容器内容垂直滚动的距离

融在第三点最后了

    1方法名innerHTML(包含了此方法对应的对象内所有空白文本以及标签在内的所有内容)

    2方法名innerText(包含了此方法对应的对象内文本内容且空白文本除外)

    1nodegetAttribute():读取节点的属性值

    2nodesetAttribute():设置节点属性值

    3noderemoveAttribute():删除节点的属性

    4nodehasAttribute():检测节点是否存在某属性

    1方法名querySelector(选择器):按CSS样式查询,返回第一个节点

    2nodequerySelectorAll(选择器):按CSS样式查询,返回所有节点集合

    3nodegetElementsByTagName(tname):查询node下面所有标签名为tname的元素集合

    4nodegetElementsByClassName(cname):查询node下面所有类名为cname的元素集合

    1往父节点插入子节点并指定所有元素的后面

        父级方法名appendChild(插入的元素)  

    2往父节点插入子节点并指定在某个子元素的前面

        父级方法名insertBefore(插入的元素,插入的元素后的一个元素名)

    注意:在dom中插入节点都是基于父节点来完成的

    1 父级方法名removeChild(子级元素):删除父级元素中的子级节点

    1父级方法名replaceChild(new,old):将父级元素中的old节点替换成一个新的new节点

    1浅复制:nodecloneNode():只复制此元素不包含子元素

    2深复制:nodecloneNode(true):复制此元素且包含子元素

    1父级元素hasChildNodes() :检测节点是否含有子节点,包括空白节点    

    1nodeparentNode:node的父节点

    2nodechildNodes :node所有子节点

    3nodechildren:node所有子元素 

    4nodefirstChild:node的第一个子节点

    5nodefirstElementChild:node的第一个子元素 

    6nodelastChild :node的最后一个节点

    7nodelastElementChild:的最后一个元素

    8nodenextSibling:node的下一个兄弟节点

    9nodenextElementSibling:node的下一个兄弟元素

    10nodepreviousSibling:node的前一个兄弟节点

    11nodepreviousElementSibling:node前一个兄弟元素

十四、节点样式 *** 作

    1html标签中集合了style的标准属性因此可以使用 DOMstyle访问样式, 注意 它只能访问使用style定义的内联样式,而不能访问内部和外链样式,且访问样式需要使用驼峰替代" - "

    2当CSS样式较多时,可以使用DOMcssText来重置。

    3windowgetComputedStyle():返回一个对象,该对象在应用活动样式表并解析这些值可能包含的任何基本计算后,报告元素的所有CSS属性的值

浏览器渲染引擎工作流程都差不多,大致分为5步,创建DOM树——创建StyleRules——创建Render树——布局Layout——绘制Painting

第一步,用HTML分析器,分析HTML元素,构建一颗DOM树(标记化和树构建)。

第二步,用CSS分析器,分析CSS文件和元素上的inline样式,生成页面的样式表。

第三步,将DOM树和样式表,关联起来,构建一颗Render树(这一过程又称为Attachment)。每个DOM节点都有attach方法,接受样式信息,返回一个render对象(又名renderer)。这些render对象最终会被构建成一颗Render树。

第四步,有了Render树,浏览器开始布局,为每个Render树上的节点确定一个在显示屏上出现的精确坐标。

第五步,Render树和节点显示坐标都有了,就调用每个节点paint方法,把它们绘制出来。

原文章出处

>

一、触摸事件

ontouchstart、ontouchmove、ontouchend、ontouchcancel

目前移动端浏览器均支持这4个触摸事件,包括IE。由于触屏也支持MouseEvent,因此他们的顺序是需要注意的:touchstart → mouseover → mousemove → mousedown → mouseup → click1

Apple在iOS 20中引入了 触摸事件API ,Android正迎头赶上这一事实标准,缩小差距。最近一个W3C工作组正合力制定这一 触摸事件规范 。

二、规范

这里我们介绍几种普及得比较好的触摸事件,你可以在绝大多数现代浏览器中来测试这一事件(必须是触屏设备哦):

touchstart: 触摸开始的时候触发

touchmove: 手指在屏幕上滑动的时候触发

touchend: 触摸结束的时候触发

而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点(用来实现多点触控):

touches: 当前位于屏幕上的所有手指的列表。

targetTouches: 位于当前DOM元素上手指的列表。

changedTouches: 涉及当前事件手指的列表。

每个触摸点由包含了如下触摸信息(常用):

identifier: 一个数值,唯一标识触摸会话(touch session)中的当前手指。一般为从0开始的流水号(android41,uc)

target: DOM元素,是动作所针对的目标。

pageX / pageX / clientX / clientY/screenX/screenY : 一个数值,动作在屏幕上发生的位置(page包含滚动距离,client不包含滚动距离,screen则以屏幕为基准)。

radiusX / radiusY/ rotationAngle: 画出大约相当于手指形状的椭圆形,分别为椭圆形的两个半径和旋转角度。初步测试浏览器不支持,好在功能不常用,欢迎大家反馈。

有了这些信息,我们就可以依据这些事件信息为用户提供不同的反馈了。

下面,我将为大家展示一个小demo,用touchmove实现的单指拖动:

三、手势事件

手势是指利用多点触控进行旋转、拉伸等 *** 作,例如、网页的放大、旋转。需要两个或以上的手指同时触摸时才会触发手势事件。关于缩放我们需要注意的一点 是元素的位置坐标:我们通常使用offsetX、getBoundingClientRect等方法获取元素的位置坐标,但在手机浏览器中页面经常会在使 用中被缩放,那缩放后的元素坐标会改变吗?答案是有所差异。用一个情景来说明这个问题:页面A加载完成后, JavaScript 获 取到该元素在document中的坐标为(100,100),接着用户放大了页面,此时用JavaScript再次输出元素坐标,依然还是 (100,100),但该元素在屏幕上的响应区域会根据缩放比例产生偏移。你可以打开那个打砖块游戏demo,等页面完全加载完成后,再放大,此时你会发 现即使手指触摸在“touch here”区域外部,也可以控制到球板,因为区域发生了偏移。除非页面刷新或者恢复缩放,否则偏移量将一直存在。

四、重力感应

重力感应较简单,只需要为body节点添加onorientationchange事件即可。在此事件中由windoworientation属性得到代表当前手机方向的数值。windoworientation的值列表如下:

0:与页面首次加载时的方向一致

-90:相对原始方向顺时针转了90°

180:转了180°

90:逆时针转了90°据我测试,Android21尚未支持重力感应。以上即目前的触屏事件,这些事件尚未并入标准,但已被广泛使用。本人Android21,未在其他环境下测试。

以上就是关于dom构建渲染过程全部的内容,包括:dom构建渲染过程、"#"在js中代表什么、jquery中的$(function(){...})什么时候执行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9651501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存