GWT 中的框架内容加载事件
Frame contents loaded event in GWT
我正在创建一个包含框架小部件的对话框。我尝试同时使用 addLoadHander 和 addAttachHandler 挂钩来尝试捕获对框架的更改,但没有成功。只有初始页面加载会触发这两个事件,经过一些研究后发现,这两个事件实际上都是在 Widget 附加到 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 包含来自外部服务器(Paypal - 透明重定向)的 HTML 响应,该响应立即通过表单将自身重新提交回我的服务器。一旦提交回我的服务器完成并且框架中的文档已加载,我将尝试捕获框架的主体。
我也尝试过使用一个使用 MutationObserver (got the code from this solution) 的 JSNI 方法来尝试观察框架,但我相信 JSNI 实际上是 运行 在父级内部而不是内部Frame(?) 所以什么也没有发生。
我也曾尝试使用 setTimeout 在我的演示者中触发另一种方法 class 但我相信这 运行 会遇到与 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);
}-*/;
有没有人对我如何做到这一点有任何想法?
我不熟悉 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);
}
我正在创建一个包含框架小部件的对话框。我尝试同时使用 addLoadHander 和 addAttachHandler 挂钩来尝试捕获对框架的更改,但没有成功。只有初始页面加载会触发这两个事件,经过一些研究后发现,这两个事件实际上都是在 Widget 附加到 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 包含来自外部服务器(Paypal - 透明重定向)的 HTML 响应,该响应立即通过表单将自身重新提交回我的服务器。一旦提交回我的服务器完成并且框架中的文档已加载,我将尝试捕获框架的主体。
我也尝试过使用一个使用 MutationObserver (got the code from this solution) 的 JSNI 方法来尝试观察框架,但我相信 JSNI 实际上是 运行 在父级内部而不是内部Frame(?) 所以什么也没有发生。
我也曾尝试使用 setTimeout 在我的演示者中触发另一种方法 class 但我相信这 运行 会遇到与 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);
}-*/;
有没有人对我如何做到这一点有任何想法?
我不熟悉 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);
}