GWT: текущий URL фреймов - PullRequest
       21

GWT: текущий URL фреймов

1 голос
/ 17 октября 2011

У меня есть приложение 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   
  }
}

Спасибо за любые подсказки!

Christian

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Атрибут src для iframe никогда не изменится, но свойство URL содержащегося document изменится. Вы можете получить это значение, используя 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 во фрейме.

1 голос
/ 19 октября 2011

Это расширение решения Джейсона выше.Когда я попробовал код Джейсона, оказалось, что в возвращенных 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;
...