我有一个Vaadin应用程序作为iframe嵌入在2+角度应用程序中,我正在尝试向帖子发送消息:
角侧:
<iframe id="iframe1" [src]="iframeSource"></iframe>
public sendMessage() {
const iframe: HTMLIFrameElement = document.getElementById('iframe1') as HTMLIFrameElement;
iframe.contentWindow.postMessage('asdf', '*');
}
Vaadin方面:
JavaScript.getCurrent().addFunction("listen", new JavaScriptFunction() {
@Override
public void call(JsonArray arguments) {
Notification.show("Received call ");
}
});
JavaScript.getCurrent().execute("window.addEventListener('message', listen, false);");
Vaadin应用程序接收到消息,但是它在“参数”中获得的唯一参数是{isTrusted:true},而不是“ asdf”。我已经尝试过传递数组,json,字符串化的json,而且总是这样。
问题是,如果在Vaadin中使用普通的javascript函数而不是“ JavaScriptFunction”,那么我可以正确读取参数。效果很好:
String string = "listen = function myFunction(p) {"
+"console.log('function called', p); alert(p);"
+"}";
JavaScript.getCurrent().execute(string);
JavaScript.getCurrent().execute("window.addEventListener('message', listen, false);");
我不知道该怎么办,或者我做错了什么,才有这种行为,我一直无法找到解决方案或解决方法。救命!
编辑:正如我发布的那样,我想到了一种可能的解决方法,并且它实际上有效:如果我从普通函数中调用JavascriptFunction,则可以传递参数。像这样,“ JsonArray”参数将包含实际参数:
JavaScript.getCurrent().addFunction("javaFunction", new JavaScriptFunction() {
@Override
public void call(JsonArray arguments) {
Notification.show("Received call ");
}
});
String listenFunction = "listen = function myFunction(p) {"
+"console.log('myFunction', p); javaFunction(p.data);"
+"}";
JavaScript.getCurrent().execute(listenFunction);
JavaScript.getCurrent().execute("window.addEventListener('message', listen, false);");
我离开这个问题是因为我认为这可能对其他人有用,我认为这不是必需的。