Подтвердить что ты не робот

Являются ли iframes ужасной идеей?

Я создаю виджет, и я использую iframe для представления содержимого внутри него. В какой-то момент я могу начать обслуживать сторонний HTML и JS, поэтому я подумал, что iframes будет хорошей идеей.

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

Есть ли у вас какие-либо советы? Было бы огромной помощью узнать, что другие люди думают о iframes.

4b9b3361

Ответ 1

Нет, ничего плохого в iframe. Iframes, вероятно, являются лучшей идеей, если вы собираетесь запускать сторонний контент.

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

Ответ 2

До того, как XMLHTTPRequest стал широко использоваться, люди использовали комбинацию JavaScript и iframe для динамического воспроизведения контента, не делая полного обновления страницы.

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

Единственное, что я обнаружил, что это боль, - это междоменное использование JavaScript в iframe. Если страница, которую вы внедряете в iframe, находится в другом домене, чем "родительская" страница, браузеры имеют ограничения безопасности, позволяющие вам получить доступ к одному из другого. Фокус в том, что обе страницы объявляют

document.domain = 'somedomain.com';

В Интернете много материала об этом способе обхода.

Удачи!

Ответ 3

Недавно я обнаружил, что страницы .aspx, встроенные внутри iframe, иногда имеют проблемы с потерей файлов cookie, что привело к потере состояния сеанса в приложении, с которым я был связан.

Для меня это было в сценарии, когда другой магазин разработки потреблял одну из моих .aspx-страниц на их собственной странице. Это означает, что мы находимся на отдельных серверах, что может быть или не быть заметным.

По-видимому, это было вызвано тем, что родительская страница отклоняет файлы cookie для дочерней страницы... Как и в cookie сеанса, так и сеанс.

Конкретная механика того, как это работает, немного вовлечена: Подробнее

Эта проблема не повлияла на FireFox, но она появилась в IE7, и это была настоящая тайна в течение нескольких часов.

Кроме того, я должен противоречить статье I, связанной выше, в одном пункте. В статье говорится, что вы не получите это, если содержащая страница также является .aspx... В этом случае это было неверно, потому что обе страницы были .aspxs.

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

Как было предложено в статье, я ввел следующий код, который вводит заголовок p3p (проект "Конфиденциальность" - я никогда не слышал об этом) на странице "Событие Init":

HttpContext.Current.Response.AddHeader("p3p", "CP=\""IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""")

... И это исправило проблему.

Ответ 4

Я собираюсь не согласиться с большинством голосов и сказать, что да, iframes - это абсолютно ужасная идея. Любой, кто некоторое время работал в сообществе веб-дизайна, соглашается с тем, что iframe - это чистое зло, и его следует избегать, если не требуется АБСОЛЮТНО.

Мои причины полагать, что они плохие, - это то, что они нарушают навигационную схему веб-страницы. Используя iframe, вы можете эффективно сломать кнопки назад и вперед в браузерах и запутать своих пользователей. Это нарушает всю идею протокола HTTP; что URL-адрес всегда приведет к уникальному местоположению. Если бы iframe был лошадью, он давно бы удалился. Существуют и другие способы обслуживания контента динамически, и они должны использоваться вместо этого.

Если вы создаете виджет, немедленно исчезают проблемы с использованием iframes (плохо для поисковых систем, плохо для закладок и т.д.), но в любом случае контент будет лучше обслуживаться динамически или даже в новом окне, а не в IFrame.

Ответ 5

Есть только одна "очень плохая" вещь с ними, о которой я знаю.

Если ваш сторонний пользователь делает какой-то JavaScript, который пытается изменить их DOM слишком рано... IE6 и IE7 будут бросать ох так бесполезно " Operation Aborted, затем затушите не только iframe, но и всю окружающую страницу. (например, ваш сайт не отображается)

В IE8 он не исправлен, но сбой лучше обрабатывается.

Ответ 6

Лично я избегаю этого, если вы можете без особых хлопот. Используя Javascript (или AJAX, если вам нужно загружать их динамически), вы можете легко просто использовать div и изменить содержимое по мере необходимости - в некоторых случаях это даст вам гораздо большую гибкость и упростит вашу JS, особенно если есть много взаимодействия между вашим виджетом и остальной частью страницы.

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

Хорошим вариантом является использование свойства CSS переполнения. Значение по умолчанию отображается, но вы можете настроить его на скрытый, прокручиваемый или автоматический. Я бы использовал авто в вашем случае. Если ваш контент становится слишком большим, он будет выглядеть так, как будто у вас есть iframe, но он по-прежнему остается на странице.

см. свойство переполнения

Ответ 11

Iframes не являются злыми, они просто еще один инструмент, как и все остальное, и для определения их достоинств вы должны определить контекст, в котором они будут использоваться. Google Image Search и несколько других высокопрофильных сайтов используют iframes для ограниченных целей.

В общем, я считаю, что они используются для брендинга или для того, чтобы пользователь мог вернуться на сайт, который перенаправляет пользователя за пределы сайта.

Примечание. Если вы используете междоменные iframe, например. iframe, который ссылается на домен вне того, где страница обслуживается, вы ограничены дизайном по соображениям безопасности и не можете получить через javascript внутренности DOM вне домена, с которым он связан.

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

Ответ 12

Не обязательно, если контент внутри iframe предсказуем.

Ответ 13

Технически нет ничего плохого в iFrame, что с альтернативами. Но семантически, есть зло.

Веб основан на HTTP-протоколе, который говорит, что данный URL-адрес всегда приведет к уникальному ресурсу.

Используя iFrame, вы просто обслуживаете несколько ressources, расплавленных на веб-страницах за одним URL для всех из них. Если вы беспокоитесь о том, как должен развиваться Интернет, это становится проблемой. Что еще, для роботов поисковой системы, это сложно.

Ответ 14

Re: "вся идея HTTP-протокола, что URL-адрес всегда приведет к уникальному местоположению"

Я обслуживаю всю свою CMS с одного и того же URL-адреса для обеспечения безопасности и масштабируемости (используя в основном POST вместо параметров GET). Я не хочу, чтобы безопасный контент отображался без проверки подлинности, а система отправки облегчает мне разработку, поскольку мне не нужно беспокоиться об аутентификации для каждой новой страницы.

Кроме того, для некоторых приложений SEO не применим (например, для веб-ERP).

Я использую iFrame для обслуживания содержимого из дерева сборки, созданного PHP. Я не хочу, чтобы дерево (и node видимости) обновлялось всякий раз, когда пользователь хочет просмотреть детали для части/сборки.

Ответ 15

Есть несколько проблем с удобством и доступностью с iframe. Некоторые браузеры и устройства чтения с экрана не могут отображать iframe, поэтому вы должны предоставить альтернативный контент:

<iframe src="content.html">
    <p>
        This content will only be displayed by browsers that do not support
        iframes. You should provide a link to the content, or in your 
        case an alternative way to use your widget.
    </p>
</iframe>

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

Ответ 16

Существует значительная проблема с iframe, которая едва ли упоминается, но которая вызывает у меня начинку.

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

Абсолютно ничего не остановить, чтобы кто-то захватил код iframe из моего источника страницы и перетащил его на свою страницу. Теперь они получают все наши данные, обновленные вплоть до нескольких минут назад, абсолютно ничего не отображали на их странице.

Если google iframe может быть привязан к определенному домену, это остановит его на своих дорожках.

Любые идеи, яркие искры?