【问题标题】:postMessage not working from parent to iframepostMessage 无法从父级到 iframe
【发布时间】:2020-10-13 08:46:26
【问题描述】:

我正在尝试将 cookie 从我的父页面发送到 iframe。

这是我的 postMessage 代码:

<script>
  try {
    var postObject = JSON.stringify({
      event: 'DOMPageLoad',
      data: '{{Page URL}}'
    });
    parent.postMessage(postObject, 'https://mysite/l/839063/2020-02-26/29bh');
  } catch(e) {
    window.console && window.console.log(e);
  }
  </script>

我尝试从 iframe 到父级使用它,它就像一个魅力,但我无法让它以相反的方式工作。

这是我的事件监听器代码:

<script type="text/javascript">
(function(window) {

    addEvent(window, 'message', function(message) {
      try{
      var data = JSON.parse(message.data);
      var dataLayer = window.dataLayer || (window.dataLayer = []);
      if (data.event) {
        dataLayer.push({
          'event': data.event,
          'postMessageData': data
        });
      }
      }catch(e){}
    });

    // Cross-browser event listener
    function addEvent(el, evt, fn) {
      if (el.addEventListener) {
        el.addEventListener(evt, fn);
      } else if (el.attachEvent) {
        el.attachEvent('on' + evt, function(evt) {
          fn.call(el, evt);
        });
      } else if (typeof el['on' + evt] === 'undefined' || el['on' + evt] === null) {
        el['on' + evt] = function(evt) {
          fn.call(el, evt);
        };
      }
    }

  })(window);
</script>

我的假设是问题与我尝试将消息发送到 iframe 的方式有关。现在我正在使用parent.postMessage,但我认为 iframe 需要有所不同。

这可能很简单,但我对 javascript 很陌生,根本不知道我不知道什么。

【问题讨论】:

    标签: javascript cookies iframe google-tag-manager


    【解决方案1】:

    我认为您对parent.postMessage 的问题是正确的。 parent 属性引用了当前框架的父框架,但在这里您想向子框架发布消息。

    要访问iframe 的窗口,您首先需要以某种方式获取iframe。例如,如果你的iframeid="my-iframe",你可以这样使用:

    var myIframe = document.getElementById('my-iframe');
    

    然后您可以使用contentWindow 属性访问iframe 的窗口:

    myIframe.contentWindow.postMessage...
    

    应该这样做!

    附:我看到你有 data: '{{Page URL}}' 带引号,但我认为你不需要它们。如果我没记错的话,你应该可以使用data: {{Page URL}}


    编辑:选择正确的方式来触发代码

    将此代码连接到 GTM 中的 All Pages 触发器可能会导致问题,因为在触发器触发时,iframe 不一定已加载。我认为这是您最好的两个选择:

    • 等待iframe 告诉您它已准备就绪(可能是最佳选择)
      您可以向iframe 添加一些代码,以便在加载后立即向父级发布消息。当父母收到消息时,它可以将消息发送到iframe,并确保iframe 已准备好接收它。
    • 使用 GTM 的 Window Loaded 触发器类型(容易修复,但不是很好)
      创建 GTM 触发器时,您将看到 Window Loaded 触发器类型。这只会在页面上的所有内容都加载后触发,包括任何iframes。如果您有任何大图像或其他任何东西,Window Loaded 事件可能会在您的 iframe 准备好之后触发,这只是浪费时间。

    【讨论】:

    • 我进行了您建议的更改,但似乎并没有解决问题。我仍然无法将数据发布到 iframe。
    • 嘿 Avenues_Q,很抱歉这不起作用。页面加载时是否立即将消息发布到iframeiframe 可能在消息发布到它时还没有完成加载。这是我目前最好的猜测。
    • 我正在使用 Google 跟踪代码管理器来执行此操作,并且消息正在 DOM Page Ready 触发器上发送。你对我应该如何设置触发器有什么建议吗?什么时候开火?
    • 对于一些额外的上下文 - 我只是想在页面加载时将 cookie 从父页面传递到 iframe。我不知道我使用的代码是否仅适用于表单提交或按钮单击,因为当我将 iframe 上的 from 提交到父页面时它可以工作,但是当我尝试它时没有创建 dataLayer iframe 的父页面。
    • 好的,谢谢您的信息。我在上面编辑了我的答案,为您提供了一些关于如何触发代码的选项。我认为第一个选项是最好的,但它有点复杂。如果您对这两个选项有任何疑问,请告诉我!
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多