用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;
}
}
}
}
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;
}
}
}
}
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)
}
}