Автоматическое изменение размера всплывающего окна Magnific Popup iframe при изменении содержимого (междоменное)

На данный момент мы используем только тип iframe Magnific Popup (плагин jQuery). Однако всплывающее окно не изменяет свой размер, когда содержимое iframe динамически увеличивается/уменьшается. Я думаю, что изменение размера встроенного контента работает.

Я искал документацию и Интернет, но не смог найти никакого решения.

Поэтому я искал сторонние решения для автоматического изменения размера (междоменных) фреймов при изменении контента. Лучшее, что я нашел до сих пор (ищу простое решение):

событие изменения размера jQuery (с использованием вилки, поскольку оригинал, похоже, не поддерживается)
чтобы иметь возможность привязать событие изменения размера в сочетании с:

jQuery postMessage (с использованием вилки по той же причине)
для реализации междоменного связь между iframe и родителем (из-за той же политики происхождения).

(Не могу размещать ссылки на вилки, так как это мой первый вопрос, и мне разрешено размещать только две ссылки...)

У меня есть те, кто работает для простого тестового iframe, теперь я хочу реализовать это в Magnific Popup.

Только сейчас я наткнулся на событие изменения размера в документации, которое уже встроено в MFP: «событие изменения размера срабатывает только при изменении высоты или принудительном расположении». Однако он не срабатывает, когда я отображаю больше/меньше текста в iframe на основе выбранного ввода (пока только тест, но это то, что мне нужно на данный момент).

Поэтому, прежде чем внедрять все эти плагины, я подумал, может быть, я спрошу, есть ли у кого-то уже работающее решение для этого, или я просто пропустил встроенную функцию/не использовал ее правильно. Я новичок в JavaScript.

заранее спасибо


person Oliver    schedule 14.05.2014    source источник


Ответы (3)


Вы можете использовать: https://github.com/davidjbradshaw/iframe-resizer

Для этого необходимо добавить скрипт на страницу, загружающую <iframe>:

<script type="text/javascript" src="../iframeResizer.min.js"></script> 

А также на внешнюю страницу, которую вы пытаетесь загрузить внутри <iframe>:

<script type="text/javascript" src="../iframeResizer.contentWindow.min.js"></script>

Примечание. Если вы пытаетесь загрузить внешний домен, который вам не принадлежит, это может не сработать для вас, потому что вы должны добавить скрипт в оба места (извините), но это будет работать, если вы пытаетесь загрузить HTTPS. страница внутри страницы НЕ HTTPS.

Я также определяю свою собственную разметку для всплывающего окна Magnific в скрипте.

      $(document).ready(function() {
        $('.open-popup').magnificPopup({
            items: {src: '/file.html'},
            type: 'iframe',
              iframe: {
                 markup: '<div class="iframe-popup">'+
                            '<iframe class="mfp-iframe" frameborder="0" scrolling="no" allowtransparency="true" allowfullscreen></iframe>'+
                            '<div class="mfp-close"></div>'+
                          '</div>'
              },
        });
      });

Вы можете легко изменить ширину iframe с помощью CSS до 100% родительского окна... если у вас есть max-width для вашего родителя (.iframe-popup в приведенном выше примере).

Одна важная вещь, которую я понял, это то, что magnific на самом деле имеет обратный вызов resize, включенный в его код:

    callbacks: {
        resize: function() {
            $('iframe').iFrameResize([{
                enablePublicMethods: true,
                checkOrigin: false
            }]);
         }

Вот и все. Работает для меня каждый раз.

person vitaly87    schedule 21.08.2014
comment
Хороший небольшой код, но, похоже, он не работает в разных доменах (такая же политика происхождения). Также это зависит от загрузки, поэтому это не сработает, если содержимое iframe изменится без перезагрузки (например, Ajax)? - person Oliver; 22.08.2014
comment
Я думаю, что отсутствие проверки происхождения при использовании PostMessage представляет собой угрозу безопасности. См. Вопросы безопасности здесь: developer.mozilla.org/en-US /docs/Web/API/window.postMessage Однако спасибо за обновление! Когда я проводил свое исследование, я также проверял этот скрипт iframe risizer, но по какой-то причине не использовал его, возможно, потому, что это IE8+, и изначально наш проект все еще должен был поддерживать IE7 (хотя и не больше). Решение, которое я опубликовал, - это IE6 +, и оно отлично работает и для меня. Но я должен сказать, что ваш код намного (!) меньше, я попробую (с проверкой происхождения), когда у меня останется немного времени, спасибо! - person Oliver; 16.01.2015

Поскольку в Magnific Popup нет встроенного решения для автоматического изменения размера iframe (не видео), я создал собственное решение с использованием внешних плагинов, как упоминалось выше.

Чтобы проверить, изменилась ли высота содержимого iframe, я использовал этот форк подключаемого модуля события изменения размера jQuery, который совместим с текущей версией jQuery 1.11.1.

Чтобы отправить новую высоту из iframe в родительское окно (совместимость между доменами), я использовал этот jQuery Плагин postMessage, который хорошо поддерживается и работает в IE6+.

Кроме того, я переключился на использование «type: inline» Magnific Popup для отображения iframe, поскольку «type: iframe», по-видимому, специально разработан для встраивания видео iframe, например видео YouTube, из-за чего мне было трудно стилизовать высоту всплывающего окна в простой способ.

Может быть более чистое/прямое решение, поэтому я не стал вдаваться в подробности. Другая причина заключается в том, что я использовал довольно много строк кода для реализации в MFP, и, поскольку я новичок в JS, это может быть не лучший код;) Но, поскольку ответа еще не было, я пока отмечу это как принятый ответ, потому что оно работает.

Лучшее решение, конечно, было бы, если бы у Magnific Popup было встроенное решение (запрос функции!).

person Oliver    schedule 16.06.2014
comment
Что также очень помогло в качестве стартового, так это пример изменения размера iframe. Однако имейте в виду, что он использует свой собственный плагин jQuery postMessage, который несовместим с текущей версией jQuery. Пришлось опубликовать это как комментарий, так как я все еще могу размещать только 2 ссылки на сообщение... - person Oliver; 16.06.2014
comment
Оливер, я отредактировал свой ответ. Если вы используете github.com/davidjbradshaw/iframe-resizer, это должно вам помочь. Я также заметил, что у magnific есть обратный вызов resize, который позволяет игнорировать источник iframe. Я применил это решение в своем интернет-магазине, и до сих пор оно работало без проблем. Удачи! - person vitaly87; 15.01.2015

Я искал решение этой проблемы и нашел только простое решение для связи без междоменного обмена без использования плагина. (Я не тестировал междоменные, но не могу сказать, что это не сработает).

Для фреймов есть способ по своей сути взаимодействовать с родительским окном. Вы можете изменить размер родителя с помощью этого кода в вашем iframe

<script>
    $(document).ready(function() {

        // access the iframe's parent in order to resize
        var contentHeight           = $('.your-iframe-wrapper').height(),
            parentBody              = window.parent.document.body;          

        $('iframe', parentBody).animate({
            height: contentHeight + 100,
            maxHeight : "100%"
        }, 200)     

    });

</script>

Когда ваш iFrame загружается, он должен запустить этот скрипт и получить доступ к родительскому окну iFrame и изменить его размер оттуда. Надеюсь, это поможет кому-то.

person Phillip Chan    schedule 26.11.2014
comment
Даже меньший код выглядит хорошо :) (сам не проверял). К сожалению, это также не будет работать с междоменными фреймами, поскольку вы не можете получить доступ к междоменному домену window.parent. Да, я не просил междоменное решение как обязательное в своем вопросе, но оно мне понадобится. Я обновлю свой вопрос. - person Oliver; 26.11.2014