我正在创建 GWT Header<String>类的自定义实现,用于 DataGrid列,该列还使用ListHandler对该列中的数据进行排序。我正在尝试处理和取消Header类中的浏览器事件,这样如果用户单击此自定义Header对象呈现的特定 <INPUT>元素,我们会阻止“mousedown”事件冒泡回到 DataGrid 的事件处理程序(因为这会错误地触发ListHandler的列排序方法,从而阻止用户将数据输入到相关的 <INPUT>元素中)。
通过使用以下代码在我的Header类中实现NativePreviewHandler ,我能够成功地隔离我们想要“取消”其冒泡的事件:
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
final NativeEvent natEvent = event.getNativeEvent();
final Element element = natEvent.getEventTarget().cast();
final String eventType = natEvent.getType();
if ("mousedown".equals(eventType)) {
if (element.getTagName().equals("INPUT")) {
natEvent.preventDefault();
natEvent.stopPropagation();
event.cancel();
}
}
return;
}
不幸的是,没有组合preventDefault()、stopPropagation()或event.cancel()方法成功阻止 mousedown 事件冒泡到父DataGrid的处理程序。当我尝试调试此问题时,我能够确认虽然DOM . previewEvent方法成功调用了DOM。eventCancelBubble和DOM。eventPreventDefault,DOM。dispatchEvent方法仍然被触发并最终触发了DataGrid。fireEvent和一个列排序事件。
如果单击自定义标题的特定部分,任何防止 GWT DataGrid 自行恢复的指导/方法将不胜感激!