我正在尝试创建一个使用 Moneris 托管支付解决方案的应用程序 - 基本上实现一个 iframe,它需要在加载时在窗口上注册事件。它有 postmessage api,调用时会返回一条消息,我能做的就是注册一个回调函数,这样我就可以解码/使用这些消息。
问题是我不确定如何在 blazorwasm 上调用这个 window.onload 。我尝试过实现这一点,但目前它不起作用。
我正在分享我的代码。非常感谢您的帮助。
这是在我的 Blazor 页面中。
protected override async Task OnAfterRenderAsync(bool firstRender)
{
Console.WriteLine("hello test");
if (firstRender)
{
Console.WriteLine("invoking this function");
await JSRuntime.InvokeVoidAsync("MonerisEvents.setWindowOnLoad");
}
}
这是我在 wwwroot 中的 javascript 代码。
window.MonerisEvents =
{
doMonerisSubmit: function doMonerisSubmit() {
var monFrameRef = document.getElementById('monerisFrame').contentWindow;
monFrameRef.postMessage('tokenize', 'https://esqa.moneris.com/HPPtoken/index.php');
//change link according to table above
return false;
},
respMsg : function (e) {
var respData = eval("(" + e.data + ")");
console.log(respData);
console.log(respData.responseCode);
console.log(respData.errorMessage);
console.log(respData.bin);
console.log(respData.dataKey);
document.getElementById("monerisResponse").innerHTML = e.origin + " SENT " + " - " +
respData.responseCode + "-" + respData.dataKey + "-" + respData.errorMessage;
document.getElementById("monerisFrame").style.display = 'none';
},
setWindowOnLoad : function setWindowOnLoad()
{
var self = this;
window.onload = function () {
console.log("was here second");
if (window.addEventListener) {
window.addEventListener("message", self.respMsg, false);
}
else {
if (window.attachEvent) {
window.attachEvent("onmessage", self.respMsg);
}
}
}
}
}
根据OP的确认,直接在blazor wasm应用程序index.html页面中注册
window.addEventListener("message", self.respMsg, false);
事件监听器,无需window.onload
功能即可工作。