Самый простой способ, который приходит на ум, - это обернуть все в FocusPanel
:
ClickHandler clickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("TextBox/Button clickHandler.");
event.stopPropagation(); // The important line - We stop the event
// propagation here so that the FocusPanel
// doesn't get the event
}
};
TextBox textBox = new TextBox();
textBox.addClickHandler(clickHandler);
Button button = new Button("Test");
button.addClickHandler(clickHandler);
// Since FocusPanel is a SimplePanel, it can only have one child, so we are
// wrapping everything additionally in a HorizontalPanel
HorizontalPanel hPanel = new HorizontalPanel();
hPanel.add(textBox);
hPanel.add(button);
FocusPanel focusPanel = new FocusPanel(hPanel);
focusPanel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Outside."); // Clicked outside of the TextBox/Button
}
});
RootPanel.get().add(focusPanel);
Недостатком является то, что вам нужно назначить ClickHandler
s для каждого элемента, для которого вы не хотите получать оповещения (вы можете использовать тот же ClickHandler
для этого, чтобы сохранить память - как я делал выше). Кроме этого, реализация FocusPanel
должна гарантировать, что поведение при нажатии остается кросс-браузерным.