]> source.dussan.org Git - gwtquery.git/commitdiff
improve filter method to work with detached elements
authorJulien Dramaix <julien.dramaix@gmail.com>
Fri, 4 Mar 2011 21:18:35 +0000 (21:18 +0000)
committerJulien Dramaix <julien.dramaix@gmail.com>
Fri, 4 Mar 2011 21:18:35 +0000 (21:18 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java

index be78d55131677a74ec78fcfffbadb5e211a1c77d..0b6cbb463acf4385c8091e4f134894b14369f446 100644 (file)
@@ -1152,15 +1152,28 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * filters at once.\r
    */\r
   public GQuery filter(String... filters) {\r
+    \r
     JsNodeArray array = JsNodeArray.create();\r
+    \r
     for (String f : filters) {\r
       for (Element e : elements()) {\r
+        boolean ghostParent = false;\r
+        \r
+        if (e.getParentNode() == null){\r
+          DOM.createDiv().appendChild(e);\r
+          ghostParent = true;\r
+        }\r
+        \r
         for (Element c : $(f, e.getParentNode()).elements()) {\r
           if (c == e) {\r
             array.addNode(c);\r
             break;\r
           }\r
         }\r
+        \r
+        if(ghostParent){\r
+          e.removeFromParent();\r
+        }\r
       }\r
     }\r
     return pushStack(unique(array), "filter", filters[0]);\r
index 19b349e5f16445f14e2adbaeff077ef7f0491814..824abf51f6501c979b19b2feb5bb955c8bdcc1ea 100644 (file)
@@ -32,6 +32,7 @@ import com.google.gwt.query.client.impl.SelectorEngineImpl;
 import com.google.gwt.query.client.impl.SelectorEngineSizzle;
 import com.google.gwt.query.client.js.JsNodeArray;
 import com.google.gwt.query.client.js.JsUtils;
+import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.HTML;
@@ -645,11 +646,6 @@ public class GQueryCoreTest extends GWTTestCase {
     assertEquals(expectedHtml, $(e).html());
 
     // the returned gquery object should be the original with the div elements
-    // bug in filter method : wrap $inner in a div to use filter method on it
-    final GQuery outer = $("<div class=\"outer\"></div>");
-    for (Element e : $inner.elements()) {
-      outer.append(e);
-    }
     assertEquals(3, $inner.filter("div.inner").length());
 
     $(e).html(content);
@@ -812,6 +808,7 @@ public class GQueryCoreTest extends GWTTestCase {
     assertHtmlEquals(expected, $(e).html());
   }
 
   public void testFilterBody() {
     GQuery myNewElement = $("<div>my new div</div>");
     boolean isAttachedToTheDOM = myNewElement.parents().filter("body").size() > 0;
@@ -821,6 +818,36 @@ public class GQueryCoreTest extends GWTTestCase {
     isAttachedToTheDOM = myNewElement.parents().filter("body").size() > 0;
     assertEquals(true, isAttachedToTheDOM);
   }
+  
+  public void testFilterMethod(){
+    // first test filter on element attached to the DOM
+    String content = "<div class='outer'><div class='inner first'>Hello <span>blop</span></div><div class='inner second'>And</div><div class='inner third'>Goodbye</div></div>";
+
+    $(e).html(content);
+    
+    assertEquals(5, $("*", e).length());
+    assertEquals(4, $("*", e).filter("div").length());
+    assertEquals(1, $("*", e).filter("div.outer").length());
+    assertEquals(3, $("*", e).filter("div.inner").length());
+    assertEquals(1, $("*", e).filter("span").length());
+    
+    GQuery $html = $("<div>div1</div><div>div2</div><div>div3</div><span>span1</span>");
+    assertEquals(3, $html.filter("div").length());
+    assertEquals(1, $html.filter("span").length());
+    
+    JsNodeArray array = JsNodeArray.create();
+    for (int i = 0 ; i < 3; i++){
+          array.addNode(DOM.createDiv());
+     }
+     assertEquals(3, $(array).filter("div").length()); 
+     
+     
+     String content2 = "<div><div class='inner first'>Hello</div><div class='inner second'>And</div><div class='inner third'>Goodbye</div></div>";
+     $(e).html(content2);
+     //the inner object contains the 3 div that are detached from the dom
+     GQuery $inner = $(".inner").replaceWith("<h3>blop</h3>");
+     assertEquals(3, $inner.filter("div").length()); 
+  }
 
   public void testGQueryWidgets() {
     final Button b1 = new Button("click-me");