簡體   English   中英

GXT-無法到達文本區域上的onscroll事件處理程序

[英]GXT - Can't reach onscroll event handler on text area

我試圖在Text Area(gxt)上使用一個處理程序,以了解用戶何時到達文本區域的頂部。

TextArea logTextArea = new TextArea();
logTextArea.setReadOnly(true);
logTextArea.addDomHandler(new ScrollHandler() {

    @Override
    public void onScroll(ScrollEvent event) {
        InputElement textAreaElement = logTextArea.getCell().getInputElement(logTextArea.getElement());
        int scrollTop = textAreaElement.getScrollTop();
    }
}, ScrollEvent.getType());

VerticalLayoutContainer dataContainer = new VerticalLayoutContainer();

HorizontalLayoutContainer secondRow = new HorizontalLayoutContainer();
secondRow.add(logTextArea, new HorizontalLayoutData(1, 1, new Margins(5, 10, 5, 10)));

dataContainer.add(secondRow, new VerticalLayoutData(1, 0.5));

add(dataContainer);//this class extends ContentPanel

永遠不會在滾動上調用此處理程序,但我還嘗試了許多其他事件,例如mouseover,mousewhell,mouseclick ...,所有這些事件都起作用。 有人可以提供任何想法嗎?

AFAIK,如果事件的目標和窗口小部件不是同一元素,則滾動事件將無法在基於單元格的窗口小部件中使用。 GXT的TextArea是具有此類DOM結構的小部件。

這就是因為滾動事件是“非冒泡”事件。 使用單元格的AFAIK GWT小部件對通過GWT事件系統調度的非冒泡事件具有特殊處理。 支持非冒泡事件的類型列表太短,並且僅限於focusblurloaderror事件。 有關詳細信息,請參見CellBasedWidgetImplStandard類。

我建議的第一個解決方案是為textarea顯式分配onscroll處理程序。 例如:

Event.sinkEvents(textAreaElement, Event.getEventsSunk(textAreaElement) | Event.ONSCROLL);

這里textAreaElement是textarea DOM元素。

但是,每次單元格重新提供其內容時都應執行此操作(例如,當調用TextArea小部件的setValue方法時)。

其他解決方案有點hacky,並使用私有api實現,但只能應用於基於單元的小部件一次。 您可以執行與CellBasedWidgetImplStandard.sinkEvent(Widget, String)相同的操作CellBasedWidgetImplStandard.sinkEvent(Widget, String)例如:

WidgetHelper.sinkEvent(logTextArea.getElement(), BrowserEvents.SCROLL);

WidgetHelper可能如下所示:

public class WidgetHelper {
    public static void sincEvent(Element element, String typeName){
        element.setAttribute("__gwtCellBasedWidgetImplDispatching" + typeName, "true");
        sinkEvent0(element, typeName);
    }

    private static native void sinkEvent0(Element element, String typeName) /*-{
        element.addEventListener(typeName,
                        @com.google.gwt.user.cellview.client.CellBasedWidgetImplStandard::dispatchNonBubblingEvent, true);
    }-*/;
}

可能這是在GWT項目中創建問題的主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM