PopupPanel - это класс в GWT, написанный (ахем) давным-давно (именно поэтому он так отстой), который позволяет показывать всплывающие окна с контентом.Одним из параметров является autoHide, где, если есть определенное событие вне всплывающего окна, оно закрывает всплывающее окно.Он хорошо работает на всем, кроме сафари Mobil (SM).Причина в том, что SM не запускает события щелчка при касании.Он запускает сенсорные события.PopupPanel жестко запрограммирован для поиска ClickEvents.
В частности, код говорит:
case Event.ONMOUSEDOWN:
...
if (!eventTargetsPopupOrPartner && autoHide) {
hide(true);
...
Очевидно, что это не завершено, и он также должен включать Event.ONTOUCHSTART
Проблема в том, что все методы и поля являются частными, поэтому я не могу добавить эту функцию.Это большая болтовня со стороны команды GWT, но на самом деле это не проблема, поскольку я мог просто создать свой собственный класс и скопировать содержимое PopupPanel.Большая проблема заключается в том, что nativeEventPreview не записывает события Touch!
Я попытался добавить следующее в предварительный просмотр событий:
private static NativePreviewHandler nativePreviewHandler = new NativePreviewHandler() {
public void onPreviewNativeEvent(NativePreviewEvent event) {
Event nativeEvent = Event.as(event.getNativeEvent());
switch (nativeEvent.getTypeInt()) {
case Event.ONTOUCHSTART:
case Event.ONMOUSEDOWN:
EventTarget target = nativeEvent.getEventTarget();
if (!Element.is(target) || !popup.getElement().isOrHasChild(Element.as(target))) {
popup.hide();
} break;
}
}
};
Где popup - это PopupPanel, которую я пытаюсьчтобы закрыть на внешних событиях касания.Грустная вещь, это работает для мыши вниз при тестировании в любом другом браузере на Земле, но не на iPad.
Еще одна вещь, которую я попробовал, это добавление TouchStartHandler к стеклу PopupPanel (серый цвет за ним),Я боролся с надеждой, что смогу уловить события касания таким образом, но я не смог заставить события срабатывать на стекле, так как он каким-то забавным образом привязан к DOM.Мой код:
private static class ProperPopupPanel extends PopupPanel {
public ProperPopupPanel() {
super();
}
void setHideOnGlassTouch() {
setGlassEnabled(true);
TouchableLabeThatDoesntCrashOnWrap glass = new TouchableLabeThatDoesntCrashOnWrap(getGlassElement());
glass.addTouchStartHandler(new TouchStartHandler() {
@Override
public void onTouchStart(TouchStartEvent event) {
hide();
}
});
glass.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
}
private class TouchableLabeThatDoesntCrashOnWrap extends Label {
public TouchableLabeThatDoesntCrashOnWrap(Element element) {
super(element);
super.onAttach();
}
}
}
На мой взгляд, это должно работать, но это не так.Я не знаю почему.Любые идеи или предложения приветствуются.Благодаря.