2012-01-11 14 views
1

いくつかのアンカーを含むcom.google.gwt.user.client.ui.HTMLコンポーネントがあります。 コンポーネントをクリックすると、アンカーのクリックとコンポーネントの残りの部分のクリックを区別する必要があります。GWT:HTMLコンポーネントのアンカーでClickEventを区別する方法は?

例: "StackOverflowの" ハイパーリンクをクリックすると

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.comに行きます。 "foo"または "bar"をクリックすると、 "doSomethingElse()"が呼び出されます。 それを達成するためにとにかくありますか? anchorClicked(e)メソッドには何が必要ですか?

答えて

2

EventTargetがハイパーリンク要素(またはハイパーリンクの子)かどうかを確認する必要があります。

は、ハイパーリンクのIDが "カラスリンク" である

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

を言うことができますそして、あなたはあなたのケースでチェックするために必要なものです:

link.isOrHasChild(trgt);

はEDIT:

あなたが求めている方法は次のようになります:

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

    return link.isOrHasChild(trgt); 
} 
0

これは私が使用した解決方法です。それは@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; 
} 
関連する問題