发送自IPad的日志
作者:dh20156 日期:2010-07-28
Tags: ipad
JQuery字符串转DOM节点BUG
作者:dh20156 日期:2010-06-22
Freemarker风格的JavaScript模板引擎EasyTemplate
作者:dh20156 日期:2010-06-05
在前后端分离的解决方案中,模板起到了重要作用!
在使用Struts或Spring的后端中,使用Freemarker模板作为载体,能够非常有效的实现前后端的分离。
Tags: freemarker easyTemplate
离线存储解决方案分析实现
作者:dh20156 日期:2010-05-13
客户端环境诊断为解决用户遇到的问题做好准备
作者:dh20156 日期:2010-05-11
在WEB开发中怎样的代码才是可维护性高的代码
作者:dh20156 日期:2010-05-05
Ajax History 实现分析
作者:dh20156 日期:2010-05-04
最近研究了一下Ajax History的实现,目前多数的实现是用一个Timer去定时check浏览器的hash是否改变,还有一些兼容性不强的unInterval的实现。
IE:
- 链接到一个锚点,如果该锚点在当前页未被定义,则不能产生history
- 页面中的iframe,如果改变其hash,href,或重新写入新的HTML内容,都会产生history
- 对iframe产生的history进行“向前”,“向后”操作时,页面地址栏的值不会改变
- iframe中使用hash change的方式,在操作历史记录时会相应回滚,可以以此作为历史记录改变的触发事件
- 页面hash的改变,无法通过location.hash获取
其他浏览器:
- 链接到一个锚点,如果该锚点在当前页未被定义,也能产生history
- 页面hash的改变,可以通过location.hash获取
- iframe中使用hash change的方式,在操作历史记录时不会相应回滚,没办法以此作为历史记录改变的触发事件
实现方案:
- 定时检测hash的变化
hasLayout in Microsoft Internet Explorer
作者:dh20156 日期:2010-04-26
hasLayout Property
Retrieves a value that indicates whether the object has layout.
Syntax
HTML N/A Scripting [ sHasLayout = ] object.currentStyle.hasLayout
Possible Values
sHasLayout Boolean that receives one of the following values.
false Default. Object does not have layout. true Object has layout. Tags: haslayout
重温High Performance Web Sites
作者:dh20156 日期:2010-04-22
High Performance Web Sites - yahoo14条
由谁提出的
来自Yahoo! Exceptional Performance team
什么时候开始发起的
2004年开始研究,2007年4月开始,陆续发布,(5月,7月,9月)
为什么
Yahoo希望对自己的产品性能做出一些测量和改善
成绩
总结出14条提升WEB产品性能的准则(后续21条)
ECMA262深入浅出
作者:dh20156 日期:2010-04-11
ECMA262深入浅出
ECMA-262简述
ECMAScript语言概述
ECMAScript对象概述(原型链Prototype Chain)
ECMA-262主要术语
ECMAScript执行环境(作用域链Scope Chain,闭包机制)
ECMAScript函数(new原理)
ECMAScript内部属性(参考)
ECMAScript执行环境作用域链图示
ECMA-262参考资料
所有遵循ECMA-262标准实现的脚本都可以称之为ECMAScript,如JavaScript, JScript, ActionScript等等。

脚本语言与宿主环境是两个不同的主体,比如,浏览器就为ECMAScript提供了一个宿主环境,BOM和DOM则都是浏览器提供的功能,而各种基于ECMA262实现的脚本语言,如JavaScript,Jscript等,都可以为我们提供对BOM和DOM的操作方法。因为宿主环境的不同,它们提供的功能也不尽相同,这也是我们知道的,不同的浏览器中会有不同的BOM和DOM的属性和方法。
原始值属于下列“内置类型”(built-in types)中的一员:Undefined, Null, Boolean, Number和String,“对象 ”则是内置类型:Object,“方法”是一个透过property关联到对象的函数。

在基于类的面向对象语言里,通常,状态由实例持有,方法由类持有,继承只有结构和行为。在ECMAScript中,状态和方法由对象持有,结构、行为和状态都可以被继承。
对象通常都不会直接包含那些由原型包含共享的属性和值。描述见下图:

例如,Cfp是cf3的原型(虚线,表示隐含的原型关系),构造函数CF自己有两个属性P1和P2,它们对 Cfp,cf1,cf2,cf3,cf4,cf5都不可见。Cfp的属性CFP1对cf1,cf2,cf3,cf4,cf5可见(但不包括CF),还有那些在Cfp的隐含的原型链中找到的 property name(非q1,q2或者CFP1的其他属性)。注意,CF和Cfp之间并非隐含的原型联系。
数据值的集合
原始值包括Undefined,Null,Boolean,Number,String这些类型成员。原始值是语言实现中底层可以直接表示的数据。
每个对象都是Object类型的成员。它包含的所有属性成员,如原始值、对象或者函数,是一个无序的集合。对象属性成员放置的函数又被称为方法。
构造器是一个函数对象,用来创建和初始化对象。每个构造器都有一个关联的原型对象用来实现属性成员的继承和共享。
ECMAScript中的原型用来实现对象结构、状态和行为的继承。当一个构造器构造了一个对象,这个对象会隐含地引用到该构造器关联的原型去解析属性的引用。构造器关联的原型可以通过程序表达式constructor.prototype 来引用。在某个共享对象的原型上添加的属性值,通过继承,可以被所有其他对象共享。
原生对象是由ECMAScript的实现提供的,独立于宿主环境。有些原生对像同时又是内置对象,其他的则可能会在执行一个 ECMAScript程序时产生。
内置对象是由ECMAScript的实现提供的,独立于宿主环境,它们出现在ECMAScript程序开始执行的时候。所有的内置对象都是原生对象。
宿主对象由为ECMAScript提供完整执行环境的宿主环境提供的。任何对象,不是原生对象,就是宿主对象。
Undefined值是一个原始值,当一个变量没有被分配值的时候使用。
Undefined类型只有一个值,undefined。
Null值是一个原始值,它表示空的,没有的,或不存在的引用。
Null类型有一个值,null。
Boolean值是Boolean类型的成员,它只能是两个值中的一个,true或false。
Boolean类型表示一个逻辑实体,由两个唯一值组成,一个是true,另一个是false。
Boolean对象是Object类型的成员,它是内置对象Boolean的实例。意思是,一个Boolean对象是通过Boolean构造器的 new表 达式创建,提供一个boolean参数。结果对象有一个隐含的(未命名)原型boolean。一个Boolean对象支配一个 Boolean值。
String值是String类型的成员,它是一个有限的有序的,0到16位无符号整数长度的值。注意:尽管每个值通常都表示一个单独的16位的UTF-16文本的单元,但该语言不会做出任何限制和要求当这个值不是16位无符号整数的情况时。
String类型是所有字符串值的集合。
String对象是Object类型的成员,它是内置对象String的实例。
Number值是Number类型的成员,它是一个直接表示的数字。
Number类型是表示数字的值的集合。在ECMAScript中,该集合表示IEEE754的64位双精度运算格式的值,包含一个特殊值"Not-a- Number"(NaN),正无穷大和负无穷大。
Number对象是Object类型的成员,它是内置对象Number的实例。
原始值Infinity表示一个正无穷大的数字,Number类型成员。
原始值NaN表示IEEE标准"Not-a-Number"值的集合,Number类型成员。
想象一下,假设你就是一个ECMAScript引擎。
当你接收到一条语句:
this.x = y;
你能确定该做什么吗?
很明显, 我们不知道该做些什么,因为我们既不知道this是什么,也不清楚y是什么。
所以,如果要正确执行这条语句,我们需要一个上下文,用以确定this和y到底是什么,这个上下文,就是执行环境。
当控制器转到ECMAScript可执行代码时,即会进入到一个执行环境中。活动的执行环境会在逻辑上形成一个堆栈,在这个堆栈的顶端存放的是运行时的执行环境。
通过在源文件中透过函数声明、函数表达式或内置Function对象来定义的函数对象。
内部函数对象,它们属于内置对象,如parseInt, Math.exp等等。
Global代码
Eval代码
Function代码
每个执行环境都会与一个“变量对象”关联。在源文件中定义的的变量和函数都会作为properties添加到该对象中去。例如函数的代码,参数将作为properties添加到该函数执行环境的变量对象中去。
针对函数代码:为每一个在参数列表中定义的形参,创建一个同名的标识符作为property添加到“变量对象”中,其值由调用[[call]]时以参数的形式提供。如果调用者提供的参数值少于形参数量,其他的形参值将为undefined。如果遇到多个同名的形参,最后一个同名形参的值将被保留,如果这最后一个形参也未被提供值,同样会是undefined。
针对函数声明:在“变量对象”中创建一个以它们的名字作为标识符的property,其值为创建后的函数对象。如果“变量对象”中已经有一个同名的property,则将它替换掉。
针对变量声明:在“变量对象”中创建一个以它们的名字作为标识符的property,其值为undefined,如果之前已有这个property,则其值不变。
所有的执行环境都与一个作用域链(scope chain)相关联。作用域链是一个用来查找标识符的对象列表。当控制器进入到一个执行环境中的时候,作用域链被创建并放置了一个初始的对象集合。在一个执行环境运行的时候,它的作用域链只受with语句和catch子句影响。在执行的时候,标识符查找的方法如下:
1. 获取Scope Chain的下一个对象。如果没有对象了,则转到第5步
2. 调用Result(1)的[[HasProperty]]方法, 传递Identifier作为参数
3. 如果Result(2)是true, 则返回一个Reference(引用)类型的值,它的base object是Result(1),而它的property name是Identifier
4. 跳到第1步
5. 返回一个Reference类型,它的base object是null,它的property name是Identifier
标识符查找的结果通常是一个名字为标识符字符串的引用值。
在控制器进入任何执行环境之前,会创建一个唯一的全局对象,初始化的全局对象包括以下属性:
内置对象,如 Math,String,Date,parseInt等等,它们都是不可枚举的(DontEnum)。
宿主属性,它自己可能会包含一个值为全局对象的属性,比如,在HTML 的DOM中,全局对象中的window属性,就是全局对象自己。
当控制器进入了执行环境,ECMAScript运行的时候,全局对象可能还会被添加上一些额外的属性,一些之前已有的属性也有可能被改变。
所有活动的执行环境都会有一个this值,它依赖并取决于代码执行时的caller。
同一个执行环境中的this值是不变的。
当控制器进入到一个函数的执行环境中时,会创建一个arguments对象,初始过程如下:
arguments对象的内部属性[[prototype]],是原生对象prototype,初始值是Object.prototype
创建callee属性,不可枚举(DontEnum),其值为正在执行的函数对象,这使得匿名函数也可以进行递归。
创建length属性,不可枚举(DontEnum),其值为caller提供的实际参数数量。
按少于length的正整数数量创建ToString(arg)属性,不可枚举(DontEnum),第一个实际参数值对应为arg = 0,第二个对应为arg = 1,依此类推。当实际参数少于形参时,该属性会在活动对象中相应地共享它的值。意思就是说,改变此属性将改变活动对象中的属性值,反之亦然。
每次调用函数或构造器都会进入一个新的执行环境,即使在一个函数递归地调用自己的时候亦是如此。每次return,都会退出这个执行环境。一个未捕捉的异常也可能退出一个或多个执行环境。
当控制器进入到一个执行环境中时,作用域链即被创建和初始化,变量实例化也开始进行,this值也被确定下来。
作用域链创建并初始,仅包含global对象。
变量实例化进行的时候以global对象作为变量对象,属性为不可删除(DontDelete) 。
This值为global对象。
Eval代码
当控制器进入到eval代码的执行环境中时,先前活动的执行环境,引用到调用环境*,用来决定作用域链,变量对象和this值。如果没有调用环境,则所有这些都以全局代码形式进行处理。
作用域链初始化时包含一个与调用环境相同的对象,并保持相同的顺序。这包含了通过with语句和catch子句添加到调用环境作用域链上的对象。
变量实例化时使用调用环境下的变量对象。
This值与调用环境下的this值一致。
* 调用函数语句执行时的execution context就是calling context
Function代码
作用域链初始化时先添加活动对象,然后再添加该函数对象[[Scope]]属性中存储的其他对象。* 闭包机制
变量实例化执行时使用活动对象作为变量对象,属性为不可删除(DontDelete)。
This的值为Caller,如果caller不是对象(或者是null),则this值为global对象。
with语句会在当前执行环境中的作用域链顶端添加一个计算对象,在这个扩展的作用域链执行完语句之后,随机复原之前的作用域链。
With(表达式)语句的执行过程如下:
1.评估表达式
2.调用GetValue(Result(1))
3.调用ToObject(Result(2))
4.将Result(3)添加到 作用域链的顶端
5.用第4步扩展的作用域链来评估语句
6.使C=Result(5),如果在第5步时有异常抛出,则C=(throw,V,empty),V是这个异常(执行现在当作没有异常抛出继续进行)
7.在作用域链中移除Result(3)
8.返回C
注意:当控制器离开该“嵌入”的语句时,无论是正常还是异常,作用域链都将被恢复。
catch(标识符)块的执行过程如下:
1.使C为通过catch传递进来的参数
2.像new Object()一样创建一个新的对象
3.在Result(2) 的那个对象上创建一个property,名字是标识符,值是C,不可删除
4.将Result(2)添加到作用域链的顶端
5.评估这个块语句
6.将Result(2) 从作用域链中移除
7.返回Result(5)
function Identifier(FormalParameterList opt){FunctionBody}
函数声明的解析过程如下:
1.创建一个new Function对象, FormalParameterList指定参数,FunctionBody指定函数体。将当前正在运行的执行环境中的作用域链作为它的作用域。
2.为当前的变量对象 创建一个名为Identifier的属性,值为Result(1)。
function(FormalParameterList opt){FunctionBody}
匿名函数表达式的解析过程如下:
1.创建一个new Function对象, FormalParameterList指定参数,FunctionBody指定函数体。将当前正在运行的执行环境中的作用域链作为它的作用域。
2.返回Result(1)。
function Identifier(FormalParameterList opt){FunctionBody}
具名函数表达式的解析过程如下:
1.创建一个new Object对象
2.将Result(1)添加到作用域链的顶端
3.创建一个new Function对象,FormalParameterList指定参数,FunctionBody指定函数体。将当前正在运行的执行环境中的作用域链作为它的作用域。
4.为Result(1)创建一个名为Identifier的属性,其值为Result(3),只读,不可删除
5.从作用域链中移除Result(1)
6.返回Result(3)
函数对象构造过程如下:
1.如果已有对象E,它已有FunctionBody,且与现在给到的FunctionBody相等,则跳转到第13步
2. 创建一个新的ECMAScript native对象F
3.设置F的[[Class]]为“Function”
4.设置F的[[Prototype]]为原始的Function prototype对象
5.设 置F的[[Call]](参见之后的Slide)
6.设置F的[[Construct]](参见之后的Slide)
7.设置F的[[Scope]]为一个新的作用域链,它和当前作用域包含相同的对象
8.设置F的lengeh属性值为形参数量,如果未定义参数,则为0。9.以new Object()表达式方式创建一个新的对象
10.设置F的 constructor属性值为Result(9)
11.设置F的prototype属性值为Result(9)
12.返回F
13.酌情(由实现者决定)跳转到第2步或第14步
14.创建 一个新的ECMAScript native对象F,连接到 E,复制所有E和F的非内部属性*以使得它们与E和F的保持一致。
15.设置F的[[Class]]属性值为“ Function”
16.设置F的[[Prototype]]属性值为原始的Function prototype对象
17.设置F的[[Call]]属性
18.设置F的[[Construct]]属性
19. 设置F的[[Scope]]属性值为一个新的作用域链,它和当前作用域包含相同的对象
20.返回F
* 内部属性指的是所有以[[]]书写的属性
注意:
每个function都会自动创建一个prototype属性,以使得它们可以当作构造器来使用。
第1步,使得类似函数A中嵌套了一个不依赖于A的函数B的这种情况进行优化。在这种情形的实现中,允许在A每次被调用的时候,重用B这个对象。
第13步决定是否执行此 优化。如果在某个实现中选择不,则会跳转到第2步。
连接对象(很多引擎都未去做这个实现)
当两个或更多的Function对象连接时,它们具有如下特殊的行为:
1.任何时候,对 象O创建或设置一个非内部属性时,通信机制会立即在其他所有与O连接的对象上做相同的操作。
2.任何时候,对象O删除一个非内部属性, 通信机制会立即在其他所有与O连接的对象上做相同的操作。
3.如果对象O与P相连,它们可以通过==和===来进行比较。
4.当对象O与P相连 ,且对象P与Q相连,则O与Q也会自动相连。
注意:相连的对象除了它们各自不同的内部属性外,是很难进行区别的。而这些内部属性可能也只有[[Scope]]会不同。
[[Call]]
当函数对象F调用了[[Call]]属性,将执行以下步骤:
1.将F的形参表、传递的参数列表,和this植入到一个新的执行环境
2.评估F的FunctionBody
3.退出在第1步植入的执行环境,恢复之前的执行环境
4.如果Result(2).type是 throw,抛出Result (2).value
5.如果Result(2).type是return,返回Result(2).value
6.Result(2).type默认情况下,返回undefined
[[Construct]]
当函数对象F调用了[[Construct]]属性,将执行以下步骤:
1.创建一个新的ECMAScript native对象
2.将 Result(1)的[[Class]]属性值设为“Object”
3.取得F的prototype属性值
4.如果Result(3)是一个对象,将Result(1)的[[Prototype]]属性值设置为Result(3)
5.如果Result(3)不是一个对象,将Result(1)的[[Prototype]]属性值设置为原始的Object prototype对象
6.调用F的 [[Call]]属性,将Result(1)设置为this值,将[[Construct]]传递的参数当作参数列表
7.如果Type(Result(6))是一个对象,返回Result(6)
8.返回Result(1)
This对象的原型,该属性值只会是一个object或null,所有的[[Prototype]] chain最终都都会通向到null。
指明This对象类别的字符串值
与This对象关联的内部状态信息
返回指定属性的值
设置指定的属性值
返回是否可以执行[[Put]]指定属性的操作的Boolean值
返回对象是否存在指定的属性名的Boolean值
移除对象指定的属性
返回对象的默认值,只能是原始值,不允许对象和引用。
通过调用new操作符构造一个对象。
通过函数调用表达式执行与对象关联的代码。
返回一个Boolean值,表示This对象是否存在指定的委派(实例),仅对ECMAScript native中的Function对象实现。
作用域链,用于表示一个函数对象执行时的环境。
为正则表达式匹配和返回一个MatchResult的值。

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,% 20December%201999.pdf
http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf
http://www.ecma-international.org/memento/index.html
Tags: ECMA262 ecmascript
WEB2.0 in front-end engineering
作者:dh20156 日期:2010-04-07
高效WEB开发团队建设
作者:dh20156 日期:2010-03-29
高效WEB开发团队建设
Charlie Du
我们需要一个更高效的开发团队
为什么?
向业界有影响力的开发团队看齐: 雅虎, 淘宝, 百度
希望有一天我们也能够成为影响别人的团队!
我们需要一个更高效的开发团队
对团队成员的意义
提升成员自身专业技能
让每一位成员专注做自己最擅长的事
有利于成员形成较清晰的职业规划
对公司的意义
提高工作效率,节约开支
提高产品品质,增强竞争力
提升公司专业形象,塑造业界有影响力的团队
我们要如何来做?
合理的开发流程(主流程部分)
团队组织结构及职责
从需求开始
明确的需求是项目的基础,也是QA测试及项目交付的依据!
所以,在整个开发流程中,我们将很大一部分时间用来明确项目需求,这是非常重要的。
前后端分离
当我们有了明确的项目需求,并有了说明文档以及线框图或快速原型,我们就可以准备分发任务了。
为了实现高效的开发,前后端分离是非常值得推荐的开发方式。
前后端的分离,使得项目开发得以同步进行而互不影响。
由于我更多的是从事前端的开发,所以后面会更多的介绍前端部分是如何运作的。
前后端分离(意义)
一、开发工作更细化,有利于提高开发品质。
二、各组成员得以全心投入到相对单一的工作上,对成员的技术提升有非常大的推动。
三、磨合期结束后,有利于优化项目开发进度,缩减项目开发时间。
四、团队整体实力将得到增强,有助于提高团队竞争力。
前后端协作
在前后端开发实施过程中,会必不可少的出现一些问题,如双方需要的数据格式、数据类型等等都是经常会遇到的问题,以及后端在对前端交付的页面套数据时,也常常会遇到一些问题。
为了实现双方更好的协作,我们需要制定一些双方都需要遵循的开发规范。
思考及讨论:
我们目前是怎样的状况?
为实现目标而努力
好事多磨,任何计划在实施过程中都会遇到种种苦难和阻力,不过我们相信,只要我们坚持,就一定能够实现!
高效WEB开发团队建设.ppt
加速Javascript:DOM操作优化
作者:dh20156 日期:2010-03-08
AutoSizeBox 自适应父节点大小的类
作者:dh20156 日期:2010-02-01
在做WEB APP项目的时候,经常会遇到一些自适应大小的需求,简单实现了一个,使用需谨慎!
自适应父节点大小类 - ARBox
- 使用此方法的DOM元素:
- 将自动适应其父节点的宽和高;
- 如果指定了width=[整数|百分数]和height的值,将按给定的值调整;
- 该元素将被自动设置成为overflow:hidden;
- 支持rows="25,*25"和cols="20%,*"属性
- 如果设置了rows或cols,其childNodes将按相应的值自动调整
- 尺寸调整过的子节点,同时也会被自动设置成为overflow:hidden;
- 嵌套的设置:
- 嵌套与本类无关,需要另行编写相关队列实现
- 可使用自定义属性(如level)进行抓取,按level优先级存入队列
- window resize的时候可以按队列顺序进行调整
- 注意:
- 请声明DTD
- 最好在使用了reset样式后使用
- 请酌情使用或参考
Tags: 自适应







