Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过GWT中的CSS选择器查找元素_Gwt_Css Selectors_Gquery - Fatal编程技术网

通过GWT中的CSS选择器查找元素

通过GWT中的CSS选择器查找元素,gwt,css-selectors,gquery,Gwt,Css Selectors,Gquery,我试图使用GWT中的CSS选择器(例如“#someId.className a”)获取任意元素 我正在构建一个JS小部件,它可以在第三方网站上运行,并且希望能够与页面上的元素进行交互。在JavaDocs中搜索时,我没有看到任何可以通过选择器找到元素的内容。我确实遇到过GQuery,但它看起来像是一个项目,我不确定它是否与GWT2一起工作 我考虑过的一个选项是将现有库(jQuery、Mootools、Prototype等)包装到GWT类中,并通过JSNI公开所需的行为。看起来这可能很别致 任何人都

我试图使用GWT中的CSS选择器(例如“#someId.className a”)获取任意元素

我正在构建一个JS小部件,它可以在第三方网站上运行,并且希望能够与页面上的元素进行交互。在JavaDocs中搜索时,我没有看到任何可以通过选择器找到元素的内容。我确实遇到过GQuery,但它看起来像是一个项目,我不确定它是否与GWT2一起工作

我考虑过的一个选项是将现有库(jQuery、Mootools、Prototype等)包装到GWT类中,并通过JSNI公开所需的行为。看起来这可能很别致

任何人都有在GWT中使用通用CSS选择器的经验吗?

有一个类,它提供了许多用于访问DOM树的包装器方法。据我所知,没有任何函数采用CSS选择器jQuery风格——GWT只是鼓励/强制通过小部件(以及类似的)而不是直接访问DOM元素——尽管我知道在您的情况下可能需要这种“低级”方法。我认为通过纯JavaGWT方法实现这一点的唯一方法是通过大量(可能很可怕)的
DOM
类链接/调用。如果你只需要访问一些
id
,那就更容易了——因为有(而且,它们返回的对象类型不同)

然而,正如您已经建议的,JSNI可能会提供一个更好的解决方案-尝试从JSNI返回
$wnd.$(“#someId.className a”)
,作为
元素
-实际上,您可以从JSNI返回任何内容,GWT只会在尝试使用时浪费时间,比如说,将int作为DOM元素或其他内容


PS:虽然GQuery项目看起来确实是死气沉沉的/不活跃的,但可能值得检查它们是如何包装jQuery调用的(例如
$
),以便它们看起来可以在GWT中使用。

您可以使用querySelector()和querySelectorAll(),这两种工具可用于较新的浏览器

…在浏览器支持方面,Firefox 3.1+、IE8+(仅在IE8标准模式下)和Safari 3.1支持querySelector()和querySelectorAll()+


使用GwtQuery,更新为GWT 2.4:

选择器示例:

//select an element having id equals to 'container'
GQuery myElement = $("#container");
//select all elements having 'article' as css class
GQuery allArticles = $(".article");
/select all cells of tables
GQuery allCells = $("table > tr > td");
//find the ul elements being inside a element with class 'article' itself inside a element with id 'container'
GQuery articleUls = $("#container .article ul");

受启发

有了它,您可以定义这个方法,并在web应用程序在现代浏览器中运行时享受它

public final native NodeList<Element> querySelectorAll(String selectors) /*-{
 return $doc.querySelectorAll(selectors);
 }-*/;
public final本机节点列表querySelectorAll(字符串选择器)/*-{
返回$doc.querySelectorAll(选择器);
}-*/;

下面是一个使用GWT元素和节点类查找具有给定类名的单个嵌套元素的示例。这不像文字CSS选择器那样开放和强大,但可以根据您的特定用例进行修改:

static public Element findFirstChildElementByClassName( Widget w, String className ){
    return findFirstChildElementByClassName( w.getElement(), className );
}
static private Element findFirstChildElementByClassName( Element e, String className ){     
    for( int i=0; i != e.getChildCount(); ++i ){
        Node childNode = e.getChild(i);
        if( childNode.getNodeType() == Node.ELEMENT_NODE ){
            Element childElement = (Element)childNode;
            if( childElement.getClassName().equalsIgnoreCase( className ) )
                return childElement;
            else if( childElement.hasChildNodes() ){
                Element grandChildElement = 
                    findFirstChildElementByClassName( 
                            childElement, className );
                if( grandChildElement != null ) return grandChildElement;
            }
        }
    }
    return null;
}

GWTQuery/GQuery似乎已经恢复,不活动很可能对应于GWT 2.1的发行版。在GWT中没有本机
querySelector[All]
确实令人沮丧。我想知道这个项目是否注定会被讨厌客户端开发的人运行。
querySelector
querySelectorAll
在GWT中不可用。jQuery有一个选择器重写,名为“GwtQuery”或“gQuery”。GWT可以调用任何Javascript方法,只需编写一个小包装器方法作为参数的传递。请参阅GWT文档中有关本机方法访问的文档。在我的工作中,这个方法就是用来从GWT访问querySelector/querySelectorAll的。我为doc/element querySelector和querySelectorAll编写了一行GWT JSNI包装器,现在我大量使用它们,并取得了很好的效果。简单、可靠、快速。当然,您可以通过JNSI向GWT“添加”属性访问器,但这违反了GWT的理念。您希望能够让GWT构建一个排列,以便与IE6、7、8、Safari、Gecko 1_8和更老的版本一起使用。回答不好。问题是如何使用GWT函数执行此操作。具体取决于需要。通过使用PhoneGap开发你的应用程序来瞄准iOS和Android浏览器?只需要支持WebKit,所以使用querySelectorAll()。将单一浏览器作为公司内部应用程序(如我的旧工作场所)的目标?强制所有销售人员在Chrome上运行应用程序并使用querySelectorAll,他们不会注意到web浏览器窗口和桌面应用程序窗口之间的区别。请用简单的态度。试着这样做,我得到:“uncaughttypeerror:Object[Object DOMWindow]没有方法“$”。我需要在页面上也使用jQuery.js还是什么?是的,您需要在主机页面中包含jQuery.js文件。另外,请看一看,但是JSNI中的
$
应该可以正常工作。我猜
文档。querySelector(…)
不是一个选项?这真的有效吗?你测试过这个吗?如果有从原生js返回到NodeList的隐式转换,我会非常惊讶。我看不出您的文档化源代码在哪里支持这种语法。请提供报价。在该链接中,我能找到的最接近的内容是“将JavaScript值传递到Java代码”一节。对于返回类型:“任何其他Java对象(包括数组)”,它声明必须传递的是“必须源于Java代码的正确类型的Java对象;Java对象不能从JavaScript中的“稀薄空气”构造”。我相信这与您可以隐式转换节点列表的返回类型的想法正好相反。非常适合我!哇!我很惊讶,但很兴奋!这可能非常有用。很好的解决方案!我得自己试试。。。