JavaScript垃圾回收机制

一、垃圾回收的必要性

下面这段话引自《JavaScript权威指南(第四版)》

  由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。

这段话解释了为什么需要系统需要垃圾回收,JS不像C/C++,他有自己的一套垃圾回收机制(Garbage Collection)。JavaScript的解释器可以检测到何时程序不再使用一个对象了,当他确定了一个对象是无用的时候,他就知道不再需要这个对象,可以把它所占用的内存释放掉了。例如: Continue reading

js里面如何获取网络地址的图片的高度和宽度 (变通办法)

原图片是 :<img src=”http://gg.blueidea.com/2008/blueidea/flash2008.gif”>

<div id=”box”></div>

<script language=”javascript”>
(function(){
var img=document.createElement(‘img’);//创建一个img元素
img.src=”http://gg.blueidea.com/2008/blueidea/flash2008.gif”;//指定src
img.style.position=”absolute”;//防止正常的内容变形
img.style.visibility=’hidden’;//藏起来
var inj=document.getElementById(‘box’).appendChild(img);//插入到box中。当然插入到document.body也可以
alert(‘宽:’+inj.offsetWidth);//然后就可以通过 offset 取得宽和高了
alert(‘高:’+inj.offsetHeight);
})();
</script>

简单地说就是把图片放入一个自动伸缩的DIV中,然后获取DIV的宽和高!

JS内存释放问题

一个内存释放的实例

<SCRIPT LANGUAGE=”JavaScript”>
<!–
strTest = “1”;
for ( var i = 0; i < 25; i ++ )
{
strTest += strTest;
}
alert(strTest);
delete strTest;
CollectGarbage();
//–>
</SCRIPT>

CollectGarbage, 是IE的一个特有属性,用于释放内存的使用方法嘛应该是,将该变量或引用对象,设置为null或delete然后在进行释放动作
在 做CollectGarbage前,要必需清楚的两个必备条件:

引用
– 一个对象在其生存的上下文环境之外,即会失效。
– 一个全局的对象在没有被执用(引用)的情况下,即会失效。 Continue reading

js过滤word格式

function cleanAndPaste(html) …{
// Remove all SPAN tags
html = html.replace(/</?SPAN[^>]*>/gi, “” );
// Remove Class attributes
html = html.replace(/<(w[^>]*) class=([^ |>]*)([^>]*)/gi, “<$1$3″) ;
// Remove Style attributes
html = html.replace(/<(w[^>]*) style=”([^”]*)”([^>]*)/gi, “<$1$3”) ;
// Remove Lang attributes
html = html.replace(/<(w[^>]*) lang=([^ |>]*)([^>]*)/gi, “<$1$3”) ;
// Remove XML elements and declarations
html = html.replace(/<\??xml[^>]*>/gi, “”) ;
// Remove Tags with XML namespace declarations: <o:p></o:p>
html = html.replace(/</?w+:[^>]*>/gi, “”) ;
// Replace the &nbsp;
html = html.replace(/&nbsp;/, ” ” );
// Transform <P> to <DIV>
var re = new RegExp(“(<P)([^>]*>.*?)(</P>)”,”gi”) ; // Different because of a IE 5.0 error
html = html.replace( re, “<div$2</div>” ) ;

return html;
}

addEventListener的参数说明

我想大家对这个函数的前两个参数已经很了解了吧,主要是第三个参数不很好理解。我查了一些资料,弄明白了这个问题,所以记录下来了。下面的内容,基本上是参考别人的。

第三个参数叫做useCapture,是一个boolean值,就是true or false,如果是rue的话就是浏览器会使用Capture方式,false的话是Bubbling,只有在特定状况下才会有影响,通常建议是false,而会有影响的情形是目标元素(target element)有父元素(ancestor element),而且也有同样的事件对应函数,我想,看图比较清楚。

     

   
像這張圖所顯示的,我的範例有兩層div元素,而且都設定有click事件,一般來說,如果我在內層藍色的元素上click不只會觸發藍色元素的click事件,還會同時觸發紅色元素的click事件,而useCapture這個參數就是在控制這時候兩個click事件的先後順序。如果是false,那就會使用bubbling,他是從內而外的流程,所以會先執行藍色元素的click事件再執行紅色元素的click事件,如果是true,那就是capture,和bubbling相反是由外而內,會先執行紅色元素的click事件才執行藍色元素的click事件。

那如果不同層的元素使用的useCapture不同呢?就是會先從最外層元素往目標元素尋找設定為capture的事件,到達目標元素執行目標元素的事件後,再尋原路往外尋找設定為bubbling的事件。

attachEvent与addEventListener区别

适应的浏览器版本不同,同时在使用的过程中要注意
attachEvent方法          按钮onclick
addEventListener方法    按钮click

有关addEventListener函数的相关参数请点击这里查看

两者使用的原理:可对执行的优先级不一样,下面实例讲解如下:
attachEvent方法,为某一事件附加其它的处理事件。(不支持Mozilla系列)

addEventListener方法 用于 Mozilla系列

举例: document.getElementById(“btn”).onclick = method1;
document.getElementById(“btn”).onclick = method2;
document.getElementById(“btn”).onclick = method3;如果这样写,那么将会只有medhot3被执行

写成这样:
var btn1Obj = document.getElementById(“btn1”); //object.attachEvent(event,function);
btn1Obj.attachEvent(“onclick”,method1);
btn1Obj.attachEvent(“onclick”,method2);
btn1Obj.attachEvent(“onclick”,method3);执行顺序为method3->method2->method1

如果是Mozilla系列,并不支持该方法,需要用到addEventListener var btn1Obj = document.getElementById(“btn1”);
//element.addEventListener(type,listener,useCapture);
btn1Obj.addEventListener(“click”,method1,false);
btn1Obj.addEventListener(“click”,method2,false);
btn1Obj.addEventListener(“click”,method3,false);执行顺序为method1->method2->method3

使用实例:

1。 var el = EDITFORM_DOCUMENT.body;
//先取得对象,EDITFORM_DOCUMENT实为一个iframe
if (el.addEventListener){
el.addEventListener(‘click’, KindDisableMenu, false);
} else if (el.attachEvent){
el.attachEvent(‘onclick’, KindDisableMenu);
}2。 if (window.addEventListener) {
window.addEventListener(‘load’, _uCO, false);
} else if (window.attachEvent) {
window.attachEvent(‘onload’, _uCO);
}

使用js检测图片合法性

用js检测图片合法性

<script type=”text/javascript”>
function validate() {
var OK = new Array (‘jpg’, ‘gif’, ‘jpeg’, ‘png’, ‘jpe’, ‘bmp’, ‘tif’);
var filename = document.getElementById(“ELEMENT_ID”).value;
var ext = getExt(filename);
var fileOK = 0;

for (i = 0; i < OK.length; i++) {
if (OK[i] == ext) {
fileOK = 1; // one of the file extensions found
}
}

if (fileOK == 0) {
alert (“The file is not an image file”);
return false;
}
}

function getExt(filename) {
var dot_pos = filename.lastIndexOf(“.”);
if(dot_pos == -1)
return “”;
return filename.substr(dot_pos+1).toLowerCase();
}
</script>
<form action=”ACTION” onsubmit=”return validate()” enctype=”multipart/form-data” method=”post”>
<table class=”forms”>
<tr>
<th><label>Image</label></th>
<td><input id=”ELEMENT_ID” name=”poster[image]” size=”30″ type=”file” />
<input id=”event_poster_image_temp” name=”poster[image_temp]”
type=”hidden” value=”” />
</td>
</tr>
<tr>

<th class=”last”></th>
<td class=”last”>
<input class=”button” name=”commit” type=”submit” value=”Upload image” />
</td>
</tr>
</table>
</form>

JavaScript isNaN() 函数

义和用法

isNaN() 函数用于检查其参数是否是非数字值。

语法

isNaN(x)
参数 描述
x 必需。要检测的值。

返回值

如果 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返回的值就是 true。如果 x 是其他值,则返回 false。

说明

isNaN() 函数可用于判断其参数是否是 NaN,该值表示一个非法的数字(比如被 0 除后得到的结果)。

如果把 NaN 与任何值(包括其自身)相比得到的结果均是 false,所以要判断某个值是否是 NaN,不能使用 == 或 === 运算符。正因为如此,isNaN() 函数是必需的。

提示和注释

提示:isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字。当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的情况。

实例

在本例中,我们将使用 isFinite() 在检测无穷数:

<script type="text/javascript">

document.write(isFinite(123))	//返回 false
document.write(isFinite(-1.23))	//返回 false
document.write(isFinite(5-2))	//返回 false
document.write(isFinite(0))		//返回 false
document.write(isFinite(0/0))	//返回 true
document.write(isFinite("Hello"))	//返回 true
document.write(isFinite("2005/12/12"))	//返回 true
document.write(isFinite(true))	//返回 false
document.write(isFinite(undefined))	//返回 true

</script>

TIY

isNaN()
如何使用 isNaN()。

JavaScript push() 方法

定义和用法

push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。

语法

arrayObject.push(newelement1,newelement2,....,newelementX)
参数 描述
newelement1 必需。要添加到数组的第一个元素。
newelement2 可选。要添加到数组的第二个元素。
newelementX 可选。可添加多个元素。

返回值

把指定的值添加到数组后的新长度。

说明

push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。

提示和注释

注释:该方法会改变数组的长度。

提示:要想数组的开头添加一个或多个元素,请使用 unshift() 方法。

实例

在本例中,我们将创建一个数组,并通过添加一个元素来改变其长度:

<script type="text/javascript">

var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"

document.write(arr + "<br />")
document.write(arr.push("James") + "<br />")
document.write(arr)

</script>

输出:

George,John,Thomas
4
George,John,Thomas,James

TIY

push()
如何使用 push() 来改变数组的长度。