2014-12-19 1 views
3

Использование данной функции для отправки сообщения, но получение ошибки «DataCloneError: объект не может быть клонирован». at Line "target ['postMessage'] (message, target_url.replace (/([^:]+://[^/]+).*/, '$ 1'));" в FireFox-34, тот же код отлично работает в Chrome и более старой версии FireFox.«DataCloneError: объект не может быть клонирован». в 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 или File? –

ответ

5

postMessage рассылает с использованием structured clone algorithm в Firefox и из-за этого есть определенные вещи нужно отрегулировать перед отправкой.

В вашем примере не очевидно, какое сообщение содержит, но один взломанный способ структурированного клона - это немного поработать. Отправка URL через postMessage выдаст ошибку:

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

Но вы можете сделать это, чтобы работать вокруг него:

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

Есть более эффективные способы справиться с этим, но за то, что вы предоставили это должно по крайней мере, обеспечить последовательное поведение.

+1

Я наткнулся на этот ответ, который привел меня к преобразованию строк, решая мою проблему, я бы предложил просто использовать 'window.location.href', который является значением, которое метод tostring будет ссылаться, спасибо. – Scuzzy

Смежные вопросы