2012-10-19 14 views
21

Bir iframe içindeki özel bir olayı tetiklemek ve üst belgeden algılamak için biraz sıkıntı yaşıyorum. Hem iframe hem de parent document aynı kaynağa sahip (aynı protokol, aynı host, aynı port).Özel Olayı Iframe'den Ana Belgeye Tetikle

Herhangi bir öneri?

+0

daha net 'aynı source' ne olduğu yazınız:

var myCustomData: { foo: 'bar' } var event = new CustomEvent('myEvent', { detail: myCustomData }) window.parent.document.dispatchEvent(event) 

Ve iframe içerir üst dosyada

. –

+0

iframe'inden parent.functionname() öğesini çağırabilirsiniz. – user10

+0

aynı protokol, aynı ana makine, aynı bağlantı noktası –

cevap

30

Bu çalışır: iframe üst belgedeki tespit edilecek iç

parent.$('body').trigger('eventName'); 

olay tetiklenir.

+1

Bu yardımcı oldu, teşekkürler –

+0

Ana sayfa jQuery içermiyorsa ne olacak? – Meekohi

+0

Aşağıda önerildiği gibi '' 'window.addEventListener''' kullanabilirsiniz. –

19

Benzer bir soruna rastladım ve çözmek için window.postMessage'ı kullandım.

Şu anda API yalnızca bir dizeyi geçirmeyi desteklemektedir, ancak çözümünüzü değiştirirseniz güçlü olabilir. Daha fazla detay kaynak sayfa (bir iframe tarafından tüketilen) Gönderen

here:
postMessage API 2 params beklediğini - Mesajı,

ex hedef: (ana sayfasından window.parent.postMessage("HELLO_PARENT", 'http://parent.com');

iframe içerir. örneğin Konteyner):

  1. normalde

    yaptığınız gibi bir olay dinleyici ekleyin
    window.addEventListener('message', handleMessage, false); 
    
  2. aynı etki alanları ve alanlar arası iframe'ler hem olay sistemini kullanmaktır destekleyen

    function handleMessage(event) { 
        if (event.origin != "h ttp://child.com") { return; } 
        switch(event.data.message) { 
         case "HELLO_PARENT": 
          alert("Hello Child"); 
          break; 
        } 
    } 
    
+0

Her IE'de ve Kenarda – migueloop

+1

@FarzadYZ'de nesneler geçerken sıkıntı çektim - Yorumunuz [MDN'nin söyledikleriyle çelişiyor] (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) : "Window.postMessage()" yöntemi, çapraz kaynaklı iletişimi güvenli bir şekilde sağlar. " –

+0

@JohnS Haklısınız, yorumu kaldırırım. –

6

\ tutarlı cevap (güvenlik) event.origin çek ile işlevi tanımlayın.

Amaç, iframe'den ebeveyne özel bir etkinlik göndermektir. iframe kaynak dosyasında

:

window.document.addEventListener('myEvent', handleEvent, false) 
function handleEvent(e) { 
    console.log(e.detail) // outputs: {foo: 'bar'} 
} 
İlgili konular