Events GWT:帧的当前URL
我有一个GWT应用程序,它有两个框架(com.google.GWT.user.client.ui.Frame)。通过Frame.setUrl(…),我可以毫无问题地加载任意网页。当然,用户可以点击加载页面上的链接,然后再加载相应的页面?如何跟踪两个框架中当前加载的页面 下面是我目前使用两种侦听器的尝试;我在网上找到了代码片段。两个事件都会触发,但我仍然不知道如何获取当前加载的URLEvents GWT:帧的当前URL,events,gwt,frame,Events,Gwt,Frame,我有一个GWT应用程序,它有两个框架(com.google.GWT.user.client.ui.Frame)。通过Frame.setUrl(…),我可以毫无问题地加载任意网页。当然,用户可以点击加载页面上的链接,然后再加载相应的页面?如何跟踪两个框架中当前加载的页面 下面是我目前使用两种侦听器的尝试;我在网上找到了代码片段。两个事件都会触发,但我仍然不知道如何获取当前加载的URL import com.google.gwt.event.dom.client.LoadEvent; import
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
}
}
import com.google.gwt.event.dom.client.LoadEvent;
导入com.google.gwt.event.dom.client.LoadHandler;
导入com.google.gwt.user.client.DOM;
导入com.google.gwt.user.client.Event;
导入com.google.gwt.user.client.EventListener;
导入com.google.gwt.user.client.ui.Frame;
公共类BrowserTabFrame扩展框架实现EventListener{
公共浏览器tabframe(){
超级();
sinkEvents(事件加载);
addLoadHandler(新的LoadHandler(){
@凌驾
公共void onLoad(LoadEvent事件){
System.out.println(event.getSource());
//
//但是,src属性从未更改
}
});
}
@凌驾
公共无效onBrowserEvent(事件){
超级浏览器事件(事件);
if(DOM.eventGetType(event)=event.ONLOAD)
System.out.println(event.getCurrentEventTarget());
//[对象HTMLIFrameElement]
//不知道该怎么办
}
}
谢谢你的提示
Christian一个
iframe
的src
属性永远不会改变,但是所包含的文档的URL
属性将改变。您可以使用JSNI获得此值:
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()));
但是请注意,如果iframe
的安全上下文(协议、域或端口号中的任何一个)发生更改,浏览器将不允许包含应用程序访问框架中的文档。这是Jason上述解决方案的扩展。当我尝试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;
嗨,杰森!谢谢你的回复!这正是我要找的信息。正如所料,我遇到了这个安全问题。是否有任何替代/最佳实践技术可以在GWT应用程序中实现一些最小的web浏览器功能?如果我能在IFrame中跟踪单击的链接,基本上就足够了。再次感谢!ChristianNo,单独使用Javascript无法绕过这一限制。