`
lixinlixin2008
  • 浏览: 152385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一段耗时代码中如何提前reflow和repaint

阅读更多
请看一下startTest函数,首先改变一个div样式,然后执行一段耗时的操作,可以看到startTest函数结束以后,
页面才会重新reflow和repaint,即使写成 onclick="startTest();startTest2()" 效果也依然是一样的(opera除外), 这是由javascript引擎的单线程引起的,我们知道,javascript引擎是单线程的,只有一个任务结束以后,
页面才会重新reflow和repaint,如果想要设置的样式马上生效而不想等后面那段罗嗦的代码执行完再reflow和repaint,怎么办呢?
解决方法:
只有当一个任务执行完毕之后GUI渲染线程才会执行,我们可以用setTimeout将startTest2函数排入待执行任务队列的下一个位置,这样startTest函数执行完毕以后页面会立即reflow和repaint,
我们就可以看见设置的样式生效了,而startTest2()这段罗里罗嗦的代码执行时间就排在reflow和repaint之后了,呵呵


另外,貌似opera的执行机制和其他浏览器不大一样
以上是本人的分析,不知道真实情况是不是这样的,期待有盆友能在回复中给出答案,不尽感激


关于javascript引擎单线程的特性,可以参加Rock兄的blog: http://www.bgscript.com/archives/256

里面有关的文字摘录如下:

"GUI渲染线程:

        该线程负责渲染浏览器界面HTML元素,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行.
        本文虽然重点解释JavaScript定时机制,但这时有必要说说渲染线程,因为该线程与JavaScript引擎线程是互斥的,
        这容易理解,因为 JavaScript脚本是可操纵DOM元素,在修改这些元素属性同时渲染界面,那么渲染线程前后获得的元素数据就可能不一致了."

        ”在JavaScript引擎运行脚本期间,浏览器渲染线程都是处于挂起状态的,也就是说被”冻结”了.
        所以,在脚本中执行对界面进行更新操作,如添加结点,删除结点或改变结点的外观等更新并不会立即体现出来,
        这些操作将保存在一个队列中,待 JavaScript引擎空闲时才有机会渲染出来.或许这里你有个疑问了,
        为什么JS代码块的alert时界面有更新的,JS不是正在运行吗?其实当 alert发生时,浏览器内核就会挂起JavaScript引擎线程,并促使界面执行了更新.

        “

by:  天堂左我往右



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
	<head>
	    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<style>
		html{
		    border:1px solid red;
		}
		.div1{
		    width:100%;
		    height:500px;;
		    position: absolute;
		    background: blue;
		    display:none;
		    filter: alpha(opacity=50);
		    opacity:.5;
		    
		}
		
		</style>
	</head>
	<body onload="" style='cursor:crosshair'>
	    <div id="div_1" class="div1"><img src="http://www.google.cn/logos/arborday10-hp.gif" /></div>
		<input type=button value=test onclick="startTest();" />
		
		
	</body>
	</html>
	<script>

	    function startTest(){
	        document.getElementById("div_1").style.display="block";
	        document.getElementById("div_1").style.height = "800px";
	        
	        //这样就ok了
	        //setTimeout(startTest2,0);
	        
	        startTest2();
	    }
	    
	    function startTest2(){
	        var d1 = new Date();
	        var t1 = d1.getTime();
	        while(true){
	            var d2 = new Date();
	            var t2 = d2.getTime();
	            
	            if(t2-t1>2000){
	                break;
	            }
	        }
	        alert("完毕");
	    }
	</script>

0
1
分享到:
评论

相关推荐

    如何减少浏览器的reflow和repaint

    `reflow`(回流)和`repaint`(重绘)是浏览器在更新页面布局和视觉表现时的两个关键过程。理解并有效地减少这两者的发生,能够显著提升网页加载速度和交互响应。以下是一些基于项目经验的策略来降低`reflow`和`...

    JavaScript中的Repaint和Reflow用法详解

    JavaScript是前端开发中不可或缺的编程语言,其中页面渲染相关的概念Repaint和Reflow是理解其性能优化的关键。Repaint,中文翻译为重绘,是指当页面中元素的样式发生变化,但不影响其在页面中的位置时,浏览器仅仅把...

    有关javascript的性能优化 (repaint和reflow)

    理解并优化repaint和reflow是JavaScript性能优化的重要一环。遵循上述建议,可以有效地减少不必要的重绘和渲染,从而提高页面的响应速度和整体性能。同时,关注Yahoo!性能工程师Nicole Sullivan等专家的研究成果,...

    Adobe Edge Reflow Preview下载

    Adobe Edge Reflow Preview是一款由Adobe公司推出的网页设计工具,它主要针对现代网页设计中的响应式布局和CSS3动画。在“Adobe Edge Reflow Preview”这个标题中,我们可以明确这款软件是用于预览和创建Web项目的,...

    Android代码-reflow-animator

    Reflow Text Animator A port of Plaid's ReflowText that allows easily transitioning between sibling TextViews - no matter their size or style. Usage To move and transform fromView into toView: new ...

    swift-Reflow是一个Objective-C单向数据流方案

    Swift-Reflow是一个专门为Objective-C设计的单向数据流解决方案,灵感来源于...在探索Swift-Reflow的源代码(如Reflow-master压缩包中的文件)时,你可以深入了解其实现细节,并将其应用于你的项目中,提升代码质量。

    渲染篇 5:最后一击——回流(Reflow)与重绘(Repaint)(1).md

    在前端性能优化的领域中,回流(Reflow)与重绘(Repaint)是非常关键的概念。它们是浏览器渲染过程中最常见、也最影响性能的两个步骤。为了深入理解这两个概念,我们首先需要了解浏览器的渲染流程。 在用户通过...

    Reflow Oven_reflowoven_arduino_diy_

    描述中的“DIY reflow oven code for arduino”表明这个项目是关于编写自定义的Arduino代码,以控制一个DIY再流炉。这意味着我们将讨论如何利用Arduino微控制器的编程能力来实现对加热系统的智能化控制。 **知识点...

    如何高效设定Reflow温度曲线

    ### 如何高效设定Reflow温度曲线 在表面贴装技术(SMT)中,回流焊作为连接电子元...《如何高效设定Reflow温度曲线》提供了丰富的理论指导和实践建议,对于从事SMT制造的工程师和技术人员来说,是一份不可或缺的手册。

    reflow-animator.zip

    博客附件中包含的"reflow-animator"文件就是这个库的核心代码,通过阅读和研究,我们可以学习如何将它集成到自己的项目中。 二、使用方法 1. 引入库:首先,你需要在项目中引入Reflow Animator库。如果你使用...

    Standard Reflow Profile

    ### Standard Reflow Profile知识点 #### 一、标准回流焊简介 回流焊是一种通过将焊膏熔化形成金属间化合物来实现电子元器件与电路板之间电气连接的技术。本文件详细介绍了适用于标准封装和无铅封装的标准回流焊...

    HTML解析原理.docx

    HTML解析原理是Web前端开发中的核心概念,理解这一原理对于优化网页性能至关重要。浏览器的渲染过程涉及多个步骤,包括解析HTML、CSS...在实际开发中,应尽可能减少reflow和repaint的次数,以优化页面加载和交互速度。

    HTML解析原理.pdf

    reflow和repaint是浏览器渲染过程中的重要环节,频繁的reflow会显著降低页面性能。因此,优化页面渲染的关键在于减少不必要的reflow。例如,为图片预先设定宽度和高度可以避免图片加载后引起的布局变化。此外,尽量...

    CSS reflow实例教程

    在实际操作中,reflow涉及到很多布局的计算,因此是一个比较耗时的操作。在开发过程中,如果能够避免不必要的reflow,将大大提升页面的性能。这就要求开发者在写代码时,尽量减少页面元素的变动,尤其是对DOM的改动...

    Ersa Reflow

    其中提到的“变频器”是该设备中的一个关键组成部分,主要用于调节电机转速,从而控制炉子内部的输送带速度,确保PCB板能够按照预设的时间和温度曲线通过不同的加热区。 ### 变频器型号及规格 文档中提到了两种...

    sisterAn#blog#浏览器的重绘与回流(Repaint、Reflow)1

    1. 浏览器渲染机制 2. 重绘 3. 回流 4. 浏览器优化 5. 减少重绘与回流

    Ruby-gitreflow敏捷团队的自动化质量控制流程

    Ruby-gitreflow是一个专为敏捷开发团队设计的自动化质量控制工具,它基于Git版本控制系统,旨在简化和加强软件开发过程中的代码审查、测试和部署环节。这个工具的目的是提高团队效率,确保代码质量和遵循敏捷开发的...

Global site tag (gtag.js) - Google Analytics