1

我正在创建 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方法成功调用了DOMeventCancelBubbleDOMeventPreventDefaultDOMdispatchEvent方法仍然被触发并最终触发了DataGridfireEvent和一个列排序事件

如果单击自定义标题的特定部分,任何防止 GWT DataGrid 自行恢复的指导/方法将不胜感激!

4

1 回答 1

4

Header您可以使用以下代码片段通过覆盖 onBrowserEvent2 API来防止单击时对列进行排序DataGrid

@Override
protected void onBrowserEvent2( Event event )
{
    EventTarget eventTarget = event.getEventTarget();
    if ( !Element.is( eventTarget ) )
    {
        return;
    }
    final Element target = eventTarget.cast();
    String id = target.getId();
    if ( id != null && id.equals( COLUMN_HEADER_ID ) )
    {
        return;
    }
    super.onBrowserEvent2( event );
}
于 2012-12-06T03:25:26.913 回答