From: Julien Dramaix Date: Fri, 4 Mar 2011 21:18:35 +0000 (+0000) Subject: improve filter method to work with detached elements X-Git-Tag: release-1.3.2~482 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a01efe08f9de2b60a99b6504d9c14cd5bb7dcc4b;p=gwtquery.git improve filter method to work with detached elements --- diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java index be78d551..0b6cbb46 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java @@ -1152,15 +1152,28 @@ public class GQuery implements Lazy { * filters at once. */ public GQuery filter(String... filters) { + JsNodeArray array = JsNodeArray.create(); + for (String f : filters) { for (Element e : elements()) { + boolean ghostParent = false; + + if (e.getParentNode() == null){ + DOM.createDiv().appendChild(e); + ghostParent = true; + } + for (Element c : $(f, e.getParentNode()).elements()) { if (c == e) { array.addNode(c); break; } } + + if(ghostParent){ + e.removeFromParent(); + } } } return pushStack(unique(array), "filter", filters[0]); diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java index 19b349e5..824abf51 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java @@ -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 = $("
"); - 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 = $("
my new 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 = "
Hello blop
And
Goodbye
"; + + $(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 = $("
div1
div2
div3
span1"); + 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 = "
Hello
And
Goodbye
"; + $(e).html(content2); + //the inner object contains the 3 div that are detached from the dom + GQuery $inner = $(".inner").replaceWith("

blop

"); + assertEquals(3, $inner.filter("div").length()); + } public void testGQueryWidgets() { final Button b1 = new Button("click-me");