Javascript GWT:如何判断HTMLPanel渲染是否完成

Javascript GWT:如何判断HTMLPanel渲染是否完成,javascript,html,gwt,Javascript,Html,Gwt,我正在开发一个从服务器获取HTML内容并向用户显示的应用程序。从服务器获取的内容是一个完整的HTML文档。我使用UiBinder为视图指定UI <g:HTMLPanel ui:field="mainPanel" styleName="ap-mainPanel"> </g:HTMLPanel> 在视图中,我有setViewerContent(字符串内容)方法,还有一个用于保存内容的成员面板[contentPanel] public void setViewerCont

我正在开发一个从服务器获取HTML内容并向用户显示的应用程序。从服务器获取的内容是一个完整的HTML文档。我使用UiBinder为视图指定UI

<g:HTMLPanel ui:field="mainPanel" styleName="ap-mainPanel">
</g:HTMLPanel>

在视图中,我有setViewerContent(字符串内容)方法,还有一个用于保存内容的成员面板[contentPanel]

public void setViewerContent(String content)
{
    contentPanel = new HTMLPanel(content);
    contentPanel.setStyleName("ap-mainPanel ap-scrollPanel"); //$NON-NLS-1$
    contentPanel.addAttachHandler(new AttachEvent.Handler() {

        @Override
        public void onAttachOrDetach(AttachEvent event) {
            if(event.isAttached())
            {
                System.out.println("<-- rendering complete -->");
                isRenderComplete = true;                    
            }

        }
    });
    mainPanel.clear();
    mainPanel.add(contentPanel);
    addScrollHandler();
}
public void setViewerContent(字符串内容)
{
contentPanel=新的HTMLPanel(内容);
contentPanel.setStyleName(“ap mainPanel ap scrollPanel”);//$NON-NLS-1$
contentPanel.addAttachHandler(新的AttachEvent.Handler(){
@凌驾
TachorDetach的公共空间(附件事件){
if(event.isAttached())
{
System.out.println(“”);
isRenderComplete=真;
}
}
});
主面板。清除();
添加(contentPanel);
addScrollHandler();
}
我向contentPanel添加了一个scroll处理程序,它侦听ScrollEvent,onScroll()调用适当的方法从服务器获取内容 基于滚动是在顶部还是底部

public void addScrollHandler() {
    Event.sinkEvents(contentPanel.getElement(), Event.ONSCROLL);
    contentPanel.addHandler(this, ScrollEvent.getType());
}

public void onScroll( ScrollEvent event )
{
    if( HelperUtils.isScrollAtBottom( event.getSource() ) )
    {
        if(isRenderComplete)
        {
          System.out.println("<-- Process Down scroll START-->");
          isRenderComplete = false;
          getUiHandlers().reachedMaxVerticalScrollPostion();

          System.out.println("<-- Process Down scroll END-->");
        }
    }

    if( HelperUtils.isScrollAtTop( event.getSource() ) )
    {
        if(isRenderComplete)
        {  
          System.out.println("<-- Process Up scroll START-->");
          isRenderComplete = false;                
          getUiHandlers().reachedMinVerticalScrollPostion();
          System.out.println("<-- Process Up scroll END -->");
        }

    }
}
public void addScrollHandler(){
Event.sinkEvents(contentPanel.getElement(),Event.ONSCROLL);
contentPanel.addHandler(这是ScrollEvent.getType());
}
public void onScroll(滚动事件)
{
if(HelperUtils.isScrollAtBottom(event.getSource()))
{
如果(isRenderComplete)
{
System.out.println(“”);
isRenderComplete=假;
getUiHandlers().reachedMaxVerticalScrollPosition();
System.out.println(“”);
}
}
if(HelperUtils.isscrolattop(event.getSource()))
{
如果(isRenderComplete)
{  
System.out.println(“”);
isRenderComplete=假;
getUiHandlers().reachedMinVerticalScrollPosition();
System.out.println(“”);
}
}
}
我面临的问题是,当我们呈现内容时,我看到对服务器的调用不断地获取内容。在呈现从服务器获取的内容时,将触发新的滚动事件。我们不希望这样,即在呈现内容时,我们不希望触发ScrollEvent。我尝试了上面的代码,将AttachEvent.Handler()附加到contentPanel。将保留一个标记isRenderComplete,该标记在contentPanel attach上变为true。在触发任何服务器调用之前,在onScroll方法中使用此标志。此方法似乎有效

但我不确定这是否正确。有谁有更好的解决方案吗

另外,因为每次抓取时,我们都会创建新的contentPanel,从而将滚动条带到顶部。我试图在contentPanel中添加一个新的HTMLPanel markerPanel,其中有几行分隔符。然后,在contentPanel的OnAttachorDetail()中,尝试滚动到markerPanel。这不起作用

public void setViewerContent(String content)
{
    contentPanel = new HTMLPanel(content);
    markerPanel = new HTMLPanel(" <br> <br> ");
    contentPanel.setStyleName("ap-mainPanel ap-scrollPanel"); //$NON-NLS-1$
    contentPanel.addAttachHandler(new AttachEvent.Handler() {

        @Override
        public void onAttachOrDetach(AttachEvent event) {
            System.out.println("<-- rendering complete -->");
            if(event.isAttached())
            {
                markerPanel.getElement().scrollIntoView();
                isRenderComplete = true;                    
            }

        }
    });
    mainPanel.clear();
    contentPanel.add(markerPanel);
    mainPanel.add(contentPanel);
    addScrollHandler();
}
public void setViewerContent(字符串内容)
{
contentPanel=新的HTMLPanel(内容);
markerPanel=新的HTMLPanel(“

”); contentPanel.setStyleName(“ap mainPanel ap scrollPanel”);//$NON-NLS-1$ contentPanel.addAttachHandler(新的AttachEvent.Handler(){ @凌驾 TachorDetach的公共空间(附件事件){ System.out.println(“”); if(event.isAttached()) { markerPanel.getElement().scrollIntoView(); isRenderComplete=真; } } }); 主面板。清除(); contentPanel.add(markerPanel); 添加(contentPanel); addScrollHandler(); }

有什么建议吗?我们希望在获取新内容时滚动处于底部,并且在获取的内容完全呈现之前不应触发滚动事件。

在呈现内容后添加滚动处理程序,并在分离面板时将其删除

public void setViewerContent(String content)
{
    contentPanel = new HTMLPanel(content);
    markerPanel = new HTMLPanel(" <br> <br> ");
    contentPanel.setStyleName("ap-mainPanel ap-scrollPanel"); //$NON-NLS-1$
    contentPanel.addAttachHandler(new AttachEvent.Handler() {

        @Override
        public void onAttachOrDetach(AttachEvent event) {
            System.out.println("<-- rendering complete -->");
            if(event.isAttached())
            {
                markerPanel.getElement().scrollIntoView();
                isRenderComplete = true;    
                addScrollHandler();
            }
            else
            {
                isRenderComplete = false;   
                removeScrollHandler();
            }

        }
    });
    mainPanel.clear();
    contentPanel.add(markerPanel);
    mainPanel.add(contentPanel);
}
public void setViewerContent(字符串内容)
{
contentPanel=新的HTMLPanel(内容);
markerPanel=新的HTMLPanel(“

”); contentPanel.setStyleName(“ap mainPanel ap scrollPanel”);//$NON-NLS-1$ contentPanel.addAttachHandler(新的AttachEvent.Handler(){ @凌驾 TachorDetach的公共空间(附件事件){ System.out.println(“”); if(event.isAttached()) { markerPanel.getElement().scrollIntoView(); isRenderComplete=真; addScrollHandler(); } 其他的 { isRenderComplete=假; removeScrollHandler(); } } }); 主面板。清除(); contentPanel.add(markerPanel); 添加(contentPanel); }