使用给定函数发布消息,但收到错误“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'));
}
}
}
}();
答案 0 :(得分:11)
postMessage
使用Firefox中的structured clone algorithm发送消息,因此在发送之前需要调整某些内容。
在你的例子中,消息包含的内容并不明显,但结构化克隆的一种黑客方式就是强迫一点。通过postMessage
发送网址会引发错误:
someWindow.postMessage(window.location, '*');
// ERROR
但是你可以这样做来解决它:
var windowLocation = '' + window.location;
someWindow.postMessage(windowLocation, '*');
// WORKS
有更好的方法可以解决这个问题,但是对于你所提供的内容,这至少应该允许一致的行为。