]> source.dussan.org Git - gwtquery.git/commitdiff
implement undelegate methods
authorJulien Dramaix <julien.dramaix@gmail.com>
Mon, 11 Apr 2011 20:34:40 +0000 (20:34 +0000)
committerJulien Dramaix <julien.dramaix@gmail.com>
Mon, 11 Apr 2011 20:34:40 +0000 (20:34 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/main/java/com/google/gwt/query/client/LazyGQuery.java
gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/Events.java
gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/LazyEvents.java
gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/events/EventsListener.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryEventsTest.java

index 506cc262a6f91bf2ff830c400d2ae92329e792fb..4698bcae282f77ff7af5a8408fcf6cf802b5fe0f 100644 (file)
@@ -3355,6 +3355,50 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery unbind(int eventbits) {\r
     return as(Events).unbind(eventbits);\r
   }\r
+  \r
+  /**\r
+   * Remove all event delegation that have been bound using\r
+   * {@link #delegate(String, int, Function...)} {@link #live(int, Function...)} methods\r
+   */\r
+  public GQuery undelegate() {\r
+    return as(Events).undelegate();\r
+  }\r
+  \r
+  /**\r
+   * Undelegate is a way of removing event handlers that have been bound using\r
+   * {@link #delegate(String, int, Function...)} method\r
+   */\r
+  public GQuery undelegate(String selector) {\r
+      for (Element e : elements()){\r
+        $(selector, e).die();\r
+      }\r
+      \r
+      return this;\r
+  }\r
+\r
+  /**\r
+   * Undelegate is a way of removing event handlers that have been bound using\r
+   * {@link #delegate(String, int, Function...)} method\r
+   */\r
+  public GQuery undelegate(String selector, String eventName) {\r
+      for (Element e : elements()){\r
+        $(selector, e).die(eventName);\r
+      }\r
+      \r
+      return this;\r
+  }\r
+  \r
+  /**\r
+   * Undelegate is a way of removing event handlers that have been bound using\r
+   * {@link #delegate(String, int, Function...)} method\r
+   */\r
+  public GQuery undelegate(String selector, int eventBit) {\r
+      for (Element e : elements()){\r
+        $(selector, e).die(eventBit);\r
+      }\r
+      \r
+      return this;\r
+  }\r
 \r
   /**\r
    * Remove all duplicate elements from an array of elements. Note that this\r
index 680e2c356de6e7aa3374979d1ae117239d25ebb4..6fe42c1af488d21e64988c2af899c7b3e9769b50 100644 (file)
@@ -1880,6 +1880,30 @@ public interface LazyGQuery<T> extends LazyBase<T>{
    */
   LazyGQuery<T> unbind(int eventbits);
 
+  /**
+   * Remove all event delegation that have been bound using
+   * {@link #delegate(String, int, Function...)} {@link #live(int, Function...)} methods
+   */
+  LazyGQuery<T> undelegate();
+
+  /**
+   * Undelegate is a way of removing event handlers that have been bound using
+   * {@link #delegate(String, int, Function...)} method
+   */
+  LazyGQuery<T> undelegate(String selector);
+
+  /**
+   * Undelegate is a way of removing event handlers that have been bound using
+   * {@link #delegate(String, int, Function...)} method
+   */
+  LazyGQuery<T> undelegate(String selector, String eventName);
+
+  /**
+   * Undelegate is a way of removing event handlers that have been bound using
+   * {@link #delegate(String, int, Function...)} method
+   */
+  LazyGQuery<T> undelegate(String selector, int eventBit);
+
   /**
    * Remove all duplicate elements from an array of elements. Note that this
    * only works on arrays of DOM elements, not strings or numbers.
index bdd3802e9f4f9e004ef0d79753fe2a39623c7d86..5bebe3393c4569dbfc49c10cb7b1252c9870a8b9 100644 (file)
@@ -273,5 +273,12 @@ public class Events extends GQuery {
       e.dispatchEvent(evt);
     }
   }
+  
+  public Events undelegate(){
+    for (Element e : elements()) {
+      EventsListener.getInstance(e).cleanEventDelegation();
+    }
+    return this;
+  }
 
 }
index 5ce730115e63b2a2700b255e0fa3794eec899867..0ef62afeb230521644692dfaa22b83d04a1adf08 100644 (file)
@@ -140,4 +140,6 @@ public interface LazyEvents<T> extends LazyBase<T>{
    */
   LazyEvents<T> unbind(String name);
 
+  LazyEvents<T> undelegate();
+
 }
index efd534050d4b6b337e4e5bb7309a2cd5a5d21f04..d673025afeed077b099ce4728351021f84282525 100644 (file)
@@ -110,6 +110,10 @@ public class EventsListener implements EventListener {
       
       bindFunctions.add(f);
     }
+    
+    public void clean(){
+      bindFunctionBySelector = new HashMap<String, List<BindFunction>>();
+    }
 
     @Override
     public boolean fire(Event event) {
@@ -493,4 +497,10 @@ public class EventsListener implements EventListener {
   private int getTypeInt(String eventName) {
     return "submit".equals(eventName) ? ONSUBMIT : Event.getTypeInt(eventName);
   }
+
+  public void cleanEventDelegation() {
+    for (LiveBindFunction function : liveBindFunctionByEventType.values()){
+      function.clean();
+    }
+  }
 }
index 075788d7f2a48dcc6816eda20506919d1a9d0dc5..4acc0146060d3c43f5bbe9eb8dd9957958ab22d6 100644 (file)
@@ -443,6 +443,158 @@ public class GQueryEventsTest extends GWTTestCase {
     
   }
 
+  public void testUnDelegate(){
+    
+    $(e).html("<div class='mainDiv'><div class='subDiv'>Content 0<span>blop</span></div></div><div class='mainDiv'><div class='subDiv'>Content 0<span>blop</span></div></div>");
+    
+    $(".mainDiv",e).delegate(".subDiv", "click", new Function(){
+      @Override
+      public void f(Element e) {
+        $(e).css(CSS.COLOR.with(RGBColor.RED));
+      }
+    });
+    
+    $(".mainDiv",e).delegate(".subDiv", Event.ONMOUSEOVER, new Function(){
+      @Override
+      public void f(Element e) {
+        $(e).css(CSS.BACKGROUND_COLOR.with(RGBColor.YELLOW));
+      }
+    });
+    
+    for (Element mainDiv : $(".mainDiv",e).elements()){
+      for (int i = 0; i < 3 ; i++){
+        String html = "<div class='subDiv'>Content "+i+"<span>blop</span></div>";
+        $(mainDiv).append(html);
+      }
+    }
+   
+    assertEquals(8, $(".subDiv",e).length());
+    
+    $("span",e).click().trigger(Event.ONMOUSEOVER);
+    
+    for (Element el : $(".subDiv",e).elements()){
+      assertEquals("red", $(el).css(CSS.COLOR));
+      assertEquals("yellow", $(el).css(CSS.BACKGROUND_COLOR));
+      //reset
+      $(el).css(CSS.COLOR.with(RGBColor.BLACK), CSS.BACKGROUND_COLOR.with(RGBColor.WHITE));
+    }
+    
+    $(".mainDiv", e).undelegate(".subDiv",Event.ONCLICK);
+    
+    $("span",e).click().trigger(Event.ONMOUSEOVER);
+    
+    for (Element el : $(".subDiv",e).elements()){
+      assertEquals("black", $(el).css(CSS.COLOR));
+      assertEquals("yellow", $(el).css(CSS.BACKGROUND_COLOR));
+      //reset
+      $(el).css(CSS.COLOR.with(RGBColor.BLACK), CSS.BACKGROUND_COLOR.with(RGBColor.WHITE));
+    }
+    
+    $(".mainDiv", e).undelegate(".subDiv","mouseover");
+    
+    $("span",e).click().trigger(Event.ONMOUSEOVER);
+    
+    for (Element el : $(".subDiv",e).elements()){
+      assertEquals("black", $(el).css(CSS.COLOR));
+      assertEquals("white", $(el).css(CSS.BACKGROUND_COLOR));
+    }
+  }
+  
+  public void testUnDelegateAll(){
+    
+    $(e).html("<div class='mainDiv'><div class='subDiv'>Content 0<span>blop</span></div></div><div class='mainDiv'><div class='subDiv'>Content 0<span>blop</span></div></div>");
+    
+    $(".mainDiv",e).delegate(".subDiv", "click", new Function(){
+      @Override
+      public void f(Element e) {
+        $(e).css(CSS.COLOR.with(RGBColor.RED));
+      }
+    });
+    
+    $(".mainDiv",e).delegate(".subDiv", Event.ONMOUSEOVER, new Function(){
+      @Override
+      public void f(Element e) {
+        $(e).css(CSS.BACKGROUND_COLOR.with(RGBColor.YELLOW));
+      }
+    });
+    
+    for (Element mainDiv : $(".mainDiv",e).elements()){
+      for (int i = 0; i < 3 ; i++){
+        String html = "<div class='subDiv'>Content "+i+"<span>blop</span></div>";
+        $(mainDiv).append(html);
+      }
+    }
+   
+    assertEquals(8, $(".subDiv",e).length());
+    
+    $("span",e).click().trigger(Event.ONMOUSEOVER);
+    
+    for (Element el : $(".subDiv",e).elements()){
+      assertEquals("red", $(el).css(CSS.COLOR));
+      assertEquals("yellow", $(el).css(CSS.BACKGROUND_COLOR));
+      //reset
+      $(el).css(CSS.COLOR.with(RGBColor.BLACK), CSS.BACKGROUND_COLOR.with(RGBColor.WHITE));
+    }
+    
+    $(".mainDiv", e).undelegate(".subDiv");
+    
+    $("span",e).click().trigger(Event.ONMOUSEOVER);
+    
+    for (Element el : $(".subDiv",e).elements()){
+      assertEquals("black", $(el).css(CSS.COLOR));
+      assertEquals("white", $(el).css(CSS.BACKGROUND_COLOR));
+    }
+  }
+
+public void testUnDelegateAll2(){
+    
+    $(e).html("<div class='mainDiv'><div class='subDiv'>Content 0<span>blop</span></div></div><div class='mainDiv'><div class='subDiv'>Content 0<span>blop</span></div></div>");
+    
+    $(".mainDiv",e).delegate(".subDiv", "click", new Function(){
+      @Override
+      public void f(Element e) {
+        $(e).css(CSS.COLOR.with(RGBColor.RED));
+      }
+    });
+    
+    $(".mainDiv",e).delegate(".subDiv", Event.ONMOUSEOVER, new Function(){
+      @Override
+      public void f(Element e) {
+        $(e).css(CSS.BACKGROUND_COLOR.with(RGBColor.YELLOW));
+      }
+    });
+    
+    for (Element mainDiv : $(".mainDiv",e).elements()){
+      for (int i = 0; i < 3 ; i++){
+        String html = "<div class='subDiv'>Content "+i+"<span>blop</span></div>";
+        $(mainDiv).append(html);
+      }
+    }
+   
+    assertEquals(8, $(".subDiv",e).length());
+    
+    $("span",e).click().trigger(Event.ONMOUSEOVER);
+    
+    for (Element el : $(".subDiv",e).elements()){
+      assertEquals("red", $(el).css(CSS.COLOR));
+      assertEquals("yellow", $(el).css(CSS.BACKGROUND_COLOR));
+      //reset
+      $(el).css(CSS.COLOR.with(RGBColor.BLACK), CSS.BACKGROUND_COLOR.with(RGBColor.WHITE));
+    }
+    
+    $(".mainDiv", e).undelegate();
+    
+    $("span",e).click().trigger(Event.ONMOUSEOVER);
+    
+    for (Element el : $(".subDiv",e).elements()){
+      assertEquals("black", $(el).css(CSS.COLOR));
+      assertEquals("white", $(el).css(CSS.BACKGROUND_COLOR));
+    }
+  }
+
+
+
+
   public void testLiveWithMultipleEvent() {
     
     $(e).html("<div id='div1'><div id='div2'>Content 1<span id='span1'> blop</span></div></div>");