2010-07-26 17 views
7

postMessage dokümantasyonu, etki alanları arası mesajlaşmanın mümkün olduğunu ima eder. Ancak: o aslında nasıl yapılacağınıçok açık bir nota değilEtki alanları arası postalama nasıl yapabilirim?

// When the popup has fully loaded, if not blocked by a popup blocker 

.

iki web sitesi düşünün:

  1. ebeveyn olarak

qc-b.quadhome.com barındırılan qc-a.nfshost.com

  • [Çocuk] barındırılan [Ebeveyn]: Giriş,

    document.addEventListener('message', function(e) { 
        alert('Parent got (from ' + e.origin + '): ' + e.data); 
    
        e.source.postMessage('Round-tripped!', 'http://qc-b.quadhome.com'); 
    }, false); 
    
    function go() { 
        var w = window.open('http://qc-b.quadhome.com', 'test'); 
    
        /* This doesn't work because same-origin policy prevents knowing when 
        the opened window is ready. */ 
    
        w.postMessage('Vain attempt.', 'http://qc-b.quadhome.com'); 
    } 
    

    Ve çocuk:

    document.addEventListener('message', function(e) { 
        alert('Child got (from ' + e.origin + '): ' + e.data); 
    }, false); 
    
    window.opener.postMessage('Ready!', 'http://qc-a.nfshost.com'); 
    

    Hepsi boşuna.

    Yardım?

  • cevap

    8

    Şu anda iki sorun görüyorum. Kodda küçük hata ve zaman aşımı sorunu.

    1) Kodunuzda gördüğüm hata document.addEventListener kullanıyor olmanızdır. Bence doğru olan window.addEventListener. Bu, postMessage sayfasındaki örnektir.

    2) Zaman aşımı ile alt pencereye alt pencere mesajını gönderebilirsiniz. Ebeveyn penceresi, çocuğun hazır olduğu zaman bilinecektir.

    +4

    Kısacası, ben bir aptalım. 'Window' yerine' document' (pencere) ile değiştirildi ve hazır callback, window.opener.postMessage' üzerinden çalıştı. Teşekkür ederim! –

    +0

    Bize en iyiler geliyor :) –

    0

    Pencereyi & aradan sonra açarak mesajı gönderiyoruz. Açık belgenin posta mesajını kabul etmeye hazır olması mümkün değildir. Pencere yükleme bitene kadar postMessage çağrısını geciktirmeyi deneyin.

    Bunu sınamanın çok basit bir yolu, bir setTimeout'ta (10 saniye boyunca) w.postMessage() öğesini sarmak ve belgenin hazır olduğunda yayınlanıp yayınlanmayacağını görmektır.

    +1

    Sağ. Koddaki yorum, pencerenin ne zaman hazır olduğunu bilmenin bir yolu olmadığını belirtmektedir. Ve 10 saniyelik bir zaman aşımı biraz ... hacky gibi görünüyor. Alt pencerede dikkat, açıcıya kadar hazırlığı gösteren bir postalama işlemini yapmaya çalışıyorum. Bu da başarısız. Düşünceler? –