假如我附上的各种事件的听众的各种形式的元素。后来,我要删除整个形式。

它是必要的(或建议)取消注册的任何事件处理程序上存在的形式及其元素呢?如果是这样,什么是最简单的方法,以消除所有听众收集的元素呢?是什么造成的后果不这样做呢?我使用的原型,如果它事项。

这就是我实际上这样做。我有一个简单的形式,像这样:

<form id="form">
  <input type="text" id="foo"/>
  <input type="text" id="bar"/>
</form>

我观察各种活动的投入,例如:

$('foo').observe('keypress', onFooKeypress);
$('bar').observe('keypress', onBarKeypress);

等等。

形式提交,是通过阿贾克斯和响应是一个新的副本形式。我取代旧的形式与一个复制的新做喜欢的东西 $('form').replace(newForm).我积累了一大堆的事件令人讨厌?

有帮助吗?

解决方案

是啊,一点。不足是一个巨大的问题,但是旧版本的即将泄漏在这些情况。

作为原型1.6.1(目前在其最后释放候选人),图书馆处理这个清页上卸载。当你使用原型添加一个事观察员,它保持一个参考,元件阵列;在页卸载,它循环,通过这阵列和删除您所有的观察员。

但是,如果用户要留在这页,内存使用情况将累积的生活。你有几种选择:

  1. 听着事件的一个 祖先 的形式,一个永远不会被替换。然后,在处理程序,检查那里的事件。(即"事件的代表团")

  2. 明确联合国登记所有你的电话之前 Element#replace.在你的例子,你会做的:

    $('foo', 'bar').each(Element.stopObserving);
    

这等于呼叫 stopObserving 与没有参数,其中有消除效果的 所有 处理在给定的元素。

我会推荐选项1。

(我们已经讨论过做自动监听器拆除的未来版本中的原型的一部分 Element#updateElement#replace, 但这是一个性交易。)

其他提示

活动其不是未注册的可能不会自动释放他们的记忆。这是特别是在旧版本的IE中的问题。

使用原型为对于该一个自动垃圾收集系统,但该方法已1.6版本被删除。据记载这里。无论去除方法意味着垃圾收集不再发生,或者刚才的方法是不公开的了,我不知道。还要注意的是它只会被调用在页面卸载,这意味着如果你的用户留在同一页上很长一段时间,而做了很多AJAX和DOM更新,内存甚至可能在一个页面访问泄漏到不可接受的程度。

它总是好的,以从被从DOM除去在于乔纳斯下面提到的场景的情况下,元件除去任何事件侦听器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top