2016-07-14 38 views
0

我正在創建一個包含Frame小部件的DialogBox。我曾嘗試使用addLoadHander和addAttachHandler掛鉤來嘗試捕獲對框架的更改,但沒有成功。只有最初的頁面加載觸發這兩個事件,並且經過一些研究後,看起來這兩個實際發生在Widget連接到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響應經由形式立即重新提交本身回我的服務器。一旦提交回到我的服務器完成並且框架中的文檔已經加載,我正試圖捕獲幀的主體。我也試圖使用JSNI方法,它使用MutationObserver(got the code from this solution)來嘗試和觀察框架,但我相信JSNI實際上是在父級內運行,而不是在Frame(?)內部運行,所以什麼都不會發生。

我也嘗試過使用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

我對Frame小部件並不熟悉,但似乎您在之後添加了一個處理程序,您設置了該URL。嘗試先建立框架(在submitPayment之外,如果你多次使用它),然後設置網址:

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,您認爲它會有所作爲嗎? – Miniversal

+0

我不認爲這會有什麼區別。只要確保在將處理程序附加到框架和框架到DOM之後設置了URL *。 –

相關問題