2013-06-13 8 views
12

Mam problemy z przechwytywaniem błędów podczas korzystania z window.postMessage(). .JavaScript - Try & Catch - Problemy z przechwytywaniem błędów Window.postMessage()

Chcę być w stanie uchwycić błąd otrzymuję -

„Nie można pisać wiadomości do http://www.that-domain.com Odbiorca ma pochodzenie http://www.this-domain.com

prosty przykład kodu (powinien błędu):

try { 
    window.postMessage('1','http://www.differentDomain.com'); 
} 
catch (e) {  
    alert('error'); 
} 

Bardziej szczegółowy przebieg procesu: Dodaję element iframe o nazwie cross domain do dokumentu za pomocą jQuery, a następnie do niego publikuję. Nie powinien to być błąd, ponieważ docelowe wartości powinny być zgodne - bo th ustawiony przez zmienną proxyDomain.

var $iframeProxy = $('<iframe id="myIFrame" src="' + proxyDomain + '"></iframe>').appendTo('body'); 

window.storageProxy = $iframeProxy[0].contentWindow; 

try { 
    window.storageProxy.postMessage(message, proxyDomain); 
} 
catch (e) {  
    alert('error'); 
} 
+1

czy kiedykolwiek znalazłeś rozwiązanie tego problemu? –

+0

Niestety, jeszcze nie. –

+0

nie ma problemu, dziękuję za zwrot –

Odpowiedz

2

Wygląda to jest opisane w specyfikacji HTML5, że jeśli początki domeny nie pasuje to nie jest błąd i należy go przerwać cicho.

http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html#web-messaging

10.4.3 wysyłania wiadomości - Część 9

”... jeśli argument targetOrigin to absolutny URL, a dokument obiektu okno na którym metoda została wywołana nie mają to samo pochodzenie co targetOrigin, a następnie w trybie cichym przerwij te czynności. "

+8

Tak, ale jak możesz to uciszyć i złapać? –

+0

Adres URL został zmieniony: https://html.spec.whatwg.org/multipage/web-messaging.html#posting-messages, a teraz 9.4.3 Pierwsza uwaga – sschoof

0

Możesz złapać błąd po stronie odbiornika. W wanilii javascript można zrobić:

window.addEventListener('message', function() { 
    try { 
     not.existing.objects = 'Something dangerous!'; 
    } catch(e) { 
     console.log('error at message receive: ' + e + ' stack trace: ' + e.stack); 
    } 
}, false); 

Można też wysłać go z powrotem do swojej strony przyjmującej w bloku catch, jeśli chcesz obsługiwać go tam.

1

Nie można złapać błędu, ale zazwyczaj błąd występuje, jeśli docelowe miejsce jest inne, przypadek to scenariusz testowy lub produkcyjny.

więc można sprawdzić, co jest domeną nadrzędną i zmienić pochodzenie docelową odpowiednio:

function getTargetOrigin() 
{ 
    try { 
     var url = (window.location != window.parent.location) ? document.referrer : document.location.href; 
     if (url.indexOf('www.myproduction-website.com')!=-1) 
      return document.location.protocol + '//www.myproduction-website.com' 
     else //set the alternative target 
      return document.location.protocol + '//' + url.split('/')[2]; 
    } 
    catch(e) //falback to production 
    { 
     return document.location.protocol + '//www.myproduction-website.com' 
    } 
} 

i użyć go wewnątrz funkcji postMessage:

function postMessage(message){ 
    window.top.postMessage(message,getTargetOrigin()); 
} 

Dzięki temu rozwiązaniu można używać tego samego kod w konfiguracji z wieloma serwerami bez twardego kodowania adresu URL targetOrigin.

To rozwiązanie nie powiedzie się, jeśli przejdziesz przez ramkę i ponownie sprawdzisz document.referrer, w takim przypadku będzie to nie adres URL strony nadrzędnej, ale poprzedni URL ramki. W takim przypadku rozważ użycie "*" jako URL targetOrigin, to jedyne skuteczne rozwiązanie do wysyłania wiadomości do innych domen.

Mam nadzieję, że pomoże!