用prototype框架,在IE下,如果没有把element的所有方法与事件清空,则就会发生内存泄露的情况,我是用这种方法做的,在每次删除元素的时候都运行一下:
function purge_element_event(elem) {
if(Prototype.Browser.IE){
if(elem.nodeType != 1){
return;
}
var elem_name_array_search = ['div','table','tr','button','input','a'];
clear_object_functions(elem);
var elem_name_length = elem_name_array_search.length;
var elem_index = elem_name_array_search.indexOf(elem.tagName.toString().toLowerCase());
if(elem_index<3){
for(var i=0;i<elem_name_length;i++){
var elem_collection = elem.getElementsByTagName(elem_name_array_search[i]);
var elem_collection_length = elem_collection.length;
for(var c=0;c<elem_collection_length;c++){
clear_object_functions(elem_collection[c]); // 这里可以直接清
}
}
}else{
clear_object_functions(elem);
}
}
}//清空一个元素内的function
function clear_object_functions(elem){
var elem_attr = elem.attributes;
if(elem_attr){
var elem_attr_len = elem_attr.length;
for(var c = 0; c < elem_attr_len; c += 1) {
var n = elem_attr[c].name;
if (typeof elem[n] === 'function') {
elem[n] = null;
}
}
}
}

解决方案 »

  1.   

    这是我自己的类,你整理下吧System.AddEvent = function(dElement, dType, dFunction) {
        if (dElement.Events == null) dElement.Events = {}
        var aHandlers = dElement.Events[dType]
        if (aHandlers == null) {
            dElement.Events[dType] = {}
            dElement.EventsId = 0
            dElement[dType] = System.InsideExeEvent
            var aHandlers = dElement.Events[dType]
        }
        var aTrue = true
        for (var Id in aHandlers) {
            aTrue = aHandlers[Id] != dFunction
            if (aTrue) break;
        }
    }System.ExeEvent = function(dElement, dType) {
        var aHandlers = dElement.Events["on" + dType] || dElement.Events[dType]
        for (var Id in aHandlers) {
            aHandlers[Id].call(dElement, null)
        }
    }System.DelEvent = function(dElement, dType, dFunction) {
        var aHandlers = dElement.Events["on" + dType] || dElement.Events[dType]
        for (var Id in aHandlers) {
            if (aHandlers[Id] == dFunction) delete aHandlers[Id]
        }
    }//AddEvent增加事件后所执行的事件
    System.InsideExeEvent = function(dEvent) {
        dEvent = dEvent || window.event
        var aHandlers = this.Events["on" + dEvent.type] || this.Events[dEvent.type]
        for (var Id in aHandlers) {
            aHandlers[Id].call(this, dEvent)
        }
    }