Событие загрузки содержимого кадра в 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 на самом деле выполняется внутри родителя, а не внутри 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);
}-*/;
У кого-нибудь есть мысли о том, как мне это сделать?
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);
}