2011-10-17 52 views
1

我有一個以兩個框架(com.google.gwt.user.client.ui.Frame)爲特色的GWT應用程序。通過Frame.setUrl(...)我可以加載任意網頁沒有任何問題。當然,用戶可以點擊加載頁面上的鏈接,然後加載相應的頁面?我如何跟蹤兩個幀中當前加載的頁面?GWT:框架的當前URL

以下是我目前使用兩種類型偵聽器的嘗試;我在網上找到了代碼片段。這兩個事件的火,但我仍然不知道如何獲得當前加載的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

iframesrc屬性不會改變,但包含document意志的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變化,瀏覽器將不允許包含應用程序訪問document在框架中。

+0

嗨,傑森!感謝您的回覆!這正是我正在尋找的信息。正如所料,我遇到了這個安全問題。是否有任何替代/最佳實踐技術在GWT應用程序中實現一些最小的Web瀏覽器功能?如果我可以跟蹤在IFrame中點擊的鏈接就足夠了。再次感謝!基督徒 – Christian

+1

不,沒有辦法單獨使用Javascript來限制這個限制。 –

1

這是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; 
    } 
}-*/; 

,唯一的除了傑森的代碼嵌套條件:

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