2011-10-17 2 views
1

두 프레임 (com.google.gwt.user.client.ui.Frame)이있는 GWT 응용 프로그램이 있습니다. Via 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 사용하여이 값을 얻을 수 있습니다 : 보안 컨텍스트가 iframe 변경 (프로토콜, 도메인 또는 포트 번호의), 브라우저가 포함 된 응용 프로그램이 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())); 

는 그러나,주의 프레임에.

+0

안녕, 제이슨! 답장을 보내 주셔서 감사합니다! 이것은 정확히 내가 찾고있는 정보였습니다. 예상대로이 보안 문제가 발생합니다. GWT 응용 프로그램 내에서 최소한의 웹 브라우저 기능을 구현하기위한 대안/최선의 기술이 있습니까? IFrame에서 클릭 한 링크를 추적하면 기본적으로 충분할 것입니다. 고마워, 또! Christian – 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;