当前位置:  编程技术>WEB前端
本页文章导读:
    ▪了解html页面的渲染过程(续)      昨天晚上写了一篇关于浏览器的渲染过程的随笔,但只是通过一小段代码解释了一下,并没有通过浏览器测试,说服力不够,而且还有很多不完善的地方,今天在浏览器中测试了一下,并把测.........
    ▪JS:2.1,流程控制(if,switch)高级      ylbtech-流程控制:流程控制(if,switch)高级if语句ifif-elseif-else_if-elseswitchJS:2.1.0,if语句 返回顶部If 语句如果希望指定的条件成立时执行代码,就可以使用这个语句。语法:if (条件) { 条件成立时.........
    ▪Node.js高级编程:用Javascript构建可伸缩应用(3)2.3 核心API基础-加载模块      本系列文章列表和翻译进度,请移步:Node.js高级编程:用Javascript构建可伸缩应用(〇)本文对应原文第二部分第三章:Node Core API Basics:Loading Modules文章是从Word复制到wordpress,版面有些不一.........

[1]了解html页面的渲染过程(续)
    来源:    发布时间: 2013-11-06

昨天晚上写了一篇关于浏览器的渲染过程的随笔,但只是通过一小段代码解释了一下,并没有通过浏览器测试,说服力不够,而且还有很多不完善的地方,今天在浏览器中测试了一下,并把测试的结果分享给大家,测试过程可能有点乱,希望大家理解。

测试浏览器:Chrome v24.0.1312.52 m,Firefox v18.0,Opera v12.12。

在WebKit内核中,网页在显示的时候会有一个解析器(Parser)去解析html文档,然后去生成渲染树(Render Tree),最终渲染出页面。这是在一个线程中进行的,所以两者不会同时进行。

我分为了以下两种情况,并分别在不同的浏览器中进行测试。

  • 样式文件在head里,其他的连个脚本文件一个在body的开始部分,一个在body的底部。
  • 样式文件在body的开始部分,脚本文件的位置和上面的一样。

测试的结果是这样的,在chrome中,样式文件的位置会影响到图片的下载时间,而在另外两个浏览器中这两种情况没有区别。下面是详细的测试过程。

测试一:样式文件在head里,其他的连个脚本文件一个在body的开始部分,一个在body的底部。

测试的代码:

1 <!doctype html>
2 <html>
3 <head>
4 <title>测试页面</title>
5 <link rel="stylesheet" type="text/css" href="/blog_article/example/sleep/3.html" />
6 </head>
7 <body>
8 <div>
9 Hi, there!</div>
10
11 <script type="text/javascript">
12 document.write("<script src='/blog_article/other/sleep/5.html'></scr" + "ipt>");
13 </script>
14
15 <div>
16 Hi, again!</div>
17 <img src="/blog_article/images/marx.jpg" alt="Marx" />
18 <img src="/blog_article/images/engels.jpg" alt="Engels" />
19 <img src="/blog_article/images/Lenin.jpg" alt="Lenin" />
20
21 <script src="/blog_article/last.html" type="text/javascript"></script>
22
23 </body>
24 </html>

1、在Chrome中的测试情况

我在浏览器中打开页面后,迅速将网页截了一张图,如下所示(点击可以查看大图,下同):

 

从上图中可以看出,test.htm 文档已经加载完成,页面上还没有显示任何东西,example.css处于pending状态,但是,位于最底部的last.js却加载完成了。这说明chrome进行了预加载,提前下载,放在了浏览器的缓存里了。虽然last.js已经加载完成,但是还没有被执行,因为他前面的样式文件会阻塞脚本的执行。

接下来,当example.css加载完成后,Hi there!显示在了屏幕上,浏览器的截图如下所示:

 

通过网络请求可以看出,example.css已经加载完成,other.js处于pending状态,但此时script标签底下的三张图片已经下载下来了,这是由浏览器的预先加载的功能所致。但是由于浏览器的渲染被other.js脚本阻塞住,所以,这三张图片连同它上面的“Hi again”都不会显示出来。另外,此时last.js中的代码还没有执行。

接下来,当other.js加载完成之后,浏览器就会构建出渲染树,显示出“Hi again”,并显示出图片。由于last.js先前已经被下载,所以last.js会立即执行。整个渲染过程完成。如下图所示:

 

由此看出,Chrome会预先加载body中的脚本资源(样式文件没有测试),由JavaScript脚本动态加载的JS不会影响图片文件的下载,但是会影响它下面图片的渲染。

 

2、Firefox中的测试结果


    
[2]JS:2.1,流程控制(if,switch)高级
    来源:    发布时间: 2013-11-06
ylbtech-流程控制:流程控制(if,switch)高级
  • if语句
  • if
  • if-else
  • if-else_if-else
  • switch
JS:2.1.0,if语句 返回顶部

If 语句

如果希望指定的条件成立时执行代码,就可以使用这个语句。

语法:

if (条件) { 条件成立时执行代码 }

注意:请使用小写字母。使用大写的 IF 会出错!

实例 1

<script type="text/javascript">
//Write a "Good morning" greeting
if //the time is less than 10
var d=new Date()
var time=d.getHours()
if (time<10)
{ document.write("<b>Good morning</b>") }
</script>

实例 2

<script type="text/javascript">
//Write "Lunch-time!"
if the time is 11
var d=new Date()
var time=d.getHours()
if (time==11)
{ document.write("<b>Lunch-time!</b>") }
</script>

注意:请使用双等号 (==) 来比较变量!

注意:在语法中没有 else。仅仅当条件为 true 时,代码才会执行。

JS:2.1.1,if 返回顶部
<html>
<body>

<script type="text/javascript">
var d = new Date()
var time = d.getHours()

if (time < 10)
{
document.write("<b>早安</b>")
}
</script>

<p>本例演示 If 语句。</p>

<p>如果浏览器时间小于 10,那么会向您问“早安”。</p>

</body>
</html>
JS:2.1.2,if-else 返回顶部
<html>
<body>

<script type="text/javascript">
var d = new Date()
var time = d.getHours()

if (time < 10)
{
document.write("<b>早安</b>")
}
else
{
document.write("<b>祝您愉快</b>")
}
</script>

<p>本例演示 If...Else 语句。</p>

<p>如果浏览器时间小于 10,那么会向您问“早安”,否则会向您问候“祝您愉快”。</p>

</body>
</html>
JS:2.1.2,if-else_if-else 返回顶部
<html>
<body>

<script type="text/javascript">
var d = new Date()
var time = d.getHours()
    
[3]Node.js高级编程:用Javascript构建可伸缩应用(3)2.3 核心API基础-加载模块
    来源:    发布时间: 2013-11-06

本系列文章列表和翻译进度,请移步:Node.js高级编程:用Javascript构建可伸缩应用(〇)

本文对应原文第二部分第三章:Node Core API Basics:Loading Modules

文章是从Word复制到wordpress,版面有些不一致,可以点这里下载本文的PDF版。

第三章:加载模块

本章内容:

  • 加载模块
  • 创建模块
  • 使用node_modules目录

 

JavaScript是世界上使用频率最高的编程语言之一,它是Web世界的通用语言,被所有浏览器所使用。JavaScript的诞生要追溯到Netscape那个时代,它的核心内容被仓促的开发出来,用以对抗Microsoft,参与当时白热化的浏览器大战。由于过早的发布,无可避免的造成了它的一些不太好的特性。

尽管它的开发时间很短,但是JavaScript依然具备了很多强大的特性,不过,每个脚本共享一个全局命名空间这个特性除外。

一旦Web页面加载了JavaScript代码,它就会被注入到全局命名空间,会和其他所有已加载的脚本公用同一个地址空间,这会导致很多安全问题,冲突,以及一些常见问题,让bug即难以跟踪又很难解决。

不过谢天谢地,Node为服务器端JavaScript定了一些规范,还实现了CommonJS的模块标准,在这个标准里,每个模块有自己的上下文,和其他模块相区分。这意味着,模块不会污染全局作用域,因为根本就没有所谓的全局作用域,模块之间也不会相互干扰。

本章,我们将了解几种不同的模块以及如何加载它们。

把代码拆分成一系列定义良好的模块可以帮你掌控你的应用程序,下面我们将学习如何创建和使用你自己的模块。

了解Node如何加载模块

Node里,可以通过文件路径来引用模块,也可以通过模块名引用,如果用名称引用非核心模块,Node最终会把模块名影射到对应的模块文件路径。而那些包含了核心函数的核心模块,会在Node启动时被预先加载。

非核心模块包括使用NPM(Node Package Manager)安装的第三方模块,以及你或你的同事创建的本地模块。

每个被当前脚本导入的模块都会向程序员暴露一组公开API,使用模块前,需要用require函数来导入它,像这样:

var module = require(‘module_name’)

上面的代码会导入一个名为module_name的模块,它可能是个核心模块,也可以是用NPM安装的模块,require函数返回一个包含模块所有公共API的对象。随模块的不同,返回的对象可能是任何JavaScript值,可以是一个函数,也可以是个包含了一系列属性(函数,数组或者任何JavaScript对象)的对象。

导出模块

CommonJS模块系统是Node下文件间共享对象和函数的唯一方式。对于一个很复杂的程序,你应该把一些类,对象或者函数重构成一系列良好定义的可重用模块。对于模块使用者来说,模块仅对外暴露出那些你指定的代码。

在下面的例子里你将会了解到,在Node里文件和模块是一一对应的,我们创建了一个叫circle.js的文件,它仅对外导出了Circle构造函数。

        function Circle(x, y, r) {

                            function r_squared() {

                                     return Math.pow(r, 2);

                            }

                            function area() {

                                     return Math.PI * r_squared();

                            }

                            return {

                                     area: area

                            };

                   }

                   module.exports = Circle;

代码里最重要的是最后一行,它定义了模块对外导出了什么内容。module是个特殊的变量,它代表当前模块自身,而module.exports是模块对外导出的对象,它可以是任何对象,在这个例子里,我们把Circle的构造函数导出了,这样模块使用者就可以用这个模块来创建Circle实例。

你也可以导出一些复杂的对象,module.exports被初始化成一个空对象,你把任何你想暴露给外界的内容,作为module.exports对象的属性来导出。比如,你设计了一个模块,它对外暴露了一组函数:

                  function printA() {

                            console.log('A');

                   }

                   function printB() {

                            console.log('B');

                   }

                   function printC() {

                            console.log('C');

                   }

                   module.exports.printA = printA;

                   module.exports.printB = printB;

                   module.exports.pi = Math.PI;

这个模块导出了两个函数(printA和printB)和一个数字(pi),调用代码看起来像这样:

       var myModule2 = require('./myModule2');

                   myModule2.printA(); // -> A

                   myModule2.printB(); // -> B

                   console.log(myModule2.pi); // -> 3.141592653589793

加载模块

前面提到过,你可以使用require函数来加载模块,不用担心在代码里调用require会影响全局命名空间,因为Node里就没有全局命名空间这个概念。如果模块存在且没有任何语法或初始化错误,require函数就会返回这个模块对象,你还可以这个对象赋值给任何一个局部变量。

模块有几种不同的类型,大概可以分为核心模块,本地模块和通过NPM安装的第三方模块,根据模块的类型,有几种引用模块的方式,下面我们就来了解下这些知识。

加载核心模块

Node有一些被编译到二进制文件里的模块,被称为核心模块,它们不能通过路径来引用,只能用模块名。核心模块拥有最高的加载优先级,即使已经有了一个同名的第

    
最新技术文章:
▪css white-space:nowrap属性用法(可以强制文字不...
▪IE里button设置border:none属性无效解决方法
▪border:none与border:0使用区别
▪html清除浮动的6种方法示例
▪三个不常见的 HTML5 实用新特性简介
▪css代码优化的12个技巧
▪低版本IE正常运行HTML5+CSS3网站的3种解决方案
▪CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chr...
▪ie6,ie7,ie8完美支持position:fixed的终极解决方案
▪小技巧处理div内容溢出
▪html小技巧之td,div标签里内容不换行
▪纯CSS实现鼠标放上去改变文字内容
▪li中插入img图片间有空隙的解决方案
▪CSS3中Transition属性详解以及示例分享
▪父div高度不能自适应子div高度的解决方案
▪告别AJAX实现无刷新提交表单
▪从零学CSS系列之文本属性
▪HTML 标签
▪CSS3+Js实现响应式导航条
▪CSS3实例分享之多重背景的实现(Multiple background...
▪用css截取字符的几种方法详解(css排版隐藏溢...
▪页面遮罩层,并且阻止页面body滚动。bootstrap...
▪CSS可以做的几个令你叹为观止的实例分享
▪详细分析css float 属性以及position:absolute 的区...
▪IE6/IE7/IE8/IE9中tbody的innerHTML不能赋值的完美解...
▪CSS小例子(只显示下划线的文本框,像文字一...
▪可以给img元素设置背景图
▪不通过JavaScript实现的自动滚动视差效果
▪div+CSS 兼容小摘
▪CSS的inherit与auto使用分析
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3