2014-05-14 6 views
1

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

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

Поэтому я искал сторонние решения для автоматического изменения размера (кросс-домена) iframe при изменении контента. Best я нашел до сих пор (ищу простое решение) является:

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

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

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

Я получил тех, кто работает на простой тест IFRAME, теперь я хочу реализуйте это в Magnific Popup.

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

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

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

ответ

1

Так, кажется, не будет построен в растворе для автоматического изменения размера (без видео) фреймов в Magnific Всплывающие я построил свой собственный решение с помощью внешних плагинов, как упоминалось выше.

Чтобы проверить, изменилась ли высота содержимого iframe, я использовал this Fork of jQuery resize event plugin, который совместим с текущей версией jQuery 1.11.1.

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

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

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

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

+0

Что также очень помогло стартеру, это [пример изменения размера iframe] (http://benalman.com/code/projects/jquery-postmessage/examples/iframe/). Однако имейте в виду, что он использует свой собственный jQuery postMessage плагин, который несовместим с текущей версией jQuery. Должен опубликовать это как комментарий, так как я все еще могу опубликовать только 2 ссылки за сообщение ... – Oliver

+0

Оливер, я отредактировал свой ответ. Если вы используете https://github.com/davidjbradshaw/iframe-resizer, он должен помочь вам. Я также заметил, что у magnific есть ** resize ** callback, который позволяет игнорировать происхождение iframe. Я реализовал это решение на своем интернет-магазине, и до сих пор он работал без проблем. Удачи! – vitaly87

2

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

Это требует, чтобы вы добавить сценарий загрузки страницы :

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

Как и на странице внешнего вы пытаетесь загрузить Внутри :

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

Примечание: Если вы пытаетесь загрузить внешний домен whi ch не принадлежит вам, это может не сработать для вас - потому что у вас должен быть сценарий, добавленный в обоих местах (извините), но этот WILL работает, если вы пытаетесь загрузить страницу HTTPS на странице NON HTTPS.

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

 $(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>' 
       }, 
     }); 
     }); 

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

Одна из основных вещь, которую я понял, что на самом деле Magnific имеет размер обратного вызова, включенную в его коде:

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

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

+0

Хороший небольшой код, но он не работает на кросс-домен (такая же политика происхождения). Также это зависит от onload, поэтому он не будет работать, если содержимое iframe изменяется без перезагрузки (например, Ajax)? – Oliver

+0

Я отредактировал свой ответ, посмотрим, работает ли это для вас. Благодаря! – vitaly87

+0

Я думаю, что проверка происхождения при использовании PostMessage - это риск для безопасности. См. «Проблемы безопасности» здесь: https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage Однако спасибо за обновление! Когда я проводил свое исследование, я тоже проверял этот скрипт iframe risizer, но не использовал его по какой-то причине, может быть, потому, что это IE8 +, и изначально нашему проекту все равно пришлось поддерживать IE7 (не более того). Решение, которое я разместил, это IE6 + и отлично работает для меня. Но я должен сказать, что ваш код намного (!) Меньше, я попробую (с проверкой происхождения), когда у меня осталось некоторое время, спасибо! – Oliver

0

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

Есть ли способ для iframe по-своему связываться со своим родительским окном. Вы можете изменить размер родителя с помощью этого кода на ваш 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 и изменить его оттуда. Надеюсь, это поможет кому-то.

+0

Даже меньший код, хорошо выглядит :) (не проверял себя). К сожалению, это не будет работать с междоменными iframes, поскольку вы не можете получить доступ к перекрестному домену window.parent. Да, я не просил решения для перекрестных доменов, как должно быть в моем вопросе, но мне это нужно. Я уточню свой вопрос. – Oliver

Смежные вопросы