Преодоление разрыва: общение iframe с его родителем

В современной веб-разработке iframe обычно используются для встраивания внешнего контента в веб-страницу. Однако одна из распространенных проблем, с которыми сталкиваются разработчики, — это как установить связь между iframe и его родительским документом. В этой статье мы рассмотрим несколько способов добиться этого, используя разговорные объяснения и примеры кода.

Метод 1: PostMessage
API postMessage обеспечивает безопасный и эффективный способ взаимодействия между iframe и его родительским элементом, даже если они находятся в разных источниках. Вот как это работает:

В родительском документе:

// Add an event listener to receive messages from the iframe
window.addEventListener('message', function(event) {
    // Check the message origin for security
    if (event.origin === 'https://www.example.com') {
        // Access the message data
        console.log('Received message:', event.data);
    }
});

В документе iframe:

// Send a message to the parent document
window.parent.postMessage('Hello from the iframe!', 'https://www.example.com');

Метод 2: хеш URL-адреса.
Еще один простой метод взаимодействия между iframe и его родительским элементом — использование хеша URL-адреса. Родитель может прослушивать изменения в хеш-значении iframe и реагировать соответствующим образом.

В родительском документе:

// Add an event listener to detect hash changes
window.addEventListener('hashchange', function() {
    var message = window.location.hash.substr(1);
    console.log('Received message:', message);
});

В документе iframe:

// Change the hash value to send a message to the parent
window.location.hash = 'Hello from the iframe!';

Метод 3: общее хранилище DOM
Если iframe и его родительский элемент используют один и тот же домен, вы можете использовать общее хранилище DOM, например localStorage или sessionStorage, для обмена данными.

В родительском документе:

// Add an event listener to detect storage changes
window.addEventListener('storage', function(event) {
    if (event.key === 'myMessage') {
        console.log('Received message:', event.newValue);
    }
});

В документе iframe:

// Update the shared storage value to send a message to the parent
localStorage.setItem('myMessage', 'Hello from the iframe!');

В этой статье мы рассмотрели три метода обеспечения связи между iframe и их родительскими документами: postMessage, хэш URL-адреса и общее хранилище DOM. У каждого метода есть свои варианты использования и особенности, поэтому выберите тот, который лучше всего соответствует вашим требованиям. Используя эти методы, вы можете создавать интерактивные и унифицированные интерфейсы для различных веб-компонентов.