2013-06-13 13 views
12

Non riesco a rilevare errori durante l'utilizzo di window.postMessage(). .JavaScript - Try & Catch - Errore durante la cattura degli errori Window.postMessage()

voglio essere in grado di catturare l'errore che sto ottenendo -

"Impossibile inviare il messaggio a http://www.that-domain.com destinatario ha origine http://www.this-domain.com

codice di esempio semplice (dovrebbe ERROR):

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

Flusso di processo più dettagliato: Aggiungo un iframe di dominio incrociato al documento con jQuery e quindi lo invio a esso. Ciò non dovrebbe essere dovuto perché le origini di destinazione devono corrispondere - sono bo th impostato dalla variabile 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

hai mai avuto una soluzione a questo? –

+0

Purtroppo non l'ho ancora fatto. –

+0

nessun problema, grazie per il ritorno –

risposta

2

sembra che è delineato nelle specifiche HTML5 che se le origini di dominio non corrispondono allora nessun errore viene generato e dovrebbe interrompere in silenzio.

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

10.4.3 Messaggi commentando - Parte # 9

" ... se l'argomento targetOrigin è un URL assoluto, e il Documento dell'oggetto finestra su cui è stato invocato il metodo non avere la stessa origine di targetOrigin, quindi interrompere questi passaggi in silenzio. "

+8

Sì, ma come puoi tacere e catturare questo? –

+0

L'URL è cambiato: https://html.spec.whatwg.org/multipage/web-messaging.html#posting-messages e ora 9.4.3 Prima nota – sschoof

0

È possibile rilevare l'errore sul lato ricevitore. In vaniglia javascript si potrebbe fare:

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

Oppure è possibile inviare di nuovo a vostra pagina host nel blocco catch, se si vuole gestire la cosa lì.

1

Nessun modo per rilevare l'errore, ma in genere l'errore si verifica se l'origine del target è diversa, il caso è scenario di test vs produzione.

modo da poter controllare quello che è il dominio padre e modificare l'origine di destinazione di conseguenza:

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' 
    } 
} 

e utilizzarlo all'interno della funzione postMessage:

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

Con questa soluzione è possibile utilizzare lo stesso codice in configurazione server multipli senza codificare l'URL targetOrigin.

Questa soluzione ha esito negativo se si naviga all'interno del frame e si ricontrolla il file document.referrer, in tal caso non conterrà l'URL principale ma l'URL del frame precedente. In tal caso, considera di utilizzare il * * come url di destinazioneOrigin, è l'unica soluzione funzionante per inviare messaggi ad altri domini.

Spero che aiuti!