2010-03-09 2 views
14

Я пытаюсь захватить произвольный элемент с помощью селектора CSS (например, «#someId .className a») в GWT.Найти элемент с помощью CSS-селектора в GWT

Я строю виджет JS, который может жить на стороннем веб-сайте и хочет иметь возможность взаимодействовать с элементами на странице. Поиск через JavaDocs я не вижу ничего, что может найти элемент по селектору. Я столкнулся с GQuery, но похоже, что проект might be dead и я не уверен, что он работает с GWT 2.

Один из вариантов, который я рассмотрел, - это обертывание существующей библиотеки (jQuery, Mootools, Prototype и т. Д.). в класс GWT и подвергая желаемое поведение через JSNI. Кажется, это может быть очень сложным.

У кого-нибудь есть опыт использования общих селекторов CSS в GWT?

+1

GWTQuery/GQuery, кажется, был возрожден и бездействием, скорее всего, соответствует освобождению ГВТ 2.1. –

+3

Действительно неудобно не иметь собственный 'querySelector [All]' в GWT. Интересно, был ли этот проект обречен на работу людьми, которые ненавидят развитие на стороне клиента. – rxgx

ответ

8

Класс DOM, который предоставляет множество методов-оберток для доступа к дереву DOM. Нет никакой функции, которая бы учитывала стиль jQuery для селектора CSS, о котором я знаю - GWT просто поощряет/обеспечивает доступ к элементам DOM через Widgets (и тому подобное), а не напрямую, хотя я понимаю, что в вашем случае такой подход «низкого уровня» может быть нужным. Единственный способ, по которому я вижу это, используя чистые методы Java GWT, - это много-много (возможно, ужасных) цепочек/вызовов класса DOM. Было бы проще, если бы все, что вам нужно было сделать, это получить доступ к id - для этого есть RootPanel.get(id)DOM.getElementById(id), они отличаются тем, какие объекты возвращаются).

Однако, как вы уже предложили, JSNI может предложить лучшее решение - попробовать возвращение, например, $wnd.$("#someId .className a") из JSNI как Element - на самом деле, вы можете вернуть что-нибудь, как-нибудь от JSNI, GWT просто дерьмо до второй вы попробуйте использовать, скажем, int как элемент DOM или что-то в этом роде.

PS: в то время как проект GQuery кажется мертвым/неактивным, возможно, стоит проверить, как они завернули вызовы jQuery (например, $), чтобы они могли использоваться, казалось бы, в GWT.

+0

Попытка этого, я получаю: «Uncaught TypeError: Object [object DOMWindow] не имеет метода« $ », мне также нужно jQuery.js на странице или что-то еще? –

+0

Да, вам нужно включить jQuery .js-файл на свою страницу хоста. Кроме того, посмотрите [этот вопрос] (http://stackoverflow.com/q/2319997/181497), но '' 'должен отлично работать с JSNI. –

+0

Я угадываю 'document.querySelector (...)' не вариант? – WORMSS

3

Вы можете использовать querySelector() и querySelectorAll(), доступный для новых браузеров ...

http://www.javascriptkit.com/dhtmltutors/css_selectors_api.shtml

...in terms of browser support, querySelector() and querySelectorAll() is supported in Firefox 3.1+, IE8+ (only in IE8 standards mode), and Safari 3.1+

+0

'querySelector' и' querySelectorAll' недоступны в GWT. Существует селекторная запись jQuery, доступная под названием «GwtQuery» или «gQuery». – rxgx

+1

GWT может вызывать любой метод Javascript, который вам нужен, вам просто нужно написать небольшой метод обертки, чтобы действовать как сквозной аргумент. Пожалуйста, ознакомьтесь с документами для доступа к собственному методу в документации GWT. Этот метод использовался для доступа к querySelector/querySelectorAll из GWT в моей работе. –

+0

Я написал себе однострочные обертки GWT JSNI для doc/element querySelector и querySelectorAll, и теперь я использую их много с отличными результатами. Легко, надежно и быстро. –

6

Использование GwtQuery, обновляется до GWT 2.4: http://code.google.com/p/gwtquery/

примеры Selector :

//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"); 

http://code.google.com/p/gwtquery/wiki/GettingStarted

2

Inspire by Asfand Yar Qazi answer.

Просто определите этот метод и наслаждайтесь им, когда веб-приложение работает в современных браузерах.

public final native NodeList<Element> querySelectorAll(String selectors) /*-{ 
return $doc.querySelectorAll(selectors); 
}-*/; 
+0

Действительно ли это работает? Вы проверили это? Я был бы очень удивлен, если будет какое-то неявное преобразование в NodeList из исходного js-возврата. – BuvinJ

+0

Пожалуйста, проверьте: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html –

+0

Можете ли вы проверить, что это сработало для вас? – BuvinJ

1

Вот пример использования классов GWT Element и Node для поиска одного вложенного элемента с заданным именем класса.Это не так с открытым концом и мощным, как буквальное селектор 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; 
} 
Смежные вопросы