javascript - postMessage() 和 dispatchEvent() 在源策略方面有什么区别?

标签 javascript postmessage dispatchevent

我有这段代码,我已经将 MessageEvent 的来源设置为 *,但控制台仍然提示 Blocked a frame with origin "AAAA"from访问来源为“BBBB”的框架。协议(protocol)、域和端口必须匹配。有人知道为什么吗?

  var size = {
    width:  document.body.scrollWidth,
    height:  document.body.scrollHeight
  }
  var evt = new MessageEvent("dimensionMessage",{
      "data": size,
      "origin":"*"
  });
  window.parent.dispatchEvent(evt);

但是,如果我使用 window.parent.postMessage(size, "*") ,它会起作用。

最佳答案

错误消息告诉您,如果跨源 iframe 位于不同的源,则它通常不能从父级调用方法;其中包括 dispatchEvent 方法(否则,iframe 可能会在父页面中生成鼠标事件)。

postMessage API 是一个异常(exception),它经过精确设计以允许以明确定义的方式进行跨域通信。

(将 origin 设置为 '*' 在这里对您没有帮助;一般来说,当通过 postMessage 发送消息时,浏览器会设置该属性>; 手动创建一个 MessageEvent 对象主要只在你想在接收页面中模拟接收外部消息时才有用)

关于javascript - postMessage() 和 dispatchEvent() 在源策略方面有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38758418/

相关文章:

javascript - Chrome 扩展事件监听器导致 Bootstrap 3 导航菜单无法点击

javascript - 如何使用window.postMessage动态嵌入iframe?

javascript - Android Chrome 自定义选项卡 - 在新选项卡中打开链接 + Postmessage

javascript - 是否可以通过鼠标单击 <input type=text> 元素来 dispatchEvent()?

javascript - 为 for 循环中的每个项目添加 onclick 处理程序

javascript - 如何为网格中的每个单元格组合框编辑器定义不同的商店?

c# - PostMessage 无法传递字符串 C#

android - 模拟和发送触摸事件

javascript - jquery 验证插件 textarea