Событие загрузки содержимого кадра в GWT

Я создаю DialogBox, который содержит виджет Frame. Я пытался использовать хуки addLoadHander и addAttachHandler, чтобы попытаться зафиксировать изменения во фрейме, но безуспешно. Любое событие вызывается только при начальной загрузке страницы, и после некоторых исследований выяснилось, что оба события на самом деле происходят, когда виджет прикреплен к DOM, а не при загрузке содержимого фреймов.

DialogBox paymentProcessingDialog = new DialogBox(false);
private void submitPayment(String actionURL, String qryString){     
    Frame processCCWindow = new Frame(actionURL + "?" + qryString);     
    processCCWindow.addLoadHandler(new LoadHandler() {
        @Override 
        public void onLoad(LoadEvent event) {
            //This is called when the frame is attached to the dom
            //and not when the document is actually ready so it's 
            //kinda worthless for my scenario
            //Note: the addAttachHandler has the same issue

            //***call to JSNI idea (see below)
            checkURLChange();
        }

    });
    //...irrelevant code to style the DialogBox
    VerticalPanel panel = new VerticalPanel();
    panel.add(processCCWindow);
    paymentProcessingDialog.setWidget(panel);
    paymentProcessingDialog.center();
    paymentProcessingDialog.show();
}

URL-адрес, загружаемый во фрейм, содержит HTML-ответ от внешнего сервера (Paypal — прозрачное перенаправление), который немедленно повторно отправляется обратно на мой сервер через форму. Я пытаюсь захватить тело фрейма после завершения отправки обратно на мой сервер и загрузки документа в фрейме.

Я также пытался использовать метод JSNI, который использует MutationObserver (получил код из этого решения), чтобы попытаться посмотреть фрейм, но я считаю, что JSNI на самом деле запускается внутри родителя, а не внутри фрейма (?), поэтому ничего не происходит.

Я также пытался использовать setTimeout для запуска другого метода в моем классе докладчика, но я считаю, что это связано с той же проблемой, что и идея MutationObserver, потому что операторы консоли никогда не срабатывают.

    private static native void checkURLChange()/*-{
  new MutationObserver(function(mutations) {
      mutations.some(function(mutation) {
        if (mutation.type === 'attributes' && mutation.attributeName === 'src') {
          console.log(mutation);
          console.log('Old src: ', mutation.oldValue);
          console.log('New src: ', mutation.target.src);
          return true;
        }

        return false;
      });
    }).observe(location.href, {
      attributes: true,
      attributeFilter: ['src'],
      attributeOldValue: true,
      characterData: false,
      characterDataOldValue: false,
      childList: false,
      subtree: true
    });
    window.location = "foo";
    setTimeout(function() {
        @com.myPackage.MyoutPresenter::paymentProcessComplete(Ljava/lang/String;)(document.getElementsByTagName("body")[0].innerText);
      console.log("test" + document.getElementsByTagName("body")[0].innerText);
    }, 3000);
}-*/;

У кого-нибудь есть мысли о том, как я могу это сделать?


person Miniversal    schedule 14.07.2016    source источник
comment
Даже если наблюдение сработает, я не думаю, что вы сможете получить содержимое фрейма из-за ограничений браузера, поскольку это страница из другого домена.   -  person Hilbrand Bouwkamp    schedule 20.08.2016


Ответы (1)


Я не знаком с виджетом Frame, но кажется, что вы добавляете обработчик после установки URL-адреса. Попробуйте сначала создать фрейм (вне submitPayment, если вы используете его более одного раза), а затем установите URL:

final Frame processCCWindow = new Frame();     
processCCWindow.addLoadHandler(new LoadHandler() {
    @Override 
    public void onLoad(LoadEvent event) {
        // do something
    }

});

private void submitPayment(String actionURL, String qryString){
    processCCWindow.setUrl(actionURL + "?" + qryString);
}
person Andrei Volgin    schedule 14.07.2016
comment
Интересная мысль. Как вы думаете, будет ли иметь значение, если я специально объявлю фрейм вне метода, или он будет вести себя так же, если я просто установлю URL-адрес фрейма в конце метода submitPayment()? - person Miniversal; 15.07.2016
comment
Я не думаю, что это будет иметь значение. Просто убедитесь, что вы установили URL-адрес после присоединения обработчика к фрейму и фрейма к dom. - person Andrei Volgin; 15.07.2016