Есть ли способ перенести содержимое из переполнения IFRAME в родительский фрейм?

У меня есть виджет пользовательского интерфейса, который нужно поместить в IFRAME как по соображениям производительности, так и для того, чтобы мы могли легко распространять его на партнерские сайты. Пользовательский интерфейс виджета включает всплывающие подсказки, которые отображаются поверх другого содержимого страницы. См. Снимок экрана ниже или перейти на сайт, чтобы увидеть его в действии. Есть ли способ сделать так, чтобы содержимое IFRAME перекрывало содержимое родительского фрейма?

Есть ли способ перенести содержимое из переполнения IFRAME в родительский фрейм?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
50
0
39 824
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Насколько я знаю, это невозможно. Почему бы не использовать запрос XHR и вместо этого заполнить div?

Это то, что мы делаем в настоящее время, но - как упоминалось выше - одно из требований - разрешить сторонним сайтам добавлять IFRAME в качестве виджета на свои страницы. Текущая реализация также замораживает пользовательский интерфейс, но я уверен, что смогу обойти это.

Andrew Hedges 07.10.2008 03:17

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

eyelidlessness 07.10.2008 03:27

Это было бы безопасно только в том случае, если вы действительно доверяете контенту / виджету - преимущество iframe в том, что они фактически являются песочницей контента (благодаря той же политике происхождения)

olliej 07.10.2008 03:35

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

Andrew Hedges 07.10.2008 03:38
Ответ принят как подходящий

Нет, это невозможно. Игнорируя какие-либо исторические причины, в настоящее время это будет считаться уязвимостью безопасности - например, многие сайты помещают ненадежный контент в iframe (источник iframe имеет другое происхождение, поэтому не может изменять родительский фрейм в соответствии с той же политикой происхождения).

Если у такого ненадежного контента был механизм для размещения контента за пределами iframe, он мог (например) разместить «идентичный» логин div (или что-то еще) поверх реальных полей входа в родительский фрейм и таким образом мог украсть информацию об имени пользователя / пароле . Что было бы отстой.

Однако только что обнаружил, что элементы <select> могут естественным образом вытекать из содержащей границы iFrame (и других содержащих элементов), когда их контейнер <option> длиннее границы iFrame.

Gilad Barner 07.11.2016 13:18

Это может быть неуместным, потому что это не подходит в свете ваших требований, или это может не помочь (!), Но, возможно, стоит проверить UFrame. Это своего рода гибрид iframe и div, который, вероятно, можно было бы упаковать как виджет (лучше всего было бы предоставить клиентам тег <script>, который будет впитывать UFrame и соответствующую разметку). В чем я не уверен, так это в том, сможете ли вы добиться требуемого наложения, но, возможно, с ним стоит поиграться. Извините, я не могу быть более конкретным, но я на самом деле не использовал это сам, я просто добавил его в закладки некоторое время назад для дальнейшего использования.

если вы знаете абсолютную вершину значения, которое может иметь верхняя часть инструмента, вы можете создать div, который представляет собой высоту содержимого + максимальное расстояние, на котором будет отображаться подсказка. Выровняйте iframe по нижней части div. убедитесь, что iframe и div прозрачны. тогда должно отображаться содержимое iframe со всплывающей подсказкой. Хотя это настраивает вас на головную боль, связанную с тем, чтобы такие вещи, как выделение, работали одинаково во всех браузерах.

Мне не удалось найти способ вывести содержимое кадра из кадра, но я нашел способ обойти его, переместив всплывающую подсказку в родительский документ и поместив ее над (z-index) iframe .

Подход был:
1) найдите iframe в родительском документе
2) удалите элемент всплывающей подсказки с того места, где он находится в DOM, и добавьте его в родительский документ внутри элемента, содержащего ваш iframe. 3) вам, вероятно, потребуется настроить z-index и позиционирование, в зависимости от того, как вы это делали в первую очередь.

Вы можете получить доступ к родительскому документу iframe с помощью parent.document.

jQuery(tooltip).remove();
var iframeParent = jQuery("#the_id_of_the_iframe", parent.document)[0].parentNode;
iframeParent.appendChild(tooltip);
//adjust z-index, positioning

Это не сработает, если эти два документа из разных доменов.

keaukraine 26.08.2014 15:24

Вложите текущий iframe и предлагаемый div в родительский iframe, а затем добавьте родительский iframe третьим сторонам, лучшее из обоих миров!

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

Быстрый контекст:

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

Сначала мы предложили интегрировать наш пользовательский интерфейс в iframe на их веб-сайте, но таким образом данные не могли индексироваться внешними поисковыми системами, такими как Google. Поэтому мы перешли на противоположный принцип: мы интегрируем верхнее меню с их сайта в iframe, который размещается в нашем пользовательском интерфейсе.

Проблема:

Их меню заголовков часто содержат выпадающие подменю. Эти подменю не могут выходить за пределы высоты iframe и усекаются.

Решение:

  • Установите iframe в положение css "absolute" с высоким z-индексом, чтобы iframe перекрывал родительский интерфейс.
  • В содержимом iframe определите классы объектов, которые могут переполнять окно iframe (в нашем случае мы просим владельца меню добавить конкретное имя класса к этим элементам, но вы можете иметь дело с существующими именами классов).

Затем в JS:

  • Получите высоту содержимого iframe (т.е. высоту заголовка без отображаемых раскрывающихся списков).
  • Установите начальную высоту iframe на эту высоту.
  • Сдвиньте содержимое родительского пользовательского интерфейса с полем, равным этой высоте, чтобы оно не перекрывалось содержимым iframe по умолчанию.
  • Добавьте прослушиватель событий, который устанавливает высоту iframe равной 100%, когда указатель мыши находится над определенными классами, которые были идентифицированы. В этом состоянии содержимое iframe может полностью перекрывать родительский контент.
  • Добавьте прослушиватель событий, который возвращает исходный размер высоты iframe, когда указатель мыши выходит из определенных классов. В этом состоянии все возвращается в норму.

Другие вопросы по теме