简化动态设置CSS:建立Inline+CSS Style Parser

2010年01月22日 由 Rock 发表 发表评论 »

有时动态设置元素的inline style也是很有必要的,因为它有一些CSS没有的优点:

  • inline style不会产生子属性继承
  • 利用inline style优点级,改变CSS属性(important除外)

该Parser的一些特点:

1. 以元素+规则字符串作为输入,以改变元素style样式作为输出

2. 定义一系列规则,由规则改变当前Parser状态

3. 规则可以嵌套

4. 规则可自定义

由以上功能可看出,只要定义了一些元规则,就可以产生一个强大的规则解析器.

结合CSS的一些特性,现在将这些规则具体化

rule -> rule S rule
rule -> prefix text
S -> /\s+/
prefix -> - //应用样式到首层子元素
prefix -> $ //样式只对Border Box的浏览器有效
prefix ->. //标记样式作为css类加入
text -> name|name=value //名称,或配有值的名称
name -> /\S+/ //规则名称
value -> /\S+/ //最终应用值

现在把name=value作为一个对象的属性键值存储,就形成一个规则的集合
当text -> name|name=value,只有name而没值时就从这集合中取出值来.

好了,描述有了,举个例子

var ruleSet = {
“1c” : ["width","100%"],
“2c” : ["width","50%"],
“3c” : ["width","30%"],
“np” : ["padding","0px"],
“bdr” : ["border","0px"],
‘fl’ : ["float", 'left'],
‘cls’:['clear', 'both'],
‘cascade’:'1c np fl cls’
};

如 ‘bdr=3 cascade’对应的的CSS样式为

{
width:50%;
padding:0px;
border :3px;
float:left;
clear:both;
}

例如只针对非Border Box模型有效的浏览器应用
‘$bdr=2′

例如针对非Border Box模型有效的浏览器元素所有首层子元素应用
‘-$bdr=2′

例如给元素添加css类
‘-$bdr=2 .class_a .class_b’

扩展方面,可对上面的一些方法描述进行扩展,使得规则定义得更加强大

在prefix层,可定义多样过滤符号

在value层,可定义value类型不仅仅是”值”,还可以是一个函数,真正值由函数实时计算后返回;value也还可以是一个JS对象,批量设置element.style的属性对等.

这个Style Parser功能强大,实现起来也简单,不失为把问题简单化处理的一个好方法.

可以把这Style Parser挂到jQuery对象或其它元素封装过的对象上,最终形式类似:

element.parse(’bdr=3 $cascade’);

这一句就可以应用到下面的样式:

{
border :3px;
/**以下是border box模型适用*/
width:50%;
padding:0px;
float:left;
clear:both;
}

该CSS Parser已应用到Cicy JS库中,对于表单的设计挺方便.

遇到一个Firefox,Chrome盒模型解析”自相矛盾”的问题

2010年01月20日 由 Rock 发表 发表评论 »

今晚郁闷极了,

遇到一个头疼的问题,

在DOM LOAD后,通过
div.style.width = 1px;
div.style.paddingLeft = 1px;
测得 div.offsetWidth = 2px;

也就是盒宽 = style.width + Padding + BorderWidth

按理应该是 Border Box = false.

但在运行过程中,对于某个元素,解析却是

style.width = borderWidth+padding+内容宽

解析完全相反了,该元素是textarea元素,难道在运行也对box model解析也会不同??

firefox, chrome均如此,,

哪位清楚这问题的麻烦说说.

IE下遇到奇怪的问题:左击event.button为0!

2010年01月15日 由 Rock 发表 发表评论 »

判断鼠标左击方法是:
isLeftClick: function(ev) {
return (((ev.which)
&& (ev.which === 1)) || ((ev.button) && (ev.button === 1)));
}

但今天对话框在IE下左击的时候,event.button却是0,

isLeftClick返回了false,ie6-ie8均如此,

用IE8调试了一下

event.type = ‘click’;没错,,
event.button = 0;
据我所了解,为0即表示无按键,我左击了难道无形中消失了?
我并没有设置setTimeout作延迟,按理还在click事件处理的回调中的,也就是window.event未被重设.

学习前端开发的一些建议

2010年01月9日 由 Rock 发表 发表评论 »

前端开发越来越流行,即使做嵌入式开发的也可能与B/S沾个边了.

群上有朋友问到,学习JavaScript有路数吗?

我心里立刻浮现出”条条大路通罗马”这句经典,但再仔细想想,这句泛泛而谈,没说服力,就着自己这两年学习JavaScript的经验,花了分许时间,打出了几行字:

1. 看一本权威的书, 推荐《JavaScript权威指南》(非广告-_-!!)

2. 给自己选一个实践的目标,如利用JS做一个UI,或实现某一效果,或做一个小游戏

3. 遇到问题先查查资料书,再g.cn,不行再google.com,最后才是问人

4. 多看看同行的BLOG,里面有不少经验分享

5. 学会调试,推荐Firefox的firebug插件

5. 平时勤于独立思考,试试用不同方式模式实现同一效果

完毕,但总觉得缺点什么,直到在森林群上丸子发来的一个链接,描述“Nicholas C. Zakas如何面试前端工程师”的,才大悟,原来上面我只给出了“如何去做”,但还没说明“要做什么”,看了为之漫笔的这篇译文,从Nicholas C. Zakas的话中引一段过来,丰富了实体,完美了!

如果下面某条还没弄明白,那把好关,把每条都弄个透切先

* DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。

* DOM操作——怎样添加、移除、移动、复制、创建和查找节点。

* 事件——怎样使用事件以及IE和DOM事件模型之间存在哪些主要差别。

* XMLHttpRequest——这是什么、怎样完整地执行一次GET请求、怎样检测错误。

* 严格模式与混杂模式——如何触发这两种模式,区分它们有何意义。

* 盒模型——外边距、内边距和边框之间的关系,IE < 8中的盒模型有什么不同。

* 块级元素与行内元素——怎么用CSS控制它们、它们怎样影响周围的元素以及你觉得应该如何定义它们的样式。

* 浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。

* HTML与XHTML——二者有什么区别,你觉得应该使用哪一个并说出理由。

* JSON——它是什么、为什么应该使用它、到底该怎么使用它,说出实现细节来。

附:

Nicholas C. Zakas文章为之漫笔的译文:http://www.cn-cuckoo.com/2010/01/08/how-nicholas-c-zakas-interviewing-the-front-end-engineer-1332.html

不要再折腾JavaSciprt 实现 OOP

2009年12月19日 由 Rock 发表 2 评论 »

OOP三个代表:

1. 封装

JavaScript支持

对象数据结构: { attributeName : attributeValue }

对象属性公开访问

object.attributeName

目前JavaScript在属性访问封装上的缺陷:缺少自定属性getter与setter规则

object.attributeName.__defineGetter__ = function(){ return ..}
object.attributeName.__defineSetter__ = function(){ this.attributeName = ..}

成员反射

for (var key in object) …

2. 继承与接口

JavaScript支持

原型链实现继承

类表示:

function Class(){}

类实例化

var clazz = new Class();

常见的Object类实例:
var obj = {};

继承实现

父类
function Father(){}

//用于连接父子类原型链,现称为桥接类
function Bridge() {}

子类
function Sun(){}

//建立原型链
Bridge.prototype = Father.prototype;

Sun.prototype = new Bridge();

//正确指定constructor
Sun.prototype.constructor = Sun;

桥接类好处在于,修改子类原型并不会影响到父类原型

完成父子类关系构建后,以后可给父子类作扩展

Father.prototype.say = function(){}

var son = new Son();

son.say();

Sun.prototype.sayOk = function(){}

son.sayOk();

实现接口

利用JavaScript的call或apply方法

classA.method.apply(classB, arguments);

3. 多态

JavaScript本身支持的方法传递可变参数与泛型

function action(arg0, arg1, …, argN);

谷歌发布会:Chrome OS演示界面曝光(基于云的应用)

2009年11月20日 由 Rock 发表 发表评论 »

11月20日凌晨消息,谷歌于北京时间20日凌晨2点举行谷歌操作系统Chrome OS的新闻发布会,向人们第一次正式揭开其面纱。

本次发布会谷歌公开的要点如下:

·与一些报道相反,今天没有发布、测试;

·Chrome OS面市还得一年以后;

·整个项目都开源化;

·在Chrome浏览器问世一年后,用户数达到4000万;

·JS方面比IE8快39倍;过去一年,Chrome浏览器更新了19次;

·Mac和Linux版的Chrome浏览器即将问世;

·谷歌希望Chrome OS利用图形芯片GPU,更好的利用系统资源;

·完美的聚合趋势——上网本增长、云计算、笔记本和上网本越来越像手机,手机更加智能,总的来说,移动性增强;

·谷歌操作系统聚焦在三点:速度(和电视一样快)、简单、安全;

·在Chrome OS上,每一个应用程序都是网络应用程序,使用简单,容易维护;

·在Chrome OS上的所有数据都存储在云中;

·“如果我丢了装着Chrome OS的机器,我可以购买另一个,几分钟之内搞定。”没有本地数据;

·冷启动演示:7秒内登入屏幕,再花3秒全部启动;

·Chrome OS外观就像Chrome浏览器;

·应用程序可以被作为最爱程序“tag”;

·所有数据存储在在云中,在谷歌Docs中;

·来自YouTube的流音乐;

·是个好的娱乐平台;

·阅读电子书;

·微软一直以来在研发一个针对Chrome OS的杀手级应用程序:Office 网络应用程序;

….
Rock 评: Google真是太棒了,Chrome OS 除了操作系统是本地外,所有应用完全符合我心目中对“云计算”的定义:

· 每一个应用程序都是网络应用程序,使用简单,容易维护;

· 所有数据都存储在云中;

·关键的计算在云端运算;

本以还这个趋势还要等几年,想不到Google这么快就 实现了!

此外,Chrome OS软件界面是HTML + CSS + JavaScript!


不过,
Chrome OS面市还得一年以后…漫长等待阿!

来源: 网易科技报道

Google开放了其内部JS开发工具:Closure Tools

2009年11月6日 由 Rock 发表 发表评论 »

在全球,有数百万的用户在使用Google的JavaScript-intensive应用,如GmailGoogle DocsGoogle Maps。相信每个开发者都希望创建Web应用程序能变的更easy。哈哈,有个相当好的消息告诉大家,Google今天开放了Closure Tools,一套内部人员开发JavaScript的工具!上面提到了那几个Google应用都是使用此工具开发的。

Closure Tools中包含三套工具:

1。Closure Compiler

Closure Compiler是用来编译JavaScript的编译器,除了像最常见的JavaScript的压缩机提供的功能,它还会对程序进行分析,把不需要的部份移除,减少的JavaScript程序的大小及提升效率。你可以将compiler与Closure Inspector(Firebug的扩展)一起使用。

由于JavaScript的开发是多样化的,所以建立了很多种运行的方式:提供了一个开源的命令行工具 ;创建了一个Web应用程序,你可以使用text box或一个RESTful API来编译;还提供了一个Firefox的扩展,可以与Page Speed 一起使用,方便查看网页的性能优势。

2。Closure Library

Closure Library是一个广泛,测试良好,模块化,跨浏览器的JavaScript库。它是Google的标准JavaScript类库.这套工具就像是许多一般的JavaScript框架,提供了许多简化的DOM操作的函数库,还有丰富的用户界面组件。

3。Closure Templates

这套工具就是提供一个在JavaScript中做模板的机制及函数库,你可以把HTML布局的部份写成一个*.soy,接着再利用封闭模板提供的工具把这个模板档案编译成的JavaScript代码,这样JavaScript开发者便省去了很多处理页面的负担。
Closure Templates既可以实现JavaScript,又可以实现Java,所以你可以在服务器端和客户端使用相同的模板。

心动不如行动,赶紧去看看吧!

来自: googlecode

Rock :

1. Closure Compiler, 优化和压缩代码的。玩过YUI Compressor的可以玩玩这个,对比一下。

The Closure Compiler is a tool for making JavaScript download and run faster. It is a true compiler for JavaScript. Instead of compiling from a source language to machine code, it compiles from JavaScript to better JavaScript. It parses your JavaScript, analyzes it, removes dead code and rewrites and minimizes what’s left. It also checks syntax, variable references, and types, and warns about common JavaScript pitfalls.

2。Closure Library

Google页面的JS代码都是压得不成代码样的,现在JS的库和UI都开源了,可以看看Google的工程师是怎么写的。

3. Closure Templates : 这个是否很有效率?

Background JavaScript UI 库发布 2.0.8 版

2009年11月3日 由 Rock 发表 3 评论 »

这次版本修正同时也改变了部分设计.

主要修改 :

1. 优化容器布局,使得在容器显示时才布局.

容器在显示时才布局,使得容器在一些情况下, 最常见的是在Resize后, 忽略对容器布局从而提高整个应用的性能.

由于在显示时才布局,所以一开始就隐藏的容器如果存在子项并不立即渲染,因为对于容器来说,子项的渲染处于容器的 布局过程中触发,所以很多时候要等到容器显示时子项才得以渲染.

这种行为对于非IE浏览器,几乎没什么弊端,因为对于非IE浏览器来说,DOM文档添加结点的操作响应是非常快速的,对于控件渲染时才把结点添加到DOM文档中这操作来说,几乎不影响用户的体验.

但IE浏览器就不同了,即便IE8也是如此,DOM文档添加结点这操作是非常昂贵的,所以在IE下,容器在显示时才布局的弊端就是引发用户操作的短暂停顿,这种方法并不够友好!

可以在IE和非IE浏览器下对比一下这个菜单中,IE下首次显示菜单的时候操作有些少的停顿.

2. 优化类生成函数,实现原型链继承方式,减少类创建时引起的内存消耗.

这个是当前版本中库结构最关键的更新.

先前考虑到类属性查找速度问题,库中类继承是采用属性复制而不是基于原型链的方式实现.

从特征上检测对象数据类型

2009年10月14日 由 Rock 发表 发表评论 »

本文关键字

  • 基本数据类型
  • 对象类型
  • 装箱操作
  • 运算符重载

最近也少写东西了,今天看到网友 topcss 的评论

http://www.bgscript.com/archives/24#comment-159

有感,在分析我为什么要那样写之余,谈谈灵活的JavaScript语言系统中对”对象”类型的检测法.

JavaScript中的运算符重载:valueOf()

有些人可能会觉得很奇怪,JavaScript中没像C++语言中提供运算符重载这强大的功能,我想说的是,灵活的JavaScript也可做到运算符重载,虽然能力有限.

Object对象有个方法可能大家平时很少关注,其实这方法正是贯穿本文的方法,那就是valueOf(),且看例子,JS中怎么实现运算符重载.

obj.valueOf() : 返回指定对象的原始值,即对象求值,JavaScript中利用该值参与对象的运算操作.

  alert(+ new Date());
  alert( (new Date()).valueOf());
  alert(new Date() + new Date());

在上面的语句中,JS引擎正是调用Date对象的valueOf求得值并参与算术运算符+的运算.

得知过程后,众所周知,两字符串间的+运算是字符串的连接操作,

   alert(new String('string1') + new String('string2'));

假如我要重载字符串对象的运算符,使得字符串相加时是字符串长度相加而非连接,怎么做?可以这样,重写valueOf方法:

String.prototype.valueOf = function(){
   return this.length;
}
 
//显示5
alert(new String('ss') + new String('www'));

有些同学可能觉得很奇怪了,为什么

  alert('ss' + 'www');

还是显示 ’sswww’,

其实这也是正常的,因为’ss’,'www’这些是JS的基本类型,未经过装箱操作使得它们变成字符串对象实例,所以在+号运算时JS引擎还是执行默认的字符串连接操作.只要改改,使得基本数据类型在运算时JS引擎对其进行装箱操作后就可以了.

关于HTML语义,我也有看法

2009年08月29日 由 Rock 发表 4 评论 »

目前的HTML语义方式主要靠标签去表达,但有历史局限性,众多的标签也是历史遗留问题,因为未出现CSS之前一个页面是由众多标签+属性,要说语义化, 从现在标签使用的角度看来,我想没什么比那个时候的页面更具语义化了. 页面的语义化是必段的,但目前用标签来表达是个鸡肋,因为完全标签表达使整个页面显示累赘,难以维护, 而且,当出现一个新的特性对象时,不得不新创建一个标签,这点倒像英语词汇, 一旦属性多了起来, 如颜色,位置,大小等更具个性化的东西标签都难以充分表达.

如何有效的捕获JavaScript焦点

2009年08月14日 由 Rock 发表 6 评论 »

阅读本文可理解并解决以下问题:

  • 设置元素可获得焦点以监听键盘事件
  • 某个元素明明设置了聚焦却没效果
  • 聚焦时抛出异常的

1. 设置元素可获得焦点以监听键盘事件

元素聚焦最大好处就是可允许发送键盘事件,HTML很多元素默认就有可聚焦,如form表单元素,a锚链接等,但大部份默认是不能聚焦的。要使得元素能够聚焦,可以在HTML代码或JavaScript脚本中实现。

html:

  <div tabIndex="0" style="height:100px;width:100px; background:red;"></div>

JavaScript:
oDiv.tabIndex = 0;

其中tabIndex是TAB键的导航顺序,可有正,负或零。

当元素获得焦点时会有边框指示,如果想不显示这个边框,可以

html:

<div tabIndex="0"  hidefocus="on" ></div>

JavaScript:
oDiv.hideFocus = ‘on’;

2. 元素明明设置了聚焦却没效果

有时用JavaScript设置了元素聚焦,但最后焦点却不落在该元素上,百思不得其解。

注意 JavaScript ‘delete 属性’ 的使用

2009年08月11日 由 Rock 发表 发表评论 »

JavaScript对象数据结构基本形式:{ key : value},其中key:value就为对象的一个属性,key作为属性名称,value为属性值,这值可以是任何JavaScript数据类型。
delete 是删除对象的一个属性,例如对于一个对象,

var obj = {key:5};

delete obj.key就是删除该对象的key属性,这个没什么问题,但当对象的原型prototype对象也存在该属性时,就值得注意了。

 var A = function(){};
 A.prototype.testMe = true;
 var a = new A();
 //覆盖原型属性
 a.testMe = true;
 if(a.testMe){
  // 一些关键代码... 
  // ....
  //删除这属性
  delete a.testMe;
}
//第二段 ---------------------------
// 在其它模块中
 if(a.testMe){
  // 一些关键代码... 
  // ....
}

第二段是值得注意的,不要以为a中testMe已尼删除了就不存在了,所以a.testMe就为undefined,即为假,其实它通过原型访问还是存在的,还是true!
这里不留神就中招了。

//附:
检测对象是否存在某属性, 包括原型链的:
if (’attrName’ in obj)…
检测对象是否存在某属性,是对象本身的,而非原型链的:
obj.hasOwnProperty(’attrName’)

好消息:微软不再漠视Web标准HTML5 表态愿分享建议

2009年08月10日 由 Rock 发表 发表评论 »

据国外媒体报道,本周五微软表示,IE团队正在详细查看HTML 5规范现有草案,并汇总自己的意见。此举显示,微软开始认真对待这一新Web标准。

HTML标准上一次正式更新发生在1999年。Google、苹果、Opera和Mozilla等公司一直在致力于创建新一代HTML标准,但微软的参与热情一直不高。

不过,本周五IE开发经理艾德里安·巴特曼(Adrian Bateman )表示,IE团队希望分享自己对HTML 5的看法,并参与制定该标准的讨论。巴特曼表示,尽管目前IE团队更多是提出问题,而非给出解决办法,但是公开讨论正是推动HTML 5发展的最佳方式。

目前HTML 5规范草案中已经包含了许多重大改进功能,例如内置支持视频和音频,以及可以将数据存储于本地计算机的功能。

在Google、苹果和Mozilla的最新版浏览器中,一直在宣传HTML 5功能,但是微软在这方面一直保持谨慎态度。(梧桐雨)

来自: sohu.com

Rock: HTML5是未来WEB技术发展的趋势,是各大厂商的粘合剂,HTML5丰富的多媒体技术的展现又以JavaScript密切相关,各位Jser,选择不会错的,未来有更广阔的应用平台,无论你做哪方面的应用!

TechCrunch:火狐浏览器下载量将突破10亿

2009年07月31日 由 Rock 发表 发表评论 »

周四上午,火狐浏览器的下载量已达9.99亿,很可能将于周五突破10亿。

Mozilla已经为这一历史性的时刻准备了一个新网站http://www.onebillionplusyou.com,该网站将于下周一上线,给出有关火狐浏览器10亿次下载的详细信息。过去几年中,火狐浏览器从IE手中抢夺了大量市场份额。最新数据显示,IE的市占率仅约为54%,而火狐的市占率接近30%。这在几年前是不可想象的,当时IE的市占率维持在90%以上。

如何防止动态加载JavaScript引起的内存泄漏问题

2009年07月30日 由 Rock 发表 1 评论 »

译自 : www.ajaxian.com

利用Script标签可以跨域加载并运行一段JavaScript脚本, 但Neil Fraser先前已指出,脚本运行后资源并没被释放,即使是Script标签移除后。为了释放脚本资源,通常在返回后还要一些进行额外的处理。

  script = document.createElement('script');
  script.src = 
     'http://example.com/cgi-bin/jsonp?q=What+is+the+meaning+of+life%3F';
  script.id = 'JSONP';
  script.type = 'text/javascript';
  script.charset = 'utf-8';
  // 标签加到head后,会自动加载并运行。
  var head = document.getElementsByTagName('head')[0];
  head.appendChild(script)

实际上很多流行的JS库都采用这种方式,创建一个scritp标签,赋予一个ID后加载脚本(比如YUI get()),加载完并回调后清除该标签。问题在于当你清除这些script标签的时候,浏览器仅仅是移除该标签结点。

极速快递查询 - 圆通快递查询,申通快递查询