Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events GWT:帧的当前URL_Events_Gwt_Frame - Fatal编程技术网

Events GWT:帧的当前URL

Events 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

我有一个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   
  }
}
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无法绕过这一限制。