我是 GWT 新手,我需要右键单击才能正常工作。我读过的 doco 建议我需要重写 onBrowserEvent() 方法。我只是在这个阶段进行尝试。事件已处理并出现我的弹出窗口。但是,一旦我关闭弹出窗口,通常的浏览器下拉菜单就会出现(带有“将此页面添加为书签”等选项)。
我正在使用 IceWeasel 24.5.0(Debian 的 FireFox 克隆),显然,Debian(喘息)。
相关代码如下:
public ActivityTextCell() {
super(BrowserEvents.MOUSEDOWN, BrowserEvents.MOUSEUP);
}
@Override
public void onBrowserEvent(
com.google.gwt.cell.client.Cell.Context context,
Element parent,
ActivityDTO value,
NativeEvent event,
ValueUpdater<ActivityDTO> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
event.preventDefault();
event.stopPropagation();
if (event.getType().equals(BrowserEvents.MOUSEUP)) {
Window.alert("mouse up event");
}
else {
switch ( event.getButton()){
case NativeEvent.BUTTON_RIGHT:
Window.alert("right mouseclick");
break;
case NativeEvent.BUTTON_LEFT:
Window.alert("left mouseclick");
break;
case NativeEvent.BUTTON_MIDDLE:
default:
break; // Do nothing
}
}
ActivityTextCell 类扩展了 AbstractCell。
那我错过了什么?如何阻止浏览器对鼠标单击使用react?
最佳答案
嗯,这当然不是几分钟的问题(从我花了一周时间才回到这个事实可以看出),但我有一个解决方案。我尝试颠倒 event.preventDefault()
和 super.onBrowserEvent()
的顺序,但它并没有真正帮助。
我在普通网页上尝试了一些实验。事实证明,MOUSEDOWN 事件在该上下文中不会执行任何操作,并且通常的浏览器选择菜单出现在 MOUSEUP 上。所以 if/else 逻辑有点半途而废了。
诀窍是在添加主页后立即在顶级 GUI 类中包含以下内容:
RootLayoutPanel.get().addDomHandler(new ContextMenuHandler() {
@Override
public void onContextMenu(ContextMenuEvent event) {
event.preventDefault();
event.stopPropagation();
}
}, ContextMenuEvent.getType());
这具有额外的好处(至少对于我的目的而言),可以防止浏览器对应用程序 View 中任意位置的右键单击使用react。
顺便说一句:防止默认操作的目的是阻止浏览器做自己的事情。停止传播可能不是必需的,但我无论如何都保留了它(传播从节点到根,而不是相反)。重写 onBrowserEvent()
的目的是使您自己的应用程序能够处理该事件。使用 super.onBrowserEvent()
是为了首先允许由您的代码处理该事件。我在之前的评论中已经给出了相关引用。如果您可能需要进行大量 GWT 编码,那么《GWT in Action》一书非常值得一读。
关于java - GWT 事件防止默认在 Java 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25192550/