`
katelin
  • 浏览: 30663 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

事件处理和内存释放

阅读更多
请大家看一下这个例子:

<div id="myDiv1" style="border:solid 1px;width:100px;display:inline;">test1</div>&nbsp;
<button onclick="t1.deleteClick1()">删除test1事件</button><br/><br/>

<div id="myDiv2" style="border:solid 1px;width:100px;display:inline;">test2</div>&nbsp;
<button onclick="t2.deleteClick1()">删除test2事件</button><br/><br/>

<script>
Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    __method.call(object, event || window.event);
  }
}

function addEvent (ele, eType, fn, useCapture) {
	if (ele.addEventListener) {
	   ele.addEventListener(eType, fn, useCapture);
	   return true;
	}else if (ele.attachEvent) {
	   return ele.attachEvent('on' + eType, fn);
	}else {
	    ele['on' + eType] = fn;
	}
}

function deleteEvent (ele, eType, fn, useCapture) {
	if (ele.removeEventListener){
	    ele.removeEventListener(fn, fn, false);
	}else if (c.detachEvent){
	    ele.detachEvent(fn, fn);
	}
}

function Test(objid, addType){
	this.name = 'katelin';
	this.obj = document.getElementById(objid);
	if(addType == 1){
	   this.addClick1();	
	}else{
	    //用bindAsEventListener,在事件触发的时候,能够取到Test对象的属性值,this.name
	    addEvent(this.obj, 'click', this.doClick.bindAsEventListener(this));
	}
}

Test.prototype.doClick = function(){
	alert('add click event to div: \n' + this.name);
}

Test.prototype.addClick1 = function(){
	var c = this.obj;
	//这样加事件,在执行doClick的时候,doClick里的this就不是这个对象了
	if (c.addEventListener){
	   c.addEventListener("click", this.doClick, false);
	}else if (c.attachEvent){
	   c.attachEvent("onclick", this.doClick);
	}else{
	   c.onclick = this.doClick;
	}
}

Test.prototype.deleteClick1 = function(){
	var c = this.obj;
	if (c.removeEventListener){
	   c.removeEventListener("click", this.doClick, false);
	}else if (c.detachEvent){
	   c.detachEvent("onclick", this.doClick);
	}
}

var t1 = new Test('myDiv1');
var t2 = new Test('myDiv2', 1);
</script>


我通过Javascript对象来为div增加onclick事件。我用两种方式来增加事件:

第一种通过addClick1,但是这样添加事件,在单击div的时候,处理div单击事件的方法 doClick 没有办法取到javascript对象的属性值,所以打出来的this.name是空。

第二种通过addEvent(this.obj, 'click', this.doClick.bindAsEventListener(this)); 因为用了bindAsEventListener(this),在doClick方法里调用到的this就是当前的这个javascript对象,所以打出来的this.name不为空。

我现在想问一下,用第二种方法在事件处理的方法里虽然可以取到javascript对象了,但是如果我要去事件移掉,要怎么移掉?第一种方法是可以移掉的。

另外,页面上写很多的脚本,每次刷新的时候,内存有增无减。应该怎么写内存释放的方法?同时这种方法要在什么时刻运行比较好?是onunload还是onbeforeunload?

分享到:
评论
9 楼 zkj_beyond 2007-01-21  
http://www.railscn.com/viewtopic.php?t=93&sid=50a85aa8fa0379d4a601d89e247caa74

/* prevent memory leaks in IE */
/**
* 页面onload 的时候取消所有事件注册,避免ie内存泄漏的bug
*/
Event.observe(window, 'unload', Event.unloadCache, false);

8 楼 katelin 2007-01-21  
我中午找了一下,没找到啊。

另:是姐姐。
7 楼 jianfeng008cn 2007-01-21  
katelin 写道
zkj_beyond 回答一下啊。谢谢。


帅哥 javaeye<<论坛提问的智慧>>需要读读哦 人家已经提示到这份上了,没看过跑去看看也很方便的嘛
6 楼 katelin 2007-01-21  
zkj_beyond 回答一下啊。谢谢。
5 楼 ronghao 2007-01-19  
试了一下,没有找到移除的方法。原因不明,会是因为闭包??
4 楼 ronghao 2007-01-19  
c.onclick = this.doClick;
我不在DOM视图对象的事件函数上这样绑定函数,我愿意这样:
c.onclick = doClick;
因为doClick实际执行时的上下文(也就是this)是DOM视图对象,而非javascript对象。
3 楼 netfishx 2007-01-19  
用了addEvent,就再用一个removeEvent嘛
2 楼 katelin 2007-01-19  
嗯。因为其实我没有看prototype的代码(现在时间比较紧)。
因为在开发中遇到事件绑定的问题,偶尔看到这种扩展了Function的bindAsEventListener方法。

^_^能不能直接告诉我怎么移掉?谢谢!
1 楼 zkj_beyond 2007-01-19  
参考了prototype.js的代码,但为什么不参考全呢?:twisted:








在window.unload方法里注销事件方法。

相关推荐

    易语言内存释放演示

    子程序1可能涉及动态内存的分配和初始化,而子程序2可能处理内存的释放和清理工作。通过这两个子程序,开发者可以学习如何在易语言中有效地进行内存操作,确保程序运行的稳定性和效率。 在源码分析中,我们通常会...

    wince内存释放,wince内存释放

    本文将深入探讨WinCE环境下的内存释放机制,以及如何有效地进行内存管理和优化。 1. WinCE内存管理基础 WinCE内存管理系统采用了一个与Windows NT相似的模型,包括堆、栈和全局数据区等部分。堆是动态分配内存的...

    易语言内存释放

    "易语言内存释放"这个主题主要涉及到程序运行过程中动态分配和释放内存的过程。本文将深入探讨易语言中的内存管理,特别是内存释放及其相关的技术。 易语言是中国本土开发的一种编程语言,其设计目标是让编程变得...

    sqlserver内存释放

    为了更方便地管理和释放内存,可以创建一个存储过程来执行一系列内存清理操作,并临时调整 SQL Server 的最大内存使用量。以下是一个示例存储过程: ```sql CREATE PROC [dbo].reclaimmemory AS BEGIN DBCC ...

    内存释放专家2.0

    内存释放专家2.0通过优化和管理内存使用,有效释放内存空间,提高电脑的整体运行效率。 其工作原理主要涵盖以下几个关键步骤: 首先是**实时监控**。软件会持续监控内存使用情况,通过后台运行的方式,不断检测每...

    电脑内存释放工具

    内存是计算机中重要的资源之一...总的来说,"电脑内存释放工具"是针对电脑性能优化的重要辅助软件,特别是对于经常处理大量数据或者运行资源占用高的应用程序的用户来说,适时使用内存释放工具能有效提升电脑运行效率。

    最好的内存释放软件,支持win7 64位 效果相当好

    当我们谈论“内存释放软件”时,我们通常是指那些辅助系统优化工具,它们能够帮助清理和整理计算机的RAM(随机访问存储器),以提高电脑运行速度和响应时间。 在Windows 7 64位系统上,由于其支持更大的内存容量,...

    动态连接库中的内存释放

    在DLL中处理内存管理是至关重要的,因为错误的内存操作可能导致内存泄漏或者更严重的问题,如程序崩溃。本文件探讨的是如何在DLL中正确地进行内存申请和释放。 首先,我们来看DLL中的`DllFunc()`函数,它通过`new`...

    内存释放专家

    内存是计算机运行程序的重要组成...总之,"内存释放专家"是一款旨在提升电脑运行速度的实用工具,适用于经常需要处理大量任务或长时间运行程序的用户。合理使用并结合其他优化措施,能帮助用户获得更好的电脑使用体验。

    VB内存释放管理器的代码

    5. **异常处理**:在处理内存释放时,可能遇到对象已释放或者未初始化的错误,良好的异常处理机制可以帮助捕获和处理这些异常,避免程序崩溃。 6. **代码优化**:内存释放管理器可能会提供一些最佳实践,如避免全局...

    sqlserver内存释放工具(个人感觉还不错)

    此时,"sqlserver内存释放工具"就显得很有价值。 标题中的“sqlserver内存释放工具”暗示了这是一个针对SQL Server内存优化的实用程序,可能是由开发者或社区成员为了帮助用户解决内存问题而创建的。这类工具通常...

    易语言释放内存源码.zip

    在处理内存管理方面,易语言提供了一系列的机制来帮助开发者有效地管理程序的内存,防止出现卡死、异常等问题。"易语言释放内存源码.zip" 文件包含了这些关键的内存管理代码,用于实现程序运行过程中的防卡死处理和...

    内存释放工具mesmerize

    综合以上信息, Mesmerize作为一个内存释放工具,其目标是帮助用户提高计算机的运行效率,尤其对于那些经常处理大量数据或者多任务的用户来说,可以显著改善系统性能。使用Mesmerize时,用户应根据自身需求调整软件...

    内存释放专家内存释放专家.zip

    总的来说,内存释放专家是解决内存泄漏问题的有效工具,通过自动化内存管理和优化,它有助于保持系统的流畅运行,延长设备的使用寿命,尤其对于那些经常处理大内存需求任务的用户来说,是不可或缺的助手。

    易语言源码易语言内存释放源码.rar

    本压缩包文件"易语言源码易语言内存释放源码.rar"提供了关于易语言内存释放的相关源码,这对于理解和实践易语言中的内存操作具有很高的学习价值。 在易语言中,内存释放主要是指释放程序在运行过程中分配的内存空间...

    自动释放sql server 进程内存的程序,附源代码

    2. 频繁的内存释放可能会增加SQL Server的工作负担,因此要合理设置释放间隔和条件,平衡性能和资源占用。 3. 在没有专业数据库管理员的情况下,使用此类工具需谨慎,最好先在测试环境中验证其效果,避免对生产环境...

    内存释放(易语言),节约资源,健壮软件

    本文将深入探讨如何利用DLL Windows API在易语言中进行内存释放,以实现资源的有效利用和软件的健壮性。 首先,我们需要理解内存的概念。内存是计算机运行程序时临时存储数据的地方,分为堆和栈两部分。栈用于存储...

    内存释放专家--飞一般的感觉

    内存释放专家,正如其名,是一种专门针对内存优化的工具,它的主要目标是提高系统的性能和稳定性,尤其是在处理内存密集型应用时。下面将详细讨论内存释放、内存管理以及这种工具如何工作。 内存,也称为RAM(随机...

    一款很好用的内存自动释放工具

    内存,也称为RAM(随机存取存储器),是计算机中临时存储数据的地方,用于快速访问正在运行的程序和处理的数据。当计算机运行多个程序或资源消耗大的应用时,内存会被大量占用,可能导致系统响应变慢。这时,内存...

Global site tag (gtag.js) - Google Analytics