GWT: Как отличить ClickEvent на привязке в компоненте HTML? - PullRequest
1 голос
/ 11 января 2012

У меня есть компонент com.google.gwt.user.client.ui.HTML, который содержит несколько якорей. Когда компонент нажимается, мне нужно отличать щелчки на якорях от щелчков на остальной части содержимого компонента.

Пример:

htmlText = new HTML();
htmlText.setHTML("foo <a href=http://stackoverflow.com target=_blank>stackoverflow</a> bar");
htmlText.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        if (!anchorClicked(event)) doSomethingElse();
    }
});

Когда нажата гиперссылка stackoverflow, я хочу поведение по умолчанию - перейти на stackoverflow.com. Когда нажата кнопка «foo» или «bar», я хочу вызвать функцию «doSomethingElse ()». Есть ли способ достичь этого? Что должно быть в методе anchorClicked (e)?

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Вы должны проверить, является ли ваша EventTarget элементом гиперссылки (или дочерним элементом гиперссылки).

Допустим, идентификатор вашей гиперссылки - "corvus-link"

Element link = Document.get().getElementById("corvus-link");
Element trgt = Element.as(e.getNativeEvent().getEventTarget());

Тогда вам нужно проверить следующее:

link.isOrHasChild(trgt);

РЕДАКТИРОВАТЬ:

метод, который вы запрашивали, будет выглядеть примерно так:

boolean anchorClicked(e) 
{
    Element link = Document.get().getElementById("corvus-link");
    Element trgt = Element.as(e.getNativeEvent().getEventTarget());

    return link.isOrHasChild(trgt);
}
0 голосов
/ 11 января 2012

Это решение, которое я использовал. Это основано на идее, предоставленной @Amey. Мне пришлось изменить его решение, потому что мой HTML-компонент может содержать несколько якорей.

htmlText = new HTML();
htmlText.getElement().setId("HtmlTextArea");

...

private boolean anchorClicked(ClickEvent event) {
    NodeList<Element> links = Document.get().getElementById("HtmlTextArea").getElementsByTagName("a");
    Element target = Element.as(event.getNativeEvent().getEventTarget());

    for (int i = 0; i < links.getLength(); i++) {
        if (links.getItem(i).isOrHasChild(target)) {
            return true;
        }
    }

    return false;
}
...