diff options
author | Julien Dramaix <julien.dramaix@gmail.com> | 2011-03-04 21:18:35 +0000 |
---|---|---|
committer | Julien Dramaix <julien.dramaix@gmail.com> | 2011-03-04 21:18:35 +0000 |
commit | a01efe08f9de2b60a99b6504d9c14cd5bb7dcc4b (patch) | |
tree | 67cfcb6796a6e3b726fa32e8f6db953ad8cdfcf6 | |
parent | cf78932b648580d88a7c070a70df8fb84c052508 (diff) | |
download | gwtquery-a01efe08f9de2b60a99b6504d9c14cd5bb7dcc4b.tar.gz gwtquery-a01efe08f9de2b60a99b6504d9c14cd5bb7dcc4b.zip |
improve filter method to work with detached elements
-rw-r--r-- | gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java | 13 | ||||
-rw-r--r-- | gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java | 37 |
2 files changed, 45 insertions, 5 deletions
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<GQuery, LazyGQuery> { * 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 = $("<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"); |