2011-03-27 71 views
1

对不起,我是法语:) 我创建了名为“Slider”的Mootools类。 该类有一个“slider_element”属性,它是一个DIV元素。 该课程还有一个“驱逐舰”的方法。这个方法破坏了DIV元素。了解Mootools的课

slider_element应该是一个包含另一个带有“删除”CSS类名的DIV的div。当我点击“删除DIV”时,我想调用“毁灭者”方法,以便DIV消失。

这是我的代码如下,它的工作原理和我想要的一样。 我的问题是:当我销毁DIV元素时,我不需要更多我的Slider实例(这里是“mySlider”)。但是我的代码破坏了DIV元素,而不是滑块实例。这个实例是否仍然存在?我想是的。所以我搜索了如何用Mootools摧毁一个类的实例,但没有找到...所以我认为我做错了一些事情,即使我的代码做了我想要的图形。请帮助:)

var Slider = new Class({ 
    initialize: function(slider_element){ 
     this.slider_element = slider_element; 
     this.slider_element.getElements('*[class="remove"]').addEvent('click', this.destroyer.bind(this)); 
    }, 
    destroyer: function(){ 
    this.slider_element.destroy(); 
    } 
}); 
var myElement = $('my_slider'); 
var mySlider = new Slider(myElement); 

(在现实中,这是一个简单的代码,所以我不跟我的整个代码打扰你)

+0

如果你不通过实例控制你的滑块,比如'mySlider.method()'我会说,不要把它作为var保存。只是'new Slider(document.id(“my_slider”));'但实例将继续存在,即使它的DOM功能已被删除。 'this.slider_element.getElements(“。remove”)'更好,但this.slider_element.addEvent(“click:relay(.remove)”,this.destroyer.bind(this))'将使用更少的内存和更小的占地面积(通过元素委托)。 – 2011-03-27 19:38:20

回答

0

没有办法明确破坏的JavaScript对象。你所能做的最好的是删除对它的所有引用,并希望你的JavaScript实现重用内存。

所以基本上你可以只是null覆盖任何引用(比如在你的榜样mySlider)。但是很容易出现一些你无法控制的'隐式'引用,例如在闭包中(用于事件) - 你可以通过'清除'引用其他对象的任何属性来帮助垃圾收集器,把它扔掉,但是你必须确保没有什么不好的事情发生,如果一个引用在某处存在,并且有东西试图使用这些属性。

对于元素,Mootools有destroy方法,该方法遍历整个DOM子树,并清除所有属性以及元素的关联存储(如事件侦听器),然后将其从DOM中删除。

在你的情况下,作为@Dimitar克里斯托夫写道,如果你没有调用Slider对象上的方法任何外部的代码,你并不需要参考保存到它var mySlider

如果你不这样做,唯一能够保持活动状态的对象是.bind(this)addEvent调用中构建的闭包栈帧的引用。当事件触发并调用destroy时,事件侦听器将被删除,并且JavaScript引擎也可以自由释放对象Slider

+0

非常感谢您的快速解答。我将'mySlider'设置为'null',并使用'this.slider_element.addEvent(“click:relay(.remove)”,this.destroyer.bind(this))'(我会试着去理解,不知道这个“中继”的东西)。非常感谢 – 2011-03-31 18:12:27