Как добавить обработчик событий для определенных подэлементов в виджет HTML GWT, отображающий сложный HTML? - PullRequest
2 голосов
/ 17 ноября 2011

Я оптимизирую приложение GWT, которое ранее использовало множество вложенных панелей для работы с DIV и Span. Я создаю всю таблицу как один объект SafeHtml, а затем назначаю ее в один виджет SafeHtml.

Теперь я хочу иметь возможность отслеживать события наведения мыши / мышки на уровне определенных «ячеек», а не всей таблицы, но я не уверен, как это сделать.

Если я добавлю обработчик к самому HTML-виджету, я получу события из различных элементов.

Ответы [ 2 ]

6 голосов
/ 18 ноября 2011

Начиная с 2.0 существует довольно простой способ сделать это.Например, если ваш HTML-код содержится в каком-то виджете (HTMLPanel или HTML), вы можете вызвать addDomHandler(<handler>,<eventtyoe>) для этого виджета, чтобы вы получали события из внутреннего html.Например, если у вас есть несколько якорей внутри HTMLPanel, и вы хотите знать, на какой из них щелкнули, вы можете сделать что-то вроде этого:

panel.addDomHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            Element element=  event.getNativeEvent().getEventTarget().cast();
            if(element.getTagName().equals("A")) {
                AnchorElement anchor = element.cast();
                Window.alert("Anchor with href " + anchor.getHref() + " was clicked");
            }

        }
    }, ClickEvent.getType());

Так как вы хотите отслеживать события Mouseover / Out, вам придется использовать2 разных обработчика dom, найдите нужную ячейку при возникновении события и измените его состояние.

0 голосов
/ 18 ноября 2011

Способ достижения этого:

  • Найдите нужный элемент с помощью одного из методов DOM, например, DOM.getElementById(..) или любым другим способом.Просмотр Widget.getElement() и т. Д.
  • Вызов DOOM.sinkEvents(element,eventBits) или DOM.sinkBitlessEvent(element,eventName) и передача требуемых событий, которые вы хотите получить, в виде битовой маски, например Event.MOUSEEVENTS, или использование именованного события, например click или touchstart при использовании второго метода.
  • set и EventListener для элемента путем вызова DOM.setEventListerner(element,eventListener), например, так:

    DOM.setEventListener( element, new EventListener()
    {
    
        @Override
        public void onBrowserEvent( Event event )
        {
            if ("click".event.getType()) {
               // ..do stuff..
            }
        }
    } );
    

Только события, которые выуказанное в шаге 2 будет запущено на вашем EventListener, поэтому вам нужно только обработать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...