WICKET-4689 Javascript timers not removed when a Component is replaced by ajax
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e7b5bcfb Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e7b5bcfb Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e7b5bcfb Branch: refs/heads/master Commit: e7b5bcfb4947ebca708528dfa13e5140c94a675b Parents: 467d658 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Aug 2 11:52:38 2012 +0300 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Aug 2 11:53:11 2012 +0300 ---------------------------------------------------------------------- .../wicket/ajax/AbstractAjaxTimerBehavior.java | 9 +++++++-- .../wicket/ajax/res/js/wicket-ajax-jquery.js | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/e7b5bcfb/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java index 4fc0682..3071875 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java @@ -19,6 +19,7 @@ package org.apache.wicket.ajax; import org.apache.wicket.Component; import org.apache.wicket.core.util.string.JavaScriptUtils; import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnLoadHeaderItem; import org.apache.wicket.request.http.WebRequest; import org.apache.wicket.util.time.Duration; @@ -35,6 +36,7 @@ public abstract class AbstractAjaxTimerBehavior extends AbstractDefaultAjaxBehav { private static final long serialVersionUID = 1L; + private static final String WICKET_TIMERS_ID = AbstractAjaxTimerBehavior.class.getSimpleName() + "-timers"; /** The update interval */ private Duration updateInterval; @@ -83,6 +85,9 @@ public abstract class AbstractAjaxTimerBehavior extends AbstractDefaultAjaxBehav { super.renderHead(component, response); + response.render(JavaScriptHeaderItem.forScript("if (typeof(Wicket.TimerHandles) === 'undefined') {Wicket.TimerHandles = {}}", + WICKET_TIMERS_ID)); + WebRequest request = (WebRequest) component.getRequest(); if (!isStopped() && (!headRendered || !request.isAjax())) @@ -105,14 +110,14 @@ public abstract class AbstractAjaxTimerBehavior extends AbstractDefaultAjaxBehav String timeoutHandle = getTimeoutHandle(); // this might look strange, but it is necessary for IE not to leak :( return timeoutHandle+" = setTimeout('" + js + "', " + - updateInterval.getMilliseconds() + ")"; + updateInterval.getMilliseconds() + ')'; } /** * @return the name of the handle that is used to stop any scheduled timer */ private String getTimeoutHandle() { - return "Wicket.timerHandle_"+getComponent().getMarkupId(); + return "Wicket.TimerHandles['"+getComponent().getMarkupId() + "']"; } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/e7b5bcfb/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js index d161627..fb6f14f 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js @@ -2485,4 +2485,14 @@ Wicket.Event.add(window, 'domready', Wicket.Focus.attachFocusEvent); + /** + * Remove any scheduled timers on the removed element. + */ + Wicket.Event.subscribe('/dom/node/removing', function(jqEvent, element) { + var id = element.id; + if (Wicket.TimerHandles && Wicket.TimerHandles[id]) { + window.clearTimeout(Wicket.TimerHandles[id]); + } + }); + })();
