Archive

Archive for the ‘技术’ Category

[每周读书] 第二十七周 《浪潮之巅》

August 25th, 2011 No comments


这是一部讲述了近百年来工业界发展史的书,其中有科技巨人微软、苹果、惠普、IBM、AT&T等大公司的兴衰之路,也有对整个世界工业史的宏观叙述,还讲述了几个重要的商业模式、国际金融机构和世界经济操盘手。全书观点宏观而不空洞,跨时绵长而不累赘,故事传奇而不虚浮,评论精彩而不偏颇(大体上是的),是一部难得的史书。
世界工业百年以来,出过像AT&T那样人才辈出季度繁荣而又一时衰落的黄昏公司,IBM那样保守谨慎却时时领导电子潮流的蓝色巨人,微软那样野心勃勃城府极深的OS霸主,思科那样抓住机遇凭借东风的设备之王,雅虎那样制定了互联网规则却败在目光短视而日渐衰颓的明日黄花,摩托罗拉那样曾经辉煌的没落贵族,google那样技术制霸精明远见的婴儿巨人,以及诺基亚那样木工厂出身却引领技术革命浪潮的成功的“转基因公司”。
这些传奇的公司各有各精彩非凡的故事,而这样的故事却未必每个人都能清楚地知道,本书以朴实流畅的语言对这些大公司的兴衰历史做了客观的描述。除了把故事讲得精彩纷呈娓娓动人之外,作者对这些历史事件独到的点评亦是本书的一大亮点。除了大公司之外,网景、太阳、NOVELL这些转瞬即逝的璀璨流星也在书里留下了华丽的一笔。
作者在书中还讲到整个世界或者科技界与金融经济的紧密联系,讲述了各种成功的商业模式,讲述了华尔街和风投公司在科技公司的影响力,讲述了一个公司的基因是怎样决定一个公司的胜败兴亡,这些不为大众所熟知的故事读来令人受益匪浅,读到精彩之处不免手不释卷,废寝忘食。
尽管作者在最后几章中提到腾讯公司的几个观点我并不百分百认同(这可能跟作者吴军博士后来加盟腾讯有关),微软和苹果之争每个人也有不同看法,至于google是否至善至美也不可一言而尽,但是从整体上看,该书还是算比较客观全面的。这本书里所载的文章最初是发表于谷歌中国的黑板报上,后来才由作者整理修改(以作者原话说,科技界发展得太快,以至于作者不得不进行大篇幅修改才能在现在成书出版)后成书。作者虽是程序员但是文笔朴实流畅,写故事写得动人心弦,丝毫不逊于国内很多所谓“编辑”,这点实在难能可贵。
对于非IT从业人员来说,这本书读起来几乎没有什么阅读门槛,只要当作一本小说来读就可以了,就跟看故事会似的。对于IT从业人员来说,从这些传奇故事中吸取教训,开拓视野无疑对于今后的事业会有很大的帮助。总而言之,这也算是一本“相见恨晚”的好书。

谷歌中国黑板报:http://www.googlechinablog.com/
《浪潮之巅》购买链接:
亚马逊链接
当当网链接
豆瓣链接

又一年webrebuild要开始喽~!

August 9th, 2011 No comments

转眼已经一年过去了,去年在webrebuild年会学到不少东西啊,不过去年我是在广州网易大厦参加的,今年就可以在深圳站参加喽~!

各位童鞋如果对于前端有兴趣的话可以点击下面的链接报名哦,活动现场有牛人作演讲,而且还有得抽奖哦,我去年就抽中了QQ年费会员哈^_^

 

WebReBuild.ORG第五届年会——重构七年

Categories: WEB, 技术 Tags: ,

介绍几个CSS3新属性和动画效果

August 7th, 2011 No comments

最近稍微玩了一下CSS几个有用的新特性,

主要是transition(过渡效果),translate(移动),transform(变形)以及animation(动画)。
几个新特性的叠加可以产生很强大的效果,而且比起写JS要方便得多,当然,目前只有webkit和mozilla以及难见踪影的IE10支持CSS3,webkit支持得最好,moz次之,IE杯具。所以目前CSS3的应用主要还是在iOS和android上会比较有前途,PC上就算了,玩玩就好了。稍微介绍一下这几个属性。
1.CSS3 Transitions 过渡效果
可以很方便地指定两种样式之间的切换过渡效果,比方说我们移动一个div的位置,从x = 0px 到 x = 200px,这时候使用transition指定缓动效果为ease-in-out,我们可以看到DIV移动时会减速。
.box:hover{
/* 这里的all是指适用在所有效果,如果想只适用width或者height,直接替换即可,多个效果用“,”隔开 */
    -moz-transition: all 800ms;
    -webkit-transition: all 800ms;
    -o-transition: all 800ms;
    -ms-transition: all 800ms;
}

 

2.CSS3 Translate 移动元素
以前如果我们要写一个元素移动的动画,通常我们会设置某元素位置为absolute,然后通过JS改变其top,left,right,bottom等属性来实现动画,现在我们可以使用css3 translate来做到这一点,而完全不需要设置position为absolute。另外,这里提醒一下大家,使用css translate在android上相当杯具,而在iOS的mobile safari里面使用,则transalte2d的效果远远不如translate3d,所以,如果需要在mobile safari里面使用该属性,强烈建议使用translate3d(x,y,z)的形式,即使只是修改其中的X或者Y,也这样写。我测试过使用translateX或者translateY,效果跟2d的一样烂。
而translate3d是webkit才支持的属性,估计内部实现与2d不同,所以效果流畅很多。
.example:hover .translate{
/*这里示例的是2D的translate,参数为x,y,如果用3D则translate3d(x,y,z),但目前只有webkit支持3D*/
-moz-transform: translate(500px,0);
-webkit-transform: translate(500px,0);
-o-transform: translate(500px,0);
-ms-transform: translate(500px,0);
}
3.CSS3 transform 形变
CSS3提供了几个很有用的属性来改变元素的形状:缩放scale,旋转rotate,倾斜skew。(IE10+也支持,但是要加-ms-前缀。)
.rotate:hover{
-moz-transform: rotate(720deg);
-webkit-transform: rotate(720deg);
-o-transform: rotate(720deg);
-ms-transform: rotate(720deg);
}
下面给出几个实例并附上相关代码(猛击这里新窗口查看效果):
Categories: css, WEB, 技术 Tags:

解决JS(jQuery)中blur触发函数this指针指向问题(函数作用域问题)

June 18th, 2011 1 comment

昨晚在写JS的时候(基于jQuery)一直纠结这么一个问题,不太好表述清楚,所以这篇文章的标题也怪怪的。大致状况如下:

/*
*定义一个表单类,里面成员变量有各个inputs的对象集合
*各个inputs绑定blur事件用来触发表单输入验证
*验证用的函数封装在prototype中,属于成员函数
*/
function UserForm(){
//...这里获取表单和inputs
this.inputs.blur(this.validate);
}
UserForm.prototype = {
setStatus: function(){
//用来设置表单状态,表示填写进度用
},
validate: function(){
//...省略无关内容
//这里获取当前触发了blur事件的input对象
$input = $(this);
//这里用来调用成员函数setStatus
this.setStatus(1);
}
}

代码如上,问题就出在this指针上面。当我在构造函数UserForm()里面使用this.elements定义各个成员变量的时候,这里的this指针会指向我们的UserForm对象,在成员函数validate()里面正常情况下也可以使用this.fun()的方式来调用其他公有函数。但是,我在构造函数中调用validate()函数的时候使用了jQuery的blur()函数来调用,那么这时候的this指针就指向了当前失去焦点触发blur的input元素,则无法再使用this.fun()的方式来调用其他公有函数。

解决方法1:
既然是this指针的问题,那么我们不在类里面封装使用blur方法调用,我到类外先获取inputs然后给input绑定一个blur函数,再把当前input对象传给validate就能解决。

function UserForm(){
//...这里获取表单和inputs
this.inputs.blur(this.validate);
}
UserForm.prototype = {
setStatus: function(){
//用来设置表单状态,表示填写进度用
},
//修改validate方法,改为把当前input对象作为参数传进来
validate: function($input){
//...省略无关内容
<del datetime="2011-06-18T09:15:35+00:00">//这里获取当前触发了blur事件的input对象
$input = $(this);</del>
//这里用来调用成员函数setStatus
this.setStatus(1);
}
}
$(document).ready(function(){
var loginForm = new UserForm('#UserLoginForm','#signUp');
var inputs = $('#UserLoginForm input');
$inputs.blur(function(){
loginForm.validate($(this));
});
});

但这是非常不可取的,我封装成类本来就是想把逻辑处理的内容都在类里面完成,这样做就变成我把处理过程都放到类外去做了,那我的类不就成废物一个了么?
于是……

解决方法二:
纠结好久我到推上发了发牢骚,结果 @rainux 大大粗线鸟,告诉我一个神奇的$.proxy(this.handler, this)函数,是jQuery的函数,用来改变函数作用域,把handler的作用域绑定在this上面。如果写在blur函数里面,那么就是element.blur($.proxy(this.handler, this)),如此,validate函数中的this指针就仍然是指向UserForm类,就可以顺利调用成员函数了。

function UserForm(){
//...这里获取表单和inputs
this.inputs.blur($.proxy(this.validate, this));
}
UserForm.prototype = {
setStatus: function(){
//用来设置表单状态,表示填写进度用
},
validate: function(){
//...省略无关内容
//这里用来调用成员函数setStatus
this.setStatus(1);
}
}
$(document).ready(function(){
var loginForm = new UserForm('#UserLoginForm','#signUp');
});

但是还有一个问题,我改变了this指针使得我的成员函数可以使用this.foo的方式调用没错但是我要怎么确定当前哪个input触发了该函数呢?
再试了半天纠结了好久之后给出最终解决方法:使用event.currentTarget。(依然感谢 @rainux 大大的帮助)
最终解决方法:

function UserForm(){
//...这里获取表单和inputs
this.inputs.blur($.proxy(this.validate, this));
}
UserForm.prototype = {
setStatus: function(){
//用来设置表单状态,表示填写进度用
},
//这里把event作为参数传入
validate: function(event){
//...省略无关内容
//使用event.currentTarget获取当前DOM对象,为了方便我把它转化为jQuery对象
$input = $(document.getElementById(event.currentTarget.id));
//这里用来调用成员函数setStatus
this.setStatus(1);
}
}
$(document).ready(function(){
var loginForm = new UserForm('#UserLoginForm','#signUp');
});

总结
在解决这些问题的时候走了挺多弯路,说明之前写的代码不够多,看的文档不够仔细,其实click()、blur()等这些事件方法都是可以直接传参数什么的,而不是我一直以为的必须使用匿名函数的方法,这些技巧都挺有用的,所以,多看官方文档有好处的T_T

Categories: JS & JQuery, 技术 Tags: ,

利用JS和CSS3实现多浏览器图片旋转

June 11th, 2011 No comments

很久以前写过一个利用JS和CSS3实现全浏览器图片旋转的,用在一个站点的首页上,后来那个站点没继续做下去,就没怎么再留意这个,最近项目要用到,就把JS代码OO封装了一下,顺便留点笔记下来。
截图如下:

一、原理

CSS3提供了transform: rotate(ndeg);方法用来作为元素旋转,其中n是数字。
目前支持CSS3的浏览器有Firefox,Chrome,Safari,Opera和IE9以上版本。但是每个浏览器使用的时候语句都不相同,Firefox加了-moz前缀,webkit引擎的(chrome,safari)加了-webkit前缀等等,所以要针对不同浏览器写不同的语句。另外,IE7,8都不支持CSS3,所以要使用IE的filter来进行旋转操作。[测试发现IE6是最最杯具的,完全用不了rotate,( -___- )b]

二、实践

1.编写HTML代码

<div>
<ul>
<li><img src=”images/photo001.jpg” /></li>
<li><img src=”images/photo001.jpg” /></li>
<li><img src=”images/photo001.jpg” /></li>
<li><img src=”images/photo001.jpg” /></li>
<li><img src=”images/photo001.jpg” /></li>
</ul>
</div>

这里定义了一个ul列表,里面放着5张图片。

2.CSS文件

这里用li把图片包括之后,再使用绝对定位,以便图片的动画编写。

.photo-outer{margin: 0 auto;width: 1100px;overflow: hidden;border: 1px solid #000;}
.photo{width: 100%;height: 200px;position: relative;}
.photo li{position: absolute;padding: 4px;width: 200px;border: 1px solid #DDD;border-radius: 4px;box-shadow: 0px 0px 6px #DDD;background:#FFF;}
.photo li img{max-width: 100%;}
注意到这个CSS文件里面并没有写到transform语句,这是因为我原先的意图是使用JS做旋转动画,所以没必要在CSS里面先定义它的rotate参数,如果你仅仅是想要一个静态的图片旋转的页面那就直接写进去吧,当然想要每张图片都旋转不同角度就得每个li写一个语句,CSS3语句如下:

-moz-transform: rotate(-12deg); /*Firefox*/
-webkit-transform: rotate(-12deg); /*webkit引擎的浏览器,如safari和chrome*/
-o-transform: rotate(-12deg); /*Opera*/
-ms-transform: rotate(-12deg); /*IE9*/

3.JS代码

注意这里我用了JQuery框架。
首先我们需要定义一个Photo类(JS的类的定义很特殊,它的function既可以是函数也可以是类的声明外加构造函数,使用它作为类的时候,只要在实例化的时候使用New关键字就行了),接收一个index参数来确定它属于列表当中的哪一个:
//声明类和构造函数
function Photo(index){
//JS元素从1开始算起而CSS元素从0开始算起,从CSS选择器里面获取到的index是从0开始的,所以要+1
this.index = index+1;
//获取当前图片所在的li的对象
this.li = $(‘.photo li:nth-child(‘+this.index+’)');
}
//声明类的方法
Photo.prototype={
//用来设置li的位置
setPos: function(posX, posY){
this.li.css({left: posX,top: posY});
},
rotate: function($deg){
//这几句用来定义CSS3的旋转参数,配合setTimeOut多次调用就可以变成动画了。
this.li.css({‘-moz-transform’: ‘rotate(‘+ $deg +’deg)’});
this.li.css({‘-webkit-transform’: ‘rotate(‘+ $deg +’deg)’});
this.li.css({‘-0-transform’: ‘rotate(‘+ $deg +’deg)’});
this.li.css({‘-ms-transform’: ‘rotate(‘+ $deg +’deg)’});
//下面是针对IE7、8
//自定义函数,把度数转换为弧度
$rad = degToRad($deg);
//计算cos和sin值
$costheta = Math.cos($rad);
$sintheta = Math.sin($rad);
//给css写入filter
this.li.css({
filter: ‘progid:DXImageTransform.Microsoft.Matrix(sizingMethod=\’auto expand\’, M11=’ + $costheta + ‘, M12=’ + (-$sintheta) + ‘, M21=’ + $sintheta + ‘, M22=’ + $costheta + ‘)progid:DXImageTransform.Microsoft.Shadow(color=#f4f0e7,direction=0)progid:DXImageTransform.Microsoft.Shadow(color=#f4f0e7,direction=90)progid:DXImageTransform.Microsoft.Shadow(color=#f4f0e7,direction=225)progid:DXImageTransform.Microsoft.Shadow(color=#f4f0e7,direction=270)’
});
this.li.css({‘transform’: ‘rotate(‘+ $deg +’deg)’});
}
}
在针对IE7、8写filter的时候用到一个自定义函数,代码如下:
var pi = Math.PI;
function degToRad(x) { return ( x/(360/(2*pi)) ); }
用来把度数转换成弧度。
然使用到IE的一个filter,
progid:DXImageTransform.Microsoft.Matrix(sizingMethod=’auto expand’, M11=$costheta, M12=(-$sintheta), M21=$sintheta, M22=$costheta)
这个函数使用起来真够麻烦的,各位想知道原理可以google一下该函数,会出来MicroSoft的官网解释= =
最后,类定义完了我们在页面加载完之后调用之即可:
$(document).ready(function(){
//获取当前li节点的个数,CSS从0开始计数,所以值是4
var n = $(‘.photo li:last-child’).index();
//新建一个photo数组
var photo = new Array();
//每个photo数组的元素实例化一个photo对象
for($i=0;$i<=n;$i++){
photo[$i] = new Photo($i);
}
//现在就可以针对每个不同的photo实例进行方法调用鸟~setPos是设置left和top的值来定位,rotate则是旋转了,接收一个度数作为参数
photo[0].setPos(20,20);
photo[0].rotate(-12);
photo[1].setPos(220,20);
photo[1].rotate(2);
photo[2].setPos(420,20);
photo[2].rotate(0);
photo[3].setPos(620,20);
photo[3].rotate(-15);
photo[4].setPos(820,20);
photo[4].rotate(5);
});

OK,这就是俺写了一下午的结果鸟,主要是JS的OO封装不太熟悉,看了好一会《编写高质量代码》这本书,写得可真不错。
全部代码打包下载

Categories: JS & JQuery, 技术 Tags:

[每周读书] 第二十四周 《编写高质量代码——WEB前端开发修炼之道》

May 26th, 2011 No comments

互联网业界里头,WEB前端开发算是颇为年青的一行了,大约是从原先的“网页制作”演变而来。在WEB开发还被称为“网页制作”的时代,WEB的内容还大都是静态的,内容、结构混在一起,直到WEB2.0兴起,才把前端、设计、后台等很好的分开来。而前端所要掌握的最基本的技能,大约包括:CSS、HTML和JS。

这本书的作者曹刘阳前辈,是一名资深WEB前端开发工程师,先后就职于雅虎中国和淘宝,现就职于新浪。书中所写的内容都是很实在的,没有泛泛而谈的长篇大论,有的只是实战中积累下来的大量宝贵的经验,对于前端工程师来说很有帮助。虽然你可能已经做过不少网站,虽然这些网站看起来都没有多大问题,甚至运行的很好,也兼顾了浏览器兼容性,但是你总会有没有注意到的东西。比方说HTML,这个看起来很简单的东西,往往深入去了解就会发现其实很复杂。这本书介绍了HTML、CSS和JS里头各种需要注意的地方,很细很重要,这本书的主要读者应当是已经做过一两个项目的前端工作者,对于CSS、HTML和JS都有一定程度的了解和掌握,才能比较好地理解其中的专业词汇。不过总的来说还是很容易理解的。

下面贴一下我看了本书之后的一些笔记。

第一章和第二章从网站重构一直谈到团队合作的重要性,没有很深入涉及技术,但是都很重要。

 

第三章高质量的HTML

HTML里面最需要注意的应当是标签的语义化,这点在《超越CSS》一书也重点强调过。

1.为什么要使用语义化的标签。

比方说从h1~h6,我们在浏览器中看到的内容都是经过CSS定义过样式的,但是搜索引擎“看不到”这些样式,它们看到的是直接的代码,而富有语义的代码则对搜索引擎更加友好。比方说一个网页的大纲,使用h1~h6来定义要远远好过使用无数个div。

“但是搜索引擎看不到视觉效果,看到的只是代码,只能通过标签来判断内容的语义。”

CSS很强大,但是如果使用不当,容易是我们陷入CSS布局的一个误区——只要不是table布局,只要是通过CSS布局的,就是对的,就是符合WEB标准的。如果只考虑最终视觉效果,而不考虑标签语义,其实又走上了table布局的老路。

正确的做法是:先确定HTML,确定语义的标签,再来选用合适的CSS。

2.如何确定你的标签是否予以良好

去掉样式,看网页结构是否组织良好有序,是否仍然有很好的可读性。如著名的“CSS裸体日”。

推荐使用Firefox上的一个扩展——Web Developer.

可以看看W3C官网,去掉CSS样式之后网页的可读性依然极佳。

3.常见模块

1)标题用h1~h6,段落用p等等

2)表单中,用filedset包括起来,用legend写表单的title,用label设置input的名称。(这样讲不太清楚,建议看看原书。)

3)table中,使用caption,thead,tbody,tfoot和th等标签。

第四章 高质量的CSS

这章和后面一章高质量的JavaScript都是重点。

1.怪异模式和DTD

DTD即Document Type Definition,我们一般写在HTML开头作为文件类型声明。虽然类型挺多,常见的有四种,都挺长的,而目前最新的HTML5直接写为<!DOCTYPE HTML>即可。怪异模式就又是IE的专利了,如果我们的DTD漏写了,在FF里面是没问题的,但是在IE(6、7、8都是)里面就会变得很诡异了。

2.组织CSS

书中介绍一种把CSS分为三层的方法:base层->common层->page层。

最底层的base层可以说是css reset,中间common层则提供组件,page层则每个页面都不同,也是我们写CSS的重点。

base层因为只是做reset工作,一般有一个成熟的文件就可以了,可以使用作者推荐的base.css文件,在书里有,或者直接用YUI框架里头的那个也行。

3.划分模块

写CSS类的时候我们通常需要观察设计稿中相同的部分,然后划分出各个不同的模块,最大程度地使得模块可以重用。

以下是划分模块的技巧:

1)模块与模块之间尽量不要包含相同的部分,如果有相同的部分,应将它们提取出来,拆分成一个独立的模块。

2)模块应在保证数量尽可能少的原则下,做到尽可能简单,以提高重用性。

4.CSS命名

CSS的命名推荐使用英语。

常用的命名法有骆驼命名法和划线命名法。推荐将这两种方法组合使用。比方说一个ul(比方class为timeList)中最后一个li我们要设置不一样的样式,比方多个左下右下的圆角或者少个下划线什么的,那么通常我们会在最有一个li里面定义一个”last”的class,然后再用子选择符比方这么写: .timeList li{…} .timeList li:last{…}这样。但是这样涉及一个问题:滥用子选择符。为了避免多工程师合作时产生的样式层叠等问题,不推荐轻易使用子选择符。

这时候就使用两种命名法组合使用,给最后一个li命名为timeList-last,或者timeList_last。这样可以很清晰地看到这个last属于timeList模块,而又不至于名字太长。

多工程师合作的时候,为了避免不同的工程师在同个页面用了同样的class名称,可以加个前缀,比方说zhang xia工程师负责的内容,就给命名前面加个zx-xxxx。这样命名虽然会变很长,但是当项目很大的时候这样的命名还是很有帮助的,利大于弊。

5.多用组合,少用继承

我们知道class和id的区别在于class可以有多个而id只能有一个。

在给几个看起来很相似的ul定义不同的样式的时候,我们可以给每个ul都定义不同的名字然后分别定义样式。但是这样的话,我们的CSS代码会看起来很冗长,当然,使用诸如 .numberList1, .numberList2{….}这样的方法可以是代码变得简洁。但是如果几个ul的浮动、字体大小和颜色各不相同的时候我们还是得多写很多行代码。

所以可以预先定义几个浮动类 .fl{float:left} .fr{float:right},定义几个字体类 .ft12{font-size:12px} .ft16{font-size:16px},颜色类 .red{color:red},之后只要在numberList1和2中挂上各自需要类就完了。

<ul>

<li>111</li>

</ul>

<ul>

<li>111</li>

</ul>

6.处理上下margin

对于模块来说,每个模块的margin通常都是不定的,因为设计的需要会有不同的margin。所以我们可以跟第5点一样挂上个 .mt20{margin-top:20px} 这样的类。

值得注意的是,如果相邻两个div都设置了margin-left或者margin-right那么距离会被叠加,而margin-top或者margin-bottom则只会显示其中一个数值。

比方

<style type=”text/css”>

.up{margin-bottom: 10px}

.down{margin-top: 10px}

</style>

<div class=”up”></div>

<div class=”down”></div>

本来我们指望这两个div可以相距20px,但事实上只相距了10px。

总结:如果不确定上下模块的上下margin特别稳定,最好不要将它写到模块的类里,而是使用类的组合,单独为上下margin挂用于边距的原子类(例如mt10,mb20)。模块最好不要混用margin-top和margin-bottom,统一使用margin-top或者margin-bottom。

 

7.低权重原则

当不同选择符的样式设置有冲突的时,会采用权重高的选择符设置的样式。

权重的规则是这样的:HTML标签的权重是1,class的权重是10,id的权重是100。例如p的权重是1,”div em”的权重是1+1=2,”strong.demo”的权重是10+1=11,”#test .red”的权重是100+10=110。

如果CSS选择符的权重相同,那么样式会遵循就近原则,哪个选择符最后定义,就采用哪个选择符的样式。(也就是说,写在CSS文件里面比较靠后的会覆盖写在前面的。)

为了保证样式容易被覆盖,提高可维护性,CSS选择符需保证权重尽可能低。

8.CSS sprite

为了减少HTTP请求,可以把不常变动的图片,比方说那些箭头啦下拉框啦按钮啦什么的合成一张图(这个大家应该不陌生了)。

不过这个也有缺点:1)影响开发速度;2)大图中每一个小图都不可以轻易改动,牵一发则动全身,等下整张图要重来过,而相关的CSS坐标也要全部重新标过

由于代价挺大的,所以流量不大的网站就没什么必要花费时间在这个东西上了,不划算呀。

9.常见问题

1)编码风格

作者推荐使用一行式代码风格。就是:

.test{width:960px;…}

.demo{background-color:green;…}

2)id和class

a.同一个网页,相同的id只能出现一次而class可以多次

b.id的选择符权重为100而class为10

c.原生的JS提供getElementById(),但是木有getElementByClassName(),所以要么自己写个要么用框架。

 

3)CSS hack

各种hack的方法大家应该都不陌生了,不一一赘述,总之轻易别hack,而各种hack方法各有利弊,自己是情况使用。

 

4)hasLayout

又是IE的专利,在IE里头如果出现各种诡异的错误想破脑袋解决不了的话可以试试触发IE才有的hasLayout属性,这是IE用于CSS的解析引擎,有时候触发这玩意儿一些诡异的错误就自动解决了。出发方法可以使用“zoom:1”来触发,这是相对比较好的方法。

 

5)块级元素和行内元素的区别

就是block和inline的区别。块级元素有div、p、form、ul等,行内元素有span、strong、em等。

块级元素会独占一行,默认情况下宽度自动填满父级元素。行内元素则不会独占一行,相邻的元素会排列在一行,排不下再自动换行,宽度随内容自适应。

块级元素可以设置margin和padding。行内元素的margin和padding则很诡异,水平的没问题,但是竖直的设置了会变大但是没有边距效果。

10.网格布局

注意:main的内容比sidebar的更重要,无论sidebar和main在样式上谁左谁右,在html标签上要保证main的标签在sidebar之前被加载(就是写在在sidebar之前)。

11.使用IETester进行IE兼容性调试。

 

 

第四章 高质量的JavaScript

1.使用匿名函数将脚本抱起来,可以有效控制全局变量,避免冲突隐患。如:

(function(){

var a = 123;

//工程师A写的代码

})();

(function(){

var a = 456;

//工程师B写的代码

})();

这样,虽然同样有个变量为a,如果没有匿名函数包裹那么a就是全局变量,互相之间就会影响到,用匿名函数包裹起来则作用域就在函数内,不会互相影响了。

2.使用命名空间

GLOBAL.A={};

GLOBAL.A.str2=a;

GLOBAL.A.str=b;

还可以使用多级命名空间:

GLOBAL.A.CAT={};

GLOBAL.B.CAT={};

GLOBAL.A.CAT.name=”mimi”;

GLOBAL.B.DOG.name=”wangcai”;

GLOBAL.A.CAT.move=function(){

}

GLOBAL.B.CAT.move=function(){

}

3.window.onload和DOMReady

二者都是在页面加载完成后执行函数。但是window.onload是必须所有元素都加载完成,也就是所有图片啦各种富媒体啦都下载完才会执行,而像DOMReady则是各种JS框架基本都提供的方法,比方jQuery的$(document).ready(); 用这个函数则会判断所有节点已生成时执行,即便图片没下载完,所以执行速度会快很多。

如果不想用JS框架那么就把自己的JS代码放在文件尾部的</body>前面,这样所有节点生成完就会执行该JS代码鸟~

4.CSS放在页头,JavaScript放在页尾

网速慢或者文件大的时候,用户需要第一时间看到最重要的内容,把JS文件放在页尾可以加快载入速度,而CSS放在页头则是不希望在网速慢的时候用户看到完全没样式的页面。

5.文件压缩

JS源文件我们一般有大量的空格和注释,使用压缩工具可以去掉空格和注释,还可以使用比较短的变量名代替原有变量名,使得文件变小很多。不过压缩后的文件可读性就差了,所以我们要记得备份源文件。

压缩可以使用Packer和YUI Compresser。

Packer是在线的,YUI Compresser则需要下载并使用命令行执行。

(剩下的JS高级部分就不列出来的,反正光用文字也说不清楚[其实是偷懒= =!],各位如果有兴趣就看看原书吧,还是挺不错的书的。^^)

解决MIUI无法轨迹球唤醒问题

May 10th, 2011 No comments

方法来自以下两篇文章:

http://forum.xda-developers.com/showthread.php?t=1066805

http://bbs.gfan.com/android-1315127-1-1.html

其实就是用sqlite3把’trackball_wake_screen’从false变为true而已,这个我觉得ROM里面应该是可以搞定的才对,就不知道为什么MIUI老整这些乱七八糟的低级问题出来。。。

方法就是打开手机里的Terminal Emulator终端,然后

1.输入su,切换到root权限

2.输入sqlite3 /data/data/com.android.providers.settings/databases/settings.db “insert into system (name,value) values (‘trackball_wake_screen’,1);”

重启机器。搞定。如果还不行就参考上面两篇文章用adb的方法试试。

Categories: Android, 技术 Tags:

解决MIUI无法定位GPS的问题

May 8th, 2011 No comments

最近给DZ刷了MIUI,结果让GPS无法定位问题搞得头大死。没有GPS我就用不了4sq等LBS软件那还有啥意思,但是刷了CM7又发现CM7远不如MIUI好看,所以最终还是苦苦找寻解决之道。
于是我这几天在MIUI论坛苦寻却还是一点办法都没有。今晚也不知道是用了什么方法,估计是刷radio的原因搞定的,写篇博文总结一下。

解决MIUI的GPS无法定位问题:
1.刷radio,也就是更新基带。
我刷的是12.50.60.24U_26.08.04.16_M。
2.在”设置”->“个人”->“我的位置”里面打开“使用无线网络”和“使用GPS卫星”
我是到这里就可以解决问题了,定位很快,瞬间就定位完成。

如果还不能解决可以尝试下面的步骤:
3.在”设置”->“个人”->“我的位置”里面打开“GPS配置”
NTP服务器:asia.pool.ntp.org
supl服务器:supl.sirf.com
端口:7275
还有很多其他的设置方法可以自行google,出来一大坨一大坨

4.还不行的话,就在拨号界面里面拨“*#*#4636#*#*”,然后在“手机信息里面”,最底部那里,有个“切换DNS检查”,如果状态是“not allowed”就按一下,改成“allowed”。
5.最后还有一种方法是修改gps.conf文件,但是这个是最无效的办法了。

我的机器是HTC Desire Z,截至发稿日用的MIUI版本是1.5.6

Categories: Android, 技术 Tags:

利用.htaccess文件进行URL重写

April 13th, 2011 No comments


今天折腾了好久这玩意儿,本地测试失败但是服务器端可以运行=_= 记下来权当备份吧。
一、配置服务器
首先,在apache里面的conf目录下找到httpd.conf文件,把
LoadModule rewrite_module modules/mod_rewrite.so
一行前面的#号去掉,打开rewrite_module模块。
然后,确认

<Directory “E:/xampp/htdocs”>
AllowOverride All
Order allow,deny
Allow from all
</Directory>

二、准备.htaccess文件
在你的站点目录下,找到或者新建一个.htaccess文件,在win下命名会有点麻烦,自个儿慢慢折腾呗,用命令行进行重命名会比较简单。
然后在这个.htaccess文件里面,我们开始写入URL重命名规则。
比方说我们有

http://localhost/old.php?val=88

这样的URL,要改成

http://localshot/test/88

这样类型的URL,那么就这么写:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^test/([0-9]+)$ old.php?val=$1 [L]
</IfModule>

其中,
RewriteRule ^test/([0-9]+)$ old.php?val=$1 [L]
一句,“old.php?val=$1”是原来的URL,“^test/([0-9]+)$”是你想要改成的URL的正则表达式。
想要更深入研究rewrite模块,可以参考这个网址:初级URL重写指南 http://lamp.linux.gov.cn/Apache/ApacheMenu/rewrite/rewrite_guide.html

Categories: WEB, 技术 Tags:

Android新手装神马软件

March 5th, 2011 1 comment

入Android(HTC Desire Z)一周,写点东西记录一下,Android变化太快,机子半年就out,软件也是更新很快,我现在写的东西也许过两天就凹凸了,权当备份咯~

首先,给你的机子取得root权限。具体可以看这张帖子:http://bbs.gfan.com/viewthread.php?tid=397851
root权限不是必须的,但有的软件是需要的,至于root是神马可以自己google之,简单地理解为取得root就取得最高权限可以对系统进行任何操作就行了。

系统工具类:

ADW


强大的桌面管理工具,我用的机器是HTC Desire z, HTC sense虽然很强大,但是用ADW管理桌面更合我心意,尤其是它下面一排dock,跟我用iOS的习惯相符。 Read more…

Categories: Android, 技术 Tags: