2016-07-14 7 views
0

Frameウィジェットを含むDialogBoxを作成しています。 addLoadHanderとaddAttachHandlerの両方のフックを使って、フレームの変更を成功させようと試みました。最初のページのロードだけがイベントを発生させ、いくつかの調査の後、ウィジェットがDOMにアタッチされたときに実際に発生し、フレームコンテンツがロードされていないときに両方が実際に発生するように見えます。すぐにフォームを経由して自分のサーバーに戻って自分自身を再提出 - フレームにロードされGWTのフレームコンテンツロードイベント

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応答が含まれています。私はサーバーへの提出が完了し、フレーム内のドキュメントがロードされたら、フレームの本体をキャプチャしようとしています。

私はまた、フレームを試してみて、見てMutationObserver(got the code from this solution)を使用していますJSNIメソッドを使用しようとしましたが、私は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); 
}-*/; 

私はこれをどのように達成することができますか?

+0

でも、私の観察はうまくいくとは思えません。これは別のドメインのページであるため、ブラウザの制限があるためです。 –

答えて

1

私はフレームウィジェットに精通していませんが、の後にハンドラを追加すると、と表示されます。フレームを最初に作成して(複数回使用する場合はsubmitPaymentの外に)、URLを設定してから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); 
} 
+0

興味深い考え。私がsubmitPayment()メソッドの終わりにフレームのURLを設定しただけで、フレームをメソッドの外に明示的に宣言するか、またはフレームのURLを設定しても同じ動作をするかどうかは違いがあると思いますか? – Miniversal

+0

私はそれが何か変わるとは思わない。ハンドラーをFrameとFrameに添付した後、URLを*に設定してください。 –