Archive

Archive for the ‘JS & JQuery’ Category

解决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高级部分就不列出来的,反正光用文字也说不清楚[其实是偷懒= =!],各位如果有兴趣就看看原书吧,还是挺不错的书的。^^)

使用cufon让网页支持自定义字体

September 3rd, 2010 No comments

昨天画了一下OPhoto的首页,写CSS的时候发现中间的两句标语有点问题,我的意愿是要让后台动态生成这两句标语的文本,以便适应不同的用户,所以这两句就不能使用图片来做,但是字体又是特殊字体,怎么办呢?

google只发现一个可以支持修改网页字体的好东西,cufon,这个 东西可以把字体文件转换成JS文件然后在页面载入时导入这个字体JS就能实现页面字体的自定义了,实际上也是利用JS把字体转换成矢量的形式载入的,很强大,遂推荐之。

这是它的官网:http://cufon.shoqolate.com/generate/

把需要的字体上传后生成JS文件,再下载必要的JS文件,导入自己的HTML页即可。

注意,jquery的导入一定要在最前,不然字体在IE6下无效。

http://www.google.com/url?sa=t&source=web&cd=1&ved=0CBUQFjAA&url=http%3A%2F%2Fcufon.shoqolate.com%2F&ei=XS6ATIXOFYyfcaKN4bcL&usg=AFQjCNEkym1BzbKgtGiMUKxr12gghpMIvQ&sig2=TAGS9xupBjRV6iDoBVQRVQ
Categories: css, JS & JQuery, 技术 Tags: ,

JQuery——lightbox效果

May 25th, 2010 No comments

写了一个基于JQuery的lightbox效果,作为练习。还没写教程,先放个DEMO上来,教程以后再写。

不过可能会用纯JS写多一遍之后再放教程。

DEMO里用了CSS3做圆角和阴影,IE没有圆角但使用了IE的filter做阴影效果。

目前没做动画效果,以后补教程的时候再做。

DEMO地址:http://www.windyshade.com/wp-content/wh-demos/lightbox/demo.html

源码:猛击这里下载源码

Categories: css, JS & JQuery, 技术 Tags: , , , ,

解决Javascript函数默认参数问题

May 21st, 2010 1 comment

今天在写着JS代码的时候,由于函数需要传参并且有不传参的情况,在C/C++里面我们可以使用

void myfunction( arg1 = 11 ){…}

来设置参数的默认值。但是Javascript里面并不提供这种功能。

我在写代码的时候用的是JQuery,同样也不提供默认参数设置。

在网上搜了挺多,大多没用,我的想法是:先在函数里包含一个形参$arg(这里用JQuery作为例子),然后在函数体中判断$arg是否存在,如果存在则使用该值,如果不存在则赋默认值。

但是我使用if($arg)时是判断不了的,使用if($arg == null)也一样判断不了,在网上搜了一下使用if( $arg.length == 0 )也还是不行。alert一下$arg,显示为[Obeject][Obeject],即JQuery返回的数组。

解决的办法是:使用.length方法判断该变量长度,如果为false则表示$arg没有赋值。代码如下:

function sample( $arg ){

    if(  !( $arg.length ) ){

        $arg = 111;

    }

    ….

}

Categories: JS & JQuery, 技术 Tags: , ,