GWT:帧的当前URL

时间:2011-10-17 16:47:07

标签: events gwt frame

我有一个GWT应用程序,它有两个框架(com.google.gwt.user.client.ui.Frame)。通过Frame.setUrl(...)我可以毫无问题地加载任意网页。当然,用户可以点击已加载页面上的链接,然后加载相应的页面?如何在两个帧中跟踪当前加载的页面?

以下是我目前尝试使用两种类型的听众;我在网上找到了代码片段。两个事件都会触发,但我仍然不知道如何获取当前加载的URL

import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.ui.Frame;

public class BrowserTabFrame extends Frame implements EventListener {

 public BrowserTabFrame() {
    super();
    sinkEvents(Event.ONLOAD);

    addLoadHandler(new LoadHandler() {      
        @Override
        public void onLoad(LoadEvent event) {
            System.out.println(event.getSource());
            // <iframe style="visibility: visible;" id="ext-gen17" src="http://..." class="gwt-Frame"></iframe>
            // however, the src attribute never changes
        }
    });
  }

  @Override
  public void onBrowserEvent(Event event) {
    super.onBrowserEvent(event);
    if (DOM.eventGetType(event) == Event.ONLOAD) 
        System.out.println(event.getCurrentEventTarget());
        // [object HTMLIFrameElement]
        // no idea what to do with it   
  }
}

感谢任何提示!

基督教

2 个答案:

答案 0 :(得分:2)

src的{​​{1}}属性永远不会改变,但所包含的iframe的{​​{1}}属性将会改变。您可以使用JSNI获取此值:

URL

但请注意,如果document的安全上下文(任何协议,域或端口号)发生更改,浏览器将不允许包含应用程序访问框架中的private native String getIframeUrl(IFrameElement frame) /*-{ if (frame.contentDocument !== undefined) { return frame.contentDocument.URL; } else if (frame.contentWindow !== undefined && frame.contentWindow.document !== undefined) { return frame.contentWindow.document; } else { return null; } }-*/; ... Window.alert(getIframeUrl(myFrame.getElement()));

答案 1 :(得分:1)

这是杰森上述解决方案的延伸。当我尝试Jason的代码时,似乎返回的URI缺少哈希(也就是片段,以'#'开头的URI后缀),我需要这些。经过一些挖掘DOM规范后,以下工作:

public static native String getIframeUri(IFrameElement iframe) /*-{
    if (iframe.contentDocument !== undefined) {
        if (iframe.contentDocument.defaultView !== undefined
                && iframe.contentDocument.defaultView.location !== undefined) {
            return iframe.contentDocument.defaultView.location.href;
        } else {
            return iframe.contentDocument.URL;
        }
    } else if (iframe.contentWindow !== undefined
            && iframe.contentWindow.document !== undefined) {
        return iframe.contentWindow.document;
    } else {
        return null;
    }
}-*/;

Jason代码的唯一补充是嵌套条件:

if (iframe.contentDocument.defaultView !== undefined
        && iframe.contentDocument.defaultView.location !== undefined) {
    return iframe.contentDocument.defaultView.location.href;