2014-12-19 43 views
3

使用給定函數發佈消息,但得到錯誤「DataCloneError:對象無法克隆。」在線「target ['postMessage'](message,target_url.replace(/([^:]+://[^/]+).*/,'$ 1'));」在FireFox-34中,相同的代碼在Chrome和舊版本的FireFox上工作正常。「DataCloneError:無法克隆該對象。」 in FireFox 34

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

發生錯誤時試圖發佈的「消息」的類型是什麼? Blob或文件也許? – 2015-01-22 22:10:18

回答

5

postMessage使用structured clone algorithm在Firefox和因爲有你需要在發送之前調整某些東西發送消息。

在你的例子中,什麼消息包含的內容並不明顯,但是圍繞結構化克隆的一種黑客方式是強制性的。通過postMessage發送URL將拋出一個錯誤:

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

但你可以做到這一點,以解決它:

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

有更好的方法來處理這個問題,但爲您提供這又該至少允許一致的行爲。

+1

我偶然發現了這個答案,這導致我的字符串轉換解決了我的問題,我建議使用'window.location.href',這是「tostring」方法引用的值,謝謝。 – Scuzzy 2017-05-11 23:43:08