我有一个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
}
}
感谢任何提示!
基督教
答案 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;