Поиск по сайту
Ctrl + K
Вопросы по JS

Как <iframe> на странице могут взаимодействовать?

<iframe> — это HTML элемент, который позволяет внедрять один HTML документ в другой. Однако в случае необходимости обмена сообщениями между родительским документом и содержимым, загруженным в <iframe>, требуется учитывать несколько нюансов.

Основы взаимодействия

Существует несколько способов, которыми <iframe> может взаимодействовать с родительской страницей и наоборот:

  • Прямое взаимодействие через глобальный объекта window. Если <iframe> и родительская страница загружаются с одного и того же домена, они могут получить доступ к каждому другим через объекты window и document.
  • Использование postMessage. Если страницы загружаются с разных доменов, для безопасного взаимодействия следует использовать метод postMessage. Это позволяет отправлять сообщения между контекстами разного происхождения.
  • Пример прямого взаимодействия

    Если родительская страница и содержимое <iframe> находятся на одном домене, вы можете просто использовать JavaScript для взаимодействия:

    Код родительской страницы (parent.html)

    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <title>Родительская страница</title>
        <script>
            function sendMessage() {
                const iframe = document.getElementById('myIframe');
                iframe.contentWindow.postMessage('Привет, iframe!', '*');
            }
    
            window.addEventListener('message', (event) => {
                console.log('Сообщение от iframe:', event.data);
            });
        </script>
    </head>
    <body>
        <h1>Родительская страница</h1>
        <button onclick="sendMessage()">Отправить сообщение в iframe</button>
        <iframe id="myIframe" src="iframe.html"></iframe>
    </body>
    </html>
    

    Код <iframe> (iframe.html)

    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <title>Iframe</title>
        <script>
            window.addEventListener('message', (event) => {
                console.log('Сообщение от родителя:', event.data);
                // Отправляем ответ обратно
                event.source.postMessage('Привет, родитель!', event.origin);
            });
        </script>
    </head>
    <body>
        <h1>Содержимое iframe</h1>
    </body>
    </html>
    

    Пример использования postMessage для взаимодействия между разными доменами

    Если родительская страница и <iframe> находятся на разных доменах, необходимо использовать метод postMessage.

    Код родительской страницы (parent.html)

    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <title>Родительская страница</title>
        <script>
            function sendMessage() {
                const iframe = document.getElementById('myIframe');
                iframe.contentWindow.postMessage('Привет, iframe с другого домена!', 'https://example-iframe.com');
            }
    
            window.addEventListener('message', (event) => {
                if (event.origin !== 'https://example-iframe.com') {
                    return; // Игнорируем сообщения от другого источника
                }
                console.log('Сообщение от iframe:', event.data);
            });
        </script>
    </head>
    <body>
        <h1>Родительская страница</h1>
        <button onclick="sendMessage()">Отправить сообщение</button>
        <iframe id="myIframe" src="https://example-iframe.com"></iframe>
    </body>
    </html>
    

    Код <iframe> (iframe.html на example-iframe.com)

    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <title>Iframe на другом домене</title>
        <script>
            window.addEventListener('message', (event) => {
                if (event.origin !== 'http://your-parent-domain.com') {
                    return; // Игнорируем сообщения от другого источника
                }
                console.log('Сообщение от родителя:', event.data);
                // Отправляем ответ обратно
                event.source.postMessage('Привет, родитель с другого домена!', event.origin);
            });
        </script>
    </head>
    <body>
        <h1>Содержимое iframe на другом домене</h1>
    </body>
    </html>
    

    Заключение

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