首页 > 解决方案 > 如何等待 iframe 父级为 postMessage 做好准备?

问题描述

iframe 中,我如何才能等到我确定我的父母已经注册了它eventListener:message ,然后再尝试注册window.parent.postMessage它?

下面的代码似乎有一个竞争条件,它(虽然它恰好在没有延迟的情况下工作)我已经在发送前的 1s 延迟中混杂在一起,以提高可靠性。

// THIS CODE RUNS IN THE PARENT
window.addEventListener('message',event=>{
  if(event.data==window.localStorage.getItem('expected')||confirm(event.data)) {
    document.querySelector('form').submit();
  }
});
// THIS CODE RUNS IN THE IFRAME
setTimeout(()=>{
  window.parent.postMessage(document.body.innerText,window.location.origin);
},1000);

我怎么能确定地实现这个?我不想“只希望”父代码中的代码运行得比我设置的任何延迟都快——相反,我想消除这种严重的“安全延迟”,只需要定义可以工作的代码,而不是碰巧可以工作的代码。

标签: javascriptiframedom-eventsrace-condition

解决方案


推荐阅读