Javascript GWT:如何判断HTMLPanel渲染是否完成
我正在开发一个从服务器获取HTML内容并向用户显示的应用程序。从服务器获取的内容是一个完整的HTML文档。我使用UiBinder为视图指定UIJavascript 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
<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);
}