" DataCloneError:无法克隆对象。"在FireFox 34中

时间:2014-12-19 01:09:03

标签: javascript local-storage mozilla postmessage

使用给定函数发布消息,但收到错误“DataCloneError:无法克隆该对象”。 at line“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'));
               }               
         }
    }
}();

1 个答案:

答案 0 :(得分:11)

postMessage使用Firefox中的structured clone algorithm发送消息,因此在发送之前需要调整某些内容。

在你的例子中,消息包含的内容并不明显,但结构化克隆的一种黑客方式就是强迫一点。通过postMessage发送网址会引发错误:

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

但是你可以这样做来解决它:

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

有更好的方法可以解决这个问题,但是对于你所提供的内容,这至少应该允许一致的行为。