Archive for the 'javascript' Category



JavaScript优化细节(过多的DOM调用)

在Web开发中,JavaScript的一个很重要的作用就是对DOM进行操作。可你知道么?对DOM的操作是非常昂贵的,因为这会导致浏览器执行回流(reflow)操作。而执行了过多的回流操作,你就会发现自己的网站变得越来越慢了。我们应该尽可能的减少DOM操作。
回流操作主要会发生在几种情况下:
改变窗体大小
更改字体
添加移除stylesheet块
内容改变哪怕是输入框输入文字
CSS虚类被触发如 :hover
更改元素的className
当对DOM节点执行新增或者删除操作或内容更改时。
动态设置一个style样式时(比如element.style.width=”10px”)。
当获取一个必须经过计算的尺寸值时,比如访问offsetWidth、clientHeight或者其他需要经过计算的CSS值(在兼容DOM的浏览器中,可以通过getComputedStyle函数获取;在IE中,可以通过currentStyle属性获取)。
解决问题的关键,就是限制通过DOM操作所引发回流的次数:
1.在对当前DOM进行操作之前,尽可能多的做一些准备工作,保证N次创建,1次写入。
2.在对DOM操作之前,把要操作的元素,先从当前DOM结构中删除:
通过removeChild()或者replaceChild()实现真正意义上的删除。
设置该元素的display样式为“none”。
修改操作完成后,将上面这个过程反转过来,建议使用第2种方式。
3.CSS部分
另外一个经常引起回流操作的情况是通过style属性对元素的外观进行修改,如element.style.backgroundColor = “blue”;
每次修改元素的style属性,都肯定会触发回流操作,要解决这个问题可以:
使用更改className的方式替换style.xxx=xxx的方式。
使用style.cssText = ”;一次写入样式。
避免设置过多的行内样式
添加的结构外元素尽量设置它们的位置为fixed或absolute
避免使用表格来布局
避免在CSS中使用JavaScript expressions(IE only)
4.将获取的DOM数据缓存起来。这种方法,对获取那些会触发回流操作的属性(比如offsetWidth等)尤为重要。
5.当对HTMLCollection对象进行操作时,应该将访问的次数尽可能的降至最低,最简单的,你可以将length属性缓存在一个本地变量中,这样就能大幅度的提高循环的效率。

JavaScript优化细节(在循环中执行了太多的操作)

DEMO:
var testobj = document.getElementById(”test”);
for(var i=0;i-1;i–){
oText = testobj.childNodes[i].innerHTML;
if(oText==””){
alert(”Item “+i+” is null”);
}
}
M2说testobj.childNodes[i].childNodes比testobj.childNodes[i].innerHTML快,暂且不提;
月MM说,关键的问题是循环体内没有必要对oText重复初始化,而不是重复声明;因为for不是一个scope,对于js来说;但是对于其他一些语言如C或者Java显然是有区别的;

动态加载JS脚本的4种方法

动态加载JS脚本的4种方法[转自http://hi.baidu.com/ajax]
要实现动态加载JS脚本有4种方法:
1、直接document.write
document.write(””);
2、动态改变已有script的src属性
s1.src=”test.js”
3、动态创建script元素
var oHead = document.getElementsByTagName(’HEAD’).item(0);
var oScript= document.createElement(”script”);
oScript.type = “text/javascript”;
oScript.src=”test.js”;
oHead.appendChild( oScript);
  这三种方法都是异步执行的,也就是说,在加载这些脚本的同时,主页面的脚本继续运行,如果用以上的方法,那下面的代码将得不到预期的效果。
要动态加载的JS脚本:a.js,以下是该文件的内容。
var str = “中国”;
alert( “这是a.js中的变量:” + str );
主页面代码:
function LoadJS( id, [...]

JavaScript splice() 方法

定义和用法
splice() 方法用于插入、删除或替换数组的元素。
语法
arrayObject.splice(index,howmany,element1,…..,elementX)参数 描述
index 必需。规定从何处添加/删除元素。
该参数是开始插入和(或)删除的数组元素的下标,必须是数字。
howmany 必需。规定应该删除多少元素。必须是数字,但可以是 “0″。
如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
element1 可选。规定要添加到数组的新元素。从 index 所指的下标处开始插入。
elementX 可选。可向数组添加若干元素。
返回值
如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。
说明
splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。
提示和注释
注释:请注意,splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改。
实例
例子 1
在本例中,我们将创建一个新数组,并向其添加一个元素:
var arr = new Array(6)
arr[0] = “George”
arr[1] = “John”
arr[2] = “Thomas”
arr[3] = “James”
arr[4] = “Adrew”
arr[5] = “Martin”
document.write(arr + ““)
arr.splice(2,0,”William”)
document.write(arr + ““)
输出:
George,John,Thomas,James,Adrew,Martin
George,John,William,Thomas,James,Adrew,Martin例子 2
在本例中我们将删除位于 index 2 的元素,并添加一个新元素来替代被删除的元素:
var arr = new Array(6)
arr[0] = “George”
arr[1] = “John”
arr[2] [...]

JS的split用法

function spli(){
datastr=”2,2,3,5,6,6″;
var str= new Array();
str=datastr.split(”,”);
for (i=0;i<str.length ;i++ )
{
document.write(str[i]+”“);
}
}
spli();
=============================
定义和用法
split() 方法用于把一个字符串分割成字符串数组。
语法
stringObject.split(separator, [...]

Firebug Lite

目前最好的 JavaScript 调试工具非 Firebug 莫属,然而该工具只支持 FireFox,将 Firebug Lite .js 文件插入你的网页,就可以在所有浏览器都实现 FireBug 功能。

JavaScript 字符串转换数字

方法主要有三种
转换函数、强制类型转换、利用js变量弱类型转换。
1. 转换函数
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。
在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串。parseInt()方法首先查看位置0处的字符,判断它是否是个有效数字;如果不是,该方法将返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的测试。这一过程将持续到发现非有效数字的字符为止,此时parseInt()将把该字符之前的字符串转换成数字。
例如,如果要把字符串 “1234blue “转换成整数,那么parseInt()将返回1234,因为当它检测到字符b时,就会停止检测过程。字符串中包含的数字字面量会被正确转换为数字,因此字符串 “0xA “会被正确转换为数字10。不过,字符串 “22.5 “将被转换成22,因为对于整数来说,小数点是无效字符。一些示例如下:
parseInt(”1234blue”); //returns 1234
parseInt(”0xA”); //returns 10
parseInt(”22.5″); //returns 22
parseInt(”blue”); //returns NaN
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,所以要解析十六进制的值,需如下调用parseInt()方法:
parseInt(”AF”, 16); //returns 175
当然,对二进制、八进制,甚至十进制(默认模式),都可以这样调用parseInt()方法:
parseInt(”10″, 2); //returns 2
parseInt(”10″, 8); [...]

firefox css自动换行的实现方法

IE直接用:
word-break:break-all; /*允许词内换行*/
word-wrap:break-word; /*内容将在边界内换行*/
/*需要注意的默认是:*/
word-wrap:normal /*允许内容顶开指定的窗口边界*/
而firefox却没有很好的实现办法 ,一个折中方案就是使用滚动条,但网上也提出了一种用js来判断换行的办法,这里摘录下(转自网络,特此说明)。 JavaScript复制代码
<script type=”text/javascript”>
function toBreakWord(intLen, id){
var obj=document.getElementById(id);
var strContent=obj.innerHTML;
var strTemp=””;
while(strContent.length>intLen){
strTemp+=strContent.substr(0,intLen)+”<br>”;
strContent=strContent.substr(intLen,strContent.length);
}
strTemp+= strContent;
obj.innerHTML=strTemp;
}
</script>
注:以上脚本放在</head>前面.
同个页面单处调用:
<div id=”content”>这里是要应用换行的内容</div><script type=”javascript”>toBreakWord(60, “content”);</script>
同个页面多处调用:
<div id=”content”>这里是要应用换行的内容</div><script type=”javascript”>toBreakWord(60,”content”);</script>
<div id=”content2″>这里是要应用换行的内容</div><script type=”javascript”>toBreakWord(60,”content2″);</script>
注:把应用的JS写在</div>后面,其中60表示一行要显示多少字字符,注意多个调用时ID的相应变化,不能同一个ID名称,应用上面的方法后IE也会是按设定的字符数换行,但是IE里面支持自动换行,所以只要判断一下是否为IE,如果不是IE就不要输出上面的 XML/HTML复制代码
<script language=”javascript”>toBreakWord(60, “content”);</script>
这段JS,如果不是就要输出。代码未经测试,偶只看了思路,有需要的自己去调试吧!有错误给我留言。
本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/15423.htm

js数组操作方法

shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined
var a = [1,2,3,4,5];
var b = a.shift(); //a:[2,3,4,5] b:1
unshift:将参数添加到原数组开头,并返回数组的长度
var a = [1,2,3,4,5];
var b = a.unshift(-2,-1); //a:[-2,-1,1,2,3,4,5] b:7
注:在IE6.0下测试返回值总为undefined,FF2.0下测试返回值为7,所以这个方法的返回值不可靠,需要用返回值时可用splice代替本方法来使用。
pop:删除原数组最后一项,并返回删除元素的值;如果数组为空则返回undefined
var a = [1,2,3,4,5];
var b = a.pop(); //a:[1,2,3,4] b:5
push:将参数添加到原数组末尾,并返回数组的长度
var a = [1,2,3,4,5];
var b = a.push(6,7); //a:[1,2,3,4,5,6,7] b:7
concat:返回一个新数组,是将参数添加到原数组中构成的
var a = [1,2,3,4,5];
var b = a.concat(6,7); //a:[1,2,3,4,5] b:[1,2,3,4,5,6,7] [...]

得到div的内容

想要得到div中的内容
test
使用doument.getElementByID.innerHTML就可以了