web-dev-qa-db-ja.com

「DataCloneError:オブジェクトのクローンを作成できませんでした。」 Firefox34で

指定された関数を使用してメッセージを投稿しましたが、「DataCloneError:オブジェクトのクローンを作成できませんでした」というエラーが発生します。行 "target ['postMessage'](message、target_url.replace(/([^:] +:// [^ /] +)。* /、 '$ 1'));" FireFox-34では、同じコードがChromeおよび古いバージョンのFireFoxで正常に機能しています。

var storage = function() {
    return {
           postMessage : function(message, target_url, target) {
           if (!target_url) { 
              return; 
           }
           var target = target || parent;  // default to parent
           if (target['postMessage']) { 
                   // the browser supports window.postMessage, so call it with a targetOrigin
                   // set appropriately, based on the target_url parameter.
                   target['postMessage'](message, target_url.replace( /([^:]+:\/\/[^\/]+).*/, '$1'));
               }               
         }
    }
}();
11
Krishna

postMessage Firefoxでは 構造化クローンアルゴリズム を使用してメッセージを送信します。そのため、送信する前に調整する必要がある特定の事項があります。

あなたの例では、どのメッセージが含まれているのかは明らかではありませんが、構造化クローンを回避する1つのハックの方法は、少し強制することです。 postMessage経由でURLを送信すると、エラーがスローされます。

someWindow.postMessage(window.location, '*');
// ERROR

しかし、これを回避するためにこれを行うことができます:

var windowLocation = '' + window.location;
someWindow.postMessage(windowLocation, '*');
// WORKS

これを処理するためのより良い方法がありますが、あなたが提供したものについては、これは少なくとも一貫した動作を可能にするはずです。

12