2013-06-13 16 views
12

Window.postMessage() kullanırken hata yakalamada sorun yaşıyorum. . Ben alıyorum hatayı yakalamak isterlerJavaScript - Deneyin ve Yakalayın - Sorun Yakalama Window.postMessage() Hatalar

-

" http://www.that-domain.com mesajı göndermek için açılamıyor Alıcı kökenli http://www.this-domain.com

Basit bir örnek kodu vardır (hata olmalı):

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

Daha ayrıntılı işlem akışı: JQuery ile belgeye bir çapraz etki alanı iframe ekliyorum ve daha sonra bu adrese yazıyorum. Bu, hedef kökenlerin eşleşmesi gerektiğinden hata yapmamalı. proxyDomain değişkeni tarafından ayarlandı. o alanı kökenleri sonra uymuyorsa hiçbir hata atılır ve sessizce iptal gerektiğini HTML5 spec özetlenmiştir gibi

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

Buna bir çözüm buldunuz mu? –

+0

Ne yazık ki, henüz yok. –

+0

no problem, geri döndüğünüz için teşekkürler –

cevap

2

görünüyor.

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

10.4.3 Gönderme mesajları - Bölüm 9.

" ... targetOrigin argüman mutlak URL ve yöntem çağrıldığı Pencere nesnenin Belge yok ise targetOrigin ile aynı kökene sahip, sonra bu adımları sessizce iptal et. "

+8

Evet, ama bunu nasıl susturup yakalayabilirsin? –

+0

URL değişti: https://html.spec.whatwg.org/multipage/web-messaging.html#posting-messages ve şimdi 9.4.3 İlk Not – sschoof

0

Alıcı tarafındaki hatayı yakalayabilirsiniz.

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

Yoksa orada işlemek istiyorsanız, catch bloğu içinde ev sahibi sayfaya geri gönderebilir: vanilya size yapabileceği javascript.

1

Hatayı yakalamanın bir yolu yoktur, ancak genellikle hedef köken farklıysa hata oluşur, durum sınama senaryosuna benzer.

Yani ana alan adının ne kontrol edebilir ve buna göre hedef kaynağını değiştirin:

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

ve postMessage işlevi içinde kullanılır:

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

aynı kullanabileceğiniz bu çözüm sayesinde targetOrigin url kodlaması yapmadan çoklu sunucu yapılandırmasında kod.

Çerçevenin içinde dolaşırsanız ve document.referrer dosyasını yeniden işaretlerseniz bu çözüm başarısız olur, bu durumda üst URL'yi değil, önceki URL URL'sini içerir. Bu durumda, '*' öğesini targetOrigin url olarak kullanmayı düşünün, bu mesaj diğer etki alanlarına mesaj gönderen tek çözümdür.

Umut eder!