İframe ve üst site arasında nasıl iletişim kurulur?


185

İframe'deki web sitesi aynı alanda değil , ancak her ikisi de benim iframeve üst site ile iletişim kurmak istiyorum . Mümkün mü?

Yanıtlar:


309

Farklı alan adlarıyla, yöntemleri aramak veya iframe'in içerik belgesine doğrudan erişmek mümkün değildir.

Sen kullanmak zorunda çapraz belge mesajlaşma .

Örneğin üst pencerede:

 myIframe.contentWindow.postMessage('hello', '*');

ve iframe'de:

window.onmessage = function(e){
    if (e.data == 'hello') {
        alert('It works!');
    }
};

İframe'den üst pencereye mesaj gönderiyorsanız

window.top.postMessage('hello', '*')

2
teşekkür ederim, ancak maalesef eski tarayıcılarda çalışmıyor.
Danny Fox

106
Ebeveyn olarak: window.onmesage = function().... İç window.top.postMessage('hello', '*')
çerçeve içinde

3
Bu bir hata değil. Dosya URL'leri çok güvensiz olabilir ve tarayıcılar onlara giderek artan bir özenle davranırlar. Eski günlerde file://C:/Windows/system32/whateverbir web sayfasına bir bağlantı koyabilir ve doğrudan kullanıcının sistem klasörüne yönlendirebilirsiniz. Günümüzde tarayıcılar çoğunlukla bu tür bağlantılara yapılan tıklamaları yok sayar. Bir web sunucusu çalıştırın ve kodunuza bu şekilde erişin ve hataların kaybolduğunu göreceksiniz.
Stijn de Witt

4
İyi bir uygulama olarak, asla hedefiniz için '*' kullanmayın. Aslında, MDN, "Diğer pencerenin belgesinin nerede olması gerektiğini biliyorsanız, * değil, her zaman belirli bir targetOrigin sağlayın. Belirli bir hedef sağlanamadığında, ilgili kötü amaçlı sitelere gönderdiğiniz veriler açıklanır."
rodiwa

2
Eşdeğer window.frames[index]alt çerçeve ( <iframe>, <object>, <frame>) almak için bile kullanabiliriz getElementsByTagName("iframe")[index].contentWindow. Üst Pencere Nesnesini window.parentwindow.top
IFrames'ten

46

Burada olmalı, çünkü 2012'den kabul edilen cevap

2018 ve modern tarayıcılarda iframe'den üst pencereye özel bir etkinlik gönderebilirsiniz.

iframe:

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

ebeveyn:

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

PS: Tabii ki, aynı şekilde olayları ters yönde gönderebilirsiniz.

document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)

1
Merhaba, aynı etki alanında olmam gerekiyor mu?
Guillaume Harari


1
dispatchEventTüm büyük tarayıcılarda desteklendiğine dikkat edilmelidir . IE9 ilk çıktığı versiyondu, bu yüzden çoğu işletim sistemi şimdi onunla çalışıyor. Caniuse.com/#search=dispatchEvent
Dan Atkinson

1
Bu yöntemle üst öğeden iframe'e iletişim kuramıyorum.
Avan

Evet ya da işe yarayamıyorum, iframe js üst pencereden sonra yükleniyor, bu yüzden gönderildiğinde msg'yi almak için orada değil. benim için sadece iframe'den ebeveyne çalışır.
radtek

14

Bu kitaplık HTML5 postMessage ve resize + hash özellikli eski tarayıcıları destekler https://github.com/ternarylabs/porthole

Edit: Şimdi 2014 yılında, IE6 / 7 kullanımı oldukça düşük, IE8 ve her şeyden önce destek postMessagebu yüzden şimdi sadece bunu kullanmanızı öneririz.

https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage


IE8 / 9'un yalnızca dizeleri desteklediği uyarısı ile caniuse.com/#search=postmessage (Bilinen sorunlara bakın)
Harry

bu, olay nesnelerinizi json'a kodlayarak ve diğer tarafta kodlarını çözerek çözülebilir.
codewandler



1

event.source.window.postMessageGönderene geri göndermek için kullanın .

Iframe'den

window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
    if (event.data === 'GOT_YOU_IFRAME') {
        console.log('Parent received successfully.')
    }
}

Sonra ebeveynlerden geri söyleyin.

window.onmessage = (event) => {
    event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.