window.parent.postMessage(JSON.stringify(data), window.origin)
Run Code Online (Sandbox Code Playgroud)
在 Microsoft Edge 中出现语法错误,在 Chrome 和其他地方工作正常。
这就是我在控制台中看到的所有内容:
我正在创建一个反应应用程序,我希望我的用户将其嵌入到他们的网站上。该应用程序将显示在两个 iframe 中,但我只想一次只显示一个 iframe。因此,应用程序的一部分是一个简单的按钮,第二部分是用户决定使用该应用程序后弹出的表单(它是一个聊天应用程序)。
我设置了一个非常简单的组件来显示按钮,以便它可以向父网站发送消息。我不确定我做错了什么,但是当发送 window.postmessage 事件时,我收到错误:
Uncaught DOMException: Blocked a frame with origin "http://localhost:3002" from accessing a cross-origin frame.
这是父网站代码示例:
<h1>Hello! This is some static content</h1>
<iframe src="http://localhost:3002"
style="width: 108px; height: 50px; padding: 0px; margin: 10px 20px; position: fixed; bottom: 0px; right: 0px; overflow: visible; opacity: 1; border: 0px; z-index: 999998; transition-duration: 250ms; transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); transition-property: opacity, top, bottom;"
id="dbhchat"></iframe>
<h3>Thanks for checking out my blog!</h3>
<script>
window.addEventListener('message', event => {
// IMPORTANT: check the origin …Run Code Online (Sandbox Code Playgroud) A 有多个 Web 应用程序,它们都是 PWA。在应用程序 A 中,我需要在一个窗口中打开应用程序 B,该窗口允许我导航到任何其他应用程序并进行选择,然后使用“window.opener.postMessage”将其发送回应用程序 A。这在桌面上效果很好。它会打开一个新窗口,我可以在其中导航整个应用程序套件,并且它会保留在该窗口中。然而,在移动设备上,到另一个 (pwa) 应用程序的每个链接都会在新的 PWA“窗口”中自动打开,这在其他时刻都很好,但当您想要将数据发送回原始打开器时则不然。有没有办法阻止指向 PWA 应用程序的链接来打开 PWA 应用程序,而只是在同一个浏览器窗口中打开?
我有一个 Chrome 扩展程序,它需要一个沙箱,以便我可以使用自定义内容安全策略,并且还需要一个 Service Worker,以便我有一个持久运行的脚本。我希望 Service Worker 打开一个新的(沙箱)窗口,然后能够使用postMessage.
我尝试了三种方法来创建此窗口,但没有一种方法对我有用:
chrome.windows.create哪个能够创建窗口,但我无法访问postMessage(或者至少我不知道如何以postMessage这种方式访问)。window.open返回一个WindowProxy我可以调用的对象postMessage。然而,这仅适用于window上下文可用的情况,而在 Service Worker 中并非如此。clients.openWindow,但最终出现错误“不允许打开窗口”。无论如何,有没有办法创建一个(沙盒)窗口,允许我postMessage在 Chrome 扩展中的 Service Worker 中使用?
我有一个RPC线程从该线程回调给我.我需要以某种方式通知Qt它需要从主线程进行函数调用.在直接Windows中我可以通过使用自定义消息然后将该消息发布到消息队列来完成此操作,例如,我可以创建WM_CALLFUNCTION消息并传递函数指针wParam和参数(类指针)lParam.
有谁知道如何用Qt做到这一点?我遇到过QCustomEvent但我不知道如何使用它或如何处理它.任何帮助将非常感谢!
编辑:
最后我选择了QMetaObject :: invokeMethod,它完美无缺.
我想知道是否有任何方法可以锁定Flash窗口并向其发送消息?这里的另一个人得到了答案,他的名字是Spencer K.他的问题是: 通过C#中的WebBrowser将模拟点击发送到HTML中嵌入的flash对象
不幸的是,K先生并不是非常具体,而且他为阅读他的问题的人留下的只是他"得到了手柄,然后通过手柄迭代".我不太确定他的意思.我使用EnumWindows迭代所有可见的句柄无济于事,因为它没有返回一个闪存窗口的窗口.
我希望有人能告诉我,因为这几天让我发疯了.
编辑:我刚刚决定在我的表单中插入一个SWF对象并将消息发布到该句柄.
我有喜欢发送击键它来控制其他应用程序CTRLS或CTRLSHIFTC或CTRLF.
我尝试了很多东西,但是我无法让它发挥作用.所以我试图在一个更简单的案例中做到这一点.
这成功发送Hey到记事本:
procedure TForm1.Button1Click(Sender: TObject);
var notepad, edit: HWND;
begin
notepad := FindWindow('notepad', nil);
edit := FindWindowEx(notepad, FindWindow('Edit', nil), nil, nil);
SendMessage(edit, WM_CHAR, dword('H'), 0);
SendMessage(edit, WM_CHAR, dword('e'), 0);
SendMessage(edit, WM_CHAR, dword('y'), 0);
end;
Run Code Online (Sandbox Code Playgroud)
这成功地将F5密钥发送到记事本,并且还可以F3弹出查找对话框.
notepad := FindWindow('notepad', nil);
PostMessage(notepad, WM_KEYDOWN, VK_F5, 0);
PostMessage(notepad, WM_KEYUP, VK_F5, 0);
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么使用SendMessage上面的例子不起作用.
我能提出的最好的事情就是这样,什么都不做.
notepad := FindWindow('notepad', nil);
PostMessage(notepad, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(notepad, WM_KEYDOWN, VkKeyScan('F'), 0); …Run Code Online (Sandbox Code Playgroud) 我有一个iframe,并希望将数据从iframe发送到父窗口.
在iframe的js代码中,我有以下语句
window.parent.postMessage('hello', '*');
Run Code Online (Sandbox Code Playgroud)
父窗口中的相应消息处理程序如下所示
$(window).bind('message', function (event) {
console.log(event.data);
console.log(event.origin);
console.log(event.source);
console.log('received');
});
Run Code Online (Sandbox Code Playgroud)
我从localhost加载代码,iframe源也从localhost加载.我在firefox 21中运行代码.
问题是,event.data永远是null和event.orign and event.source是undefined.我该如何解决这个问题?
我对postMessage和感到困惑MessageChannel。
这是MDN的一些代码:
var channel = new MessageChannel();
var para = document.querySelector('p');
var ifr = document.querySelector('iframe');
var otherWindow = ifr.contentWindow;
ifr.addEventListener("load", iframeLoaded, false);
function iframeLoaded() {
otherWindow.postMessage('Hello from the main page!', '*', [channel.port2]);
}
channel.port1.onmessage = handleMessage;
function handleMessage(e) {
para.innerHTML = e.data;
}
Run Code Online (Sandbox Code Playgroud)
我认为postMessagemethod只能接受两个参数,上面的代码显示它可以接受三个参数,但是method 的第三个参数没有任何意义postMessage。
所以有我的问题:
postMessage方法的第三个参数是什么意思?
我知道的用法MessageChannel,但似乎毫无用处,为什么/何时应该使用MessageChannel?
我在页面上有几个具有相同来源(但路径名不同)的iframe。
每个iframe message通过发出事件postMessage。
父窗口监听以下事件:
window.addEventListener('message', function(event) {
/* Get iframe element by event */
});
Run Code Online (Sandbox Code Playgroud)
我想为每个事件获取源iframe元素。
重要的限制是event.source.contentWindow由于跨域访问,我无法访问。
UPD:请在下面回答