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]);
+               }
+       });
+
 })();

Reply via email to