1、各浏览器下 scrollTop的差异
IE6/7/8:
对于没有doctype声明的页面里可以使用 document.body.scrollTop 来获取 scrollTop高度 ;
对于有doctype声明的页面则可以使用 document.documentElement.scrollTop ;
Safari:
safari 比较特别,有自己获取scrollTop的函数 : window.pageYOffset ;
Firefox:
火狐等等相对标准些的浏览器就省心多了,直接用 document.documentElement.scrollTop ;
2、获取scrollTop值
完美的获取scrollTop 赋值短语 :
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;通过这句赋值就能在任何情况下获得scrollTop 值。
仔细观察这句赋值,你发现啥了没??
没错, 就是 window.pageYOffset (Safari) 被放置在 || 的中间位置。
因为当 数字0 与 undefine 进行 或运算时,系统默认返回最后一个值。即或运算中 0 == undefine ;
当页面滚动条刚好在最顶端,即scrollTop值为 0 时。 IE 下 window.pageYOffset (Safari) 返回为 undefine ,此时将 window.pageYOffset (Safari) 放在或运算最后面时, scrollTop 返回 undefine , undefine 用在接下去的运算就会报错咯。
而其他浏览器 无论 scrollTop 赋值或运算顺序如何都不会返回 undefine. 可以安全使用..
所以说到头还是IE的问题咯. 杯具…
精神有点恍惚,不知道有没有表达清楚。
不过最后总结出来这句实验过OK,大家放心使用;
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
javascript是一种解释型语言,性能无法达到和C、C++等编译语言的水平,但还是有一些方法来改进。
1、循环
JavaScript中的循环方式有for(;;)、while()、for(in)3种。其中for(in)的效率极差,因为for(in)执行过程中需要查询散列键。for(;;)和while()比较,while循环的效率要优于for(;;)。
2、局部变量和全局变量
局部变量的访问速度更快,因为全局变量其实是全局对象的成员,而局部变量是放在函数的堆栈当中的。
3、不使用eval
使用eval函数相当于在运行时再次调用解释引擎对内容进行解释运行
4、减少对象查找
因为JavaScript的特性,对于类是表达式a.b.c.d.e,需要至少4次查询操作。首先检查a在检查a中的b,如此往下。应尽量避免出现这样的表达式、可以利用局部变量把要访问的最终结果放入一个临时的位置进行查询。
这一点可以和循环结合起来,例如对一个数组可以先取他的长度 var len = a.length
##其实java 中对于列表的循环也是先取size给一个临时变量
5、字符串连接
如果是追加字符串,最好使用s+=anotherStr操作,而不要使用s=s+”"
但是如果要连接多个字符串,应该少用+= 例如:
- s+=a;
- s+=b;
- s+=c;
应该写成 s+=a+b+c;
如果是收集字符串,比如收集字符串,最好使用一个缓存实现。具体的实现思路就是使用Javascript数组来收集每个字符串,最好使用join方法将这些字符串连接起来,如下面代码所示:
6、类型转换
类型转换是JavaScript编程中容易出错的地方,因为JavaScript是动态类型语言,即弱类型语言,不能指定变量的具体类型。
(1)把数字转换成字符串,应用”"+1,虽然比较别扭一点、但效率是最高的
(”"+)>String()>.toString()>new String()
String()属于内部函数,所以速度很快,toString()要查询原型中的函数,new String()用于返回一个精确的副本。
(2)浮点数转换成整型 parseInt()用于将字符串转换成数字,应该使用Math.floor()或者Math.round()来实现浮点型和整型之间的转换。
(3) 对于自定义的对象,如果定义了toString()方法进行类型转换的话,推荐显示调用toString()
7、使用直接量
以往我们都使用new Array(parm,parm1..)等形式,对于直接量的解释JavaScript支持使用[param,param1….]来直接表达一个数组。
前一种方式调用Array内部构造器,而后一种方式是解释引擎直接解释的,故执行速度要略微快一点。同理var foo = {}比 var foo = new Object()快,var reg=/…./比 var reg=new RegExp()执行的快些。
8、字符串遍历
优先使用正则表达式
9、高级对象
自定义高级对象和Date、RegExp等对象构造时会消耗大量的时间和资源
10、插入HTML
document.write效率较低,innerHTML效率较高
11、下标查询
使用直接的下标查找一个对象的属性比通过.name方法要快很多
12、创建DOM节点
通常我们可能会使用字符串直接写HTML语句来创建节点,实际上这样有如下缺点:
无法保证代码的有效性;
字符串操作效率低。
应该使用documeng.createElement()方法。如果存在现成的样板节点,应该使用cloneNode()方法。
当你的网页有:
<html xmlns=”http://www.w3.org/1999/xhtml”>
的时候,document.body.clientHeight就用不了,页面无限拉长。
这个时候可以用document.documentElement.clientHeight来替代。
对于width同理。
万恶的…
在js中可以将字符串转化为xml对象,可以使用如下函数
|
function createXml(str){ |
|
var xmlDoc = new ActiveXObject(”Msxml2.DOMDocument.3.0″); |
|
var domxml= createXml(Http.responseText); |
在JavaScript中也有很多种的”空值”和”假值”,那么它们都有什么共同点和不同点呢?
其实标题里面我已经列出了JavaScript中所有的”空值”和”假值”,除了boolean值本身就是true和false这两种情况外,其它数据类型的”空值”主要是undefined和defined这两大类。更多…… Continue reading »
正则表达式使用详解
简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
JavaScript正则表达式exec和test方法实例
var u=”http://msdn.microsoft.com:80/scripting/default.htm”;
var s=/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
var a=s.exec(u);
for(i=1;i<a.length;i++){
alert(a[i]);
}
</script>
将该正则表达式应用于上面所示的URL后,子匹配包含下述内容:
a[1] 包含 “http”
a[2] 包含 “msdn.microsoft.com”
a[3] 包含 “:80″
a[4] 包含 “/scripting/default.htm”
(也可以用RegExp.$1、RegExp.$2、RegExp.$3、RegExp.$4取值)
function checkMobile( s )…{
var regu =/^[1][3][0-9]…{9}$/;
var re = new RegExp(regu);
return re.test(s);
}
checkMobile(’13909910000′);
</script>
用途:检查输入手机号码是否正确,如果通过验证返回true,否则返回false
正则表达式的创建,有2种办法:
var my_regex=/[a-z]+/g;
var my_regex=new (”[a-z]+”,”g”);
方法
exec(string): 对string进行正则处理,并返回匹配结果.
exec方法返回的数组有3个属性,分别是input、index和lastIndex 。
1 input 属性是整个被搜索的字符串。
2 index属性是指匹配在整个被搜索字符串中的位置。
3 lastIndex 属性是指匹配的子字符串的最后一个字符的下一个字符位置。
test(string): 测试string是否含有匹配结果
字符串对象中的正则
方法
match(pattern) :根据pattern进行正则匹配,如果匹配到,返回匹配结果,如匹配不到返回null
search(pattern) :根据pattern进行正则匹配,如果匹配到一个结果,则返回它的索引数;否则返回-1
replace(pattern,replacement) :根据pattern进行正则匹配,把匹配结果替换为replacement
split(pattern) :根据pattern进行正则分割,返回一个分割的数组
第一,正则表达式,直接找出参数等号右边的值即可。
<script language=“javascript“>
var str=window.location.href;
var es=/clid=([^&]+)/;
var clidArr=es.exec(str);
var clid=clidArr[1];
</script>
第二,把能找到的参数都付给argsarr数组,将来可以用argsarr[i]进行相应的访问,方法不错,太长,参数不容易记忆。 更多……