Почему нет HTML-тега на стороне клиента?

18

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

В частности, с тегом, который инструктировал браузер включать дополнительный HTML из других источников. например<include src="http://server/foo/bar.html"> . Многие люди будут делать вызовы javascript и заполнять их, innerHTMLчтобы выполнить то же самое, когда то же самое вне механизма javascript может быть выполнено браузером.

Было бы больно иметь вложенные <HTML>s <BODY>(то есть), но мы все равно должны рассмотреть этот аспект где угодно.

Jé Queue
источник
Разве внешние сущности уже не дают вам это?
Питер Тейлор
Трансклюзия считалась основной особенностью гипертекста даже после его изобретения в 60-х годах. Так что я уверен, что это было рассмотрено ...
Алекс Фейнман

Ответы:

12

Я последний человек на земле, который помнит (только для Netscape 4 ) layerи ilayerтеги?

Netscape 4 также позволилdiv тегу иметьsrc атрибут, который совершил то же самое.

Netscape отправил их W3C, который решил не включать их - используйте iframeвместо этого.

Дори
источник
Я действительно помню NS4, но не помню эти функции. Жаль, я все еще доволен, что это спасло бы много кросс-браузерного JavaScript на BS.
Jé Queue
Я помню, как ненавидел NS4 с такой страстью, что одним из моих первых адресов электронной почты, не принадлежащих Интернет-провайдеру, была бесплатная учетная запись на ihatenetscape.com. Ах, хорошие времена: D
wildpeaks
Слои примечаний не были полностью включены на стороне клиента, поскольку у них все еще был отдельный documentобъект, на который распространяется та же политика происхождения; они были эффективно позиционируемым iframe.
Бобинц
14

Почему тег включения на стороне браузера никогда не рассматривался? Или это было?

Это, безусловно, было запрошено каждым новичком в сети, который еще не разработал Server Side Includes, еще в первые дни в списке www-html. Но в те дни W3 были рады полностью игнорировать давление веб-авторов.

Если бы было разрешено включение между сайтами, это было бы катастрофой для безопасности. Вы можете извлечь страницу из банка пользователя и прочитать с нее содержимое. (Первоначально сценарии DOM были ограничены, но вы все равно могли читать из них document.links, document.imagesфункции сценариев отбрасывались на целевой странице и т. Д. С тех пор вы можете делать то, что вам нравится, с импортированным контентом.)

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

bobince
источник
5
На самом деле, клиент (или прокси-сервер) может кэшировать более эффективно, поскольку шаблоны (или заголовок / нижний колонтитул) не имеют тенденцию изменяться от страницы к странице, что означает, что пользователь, по крайней мере, сможет увидеть часть страницы, хотя некоторые обработка на стороне сервера продолжается.
Алан Пирс
1
Это сделало бы значительно больше, чем сервер. Я не уверен, почему это должно было бы заблокировать загрузку страницы, это могло бы позволить полную загрузку страницы с асинхронным заполнением контента. Конечно, браузеры могут ограничивать разрешение только на извлечение из исходных серверов или разрешать доменный DOM.
Jé Queue
Я не понимаю, как это катастрофа безопасности. Я могу сейчас прочитать банковскую страницу на стороне сервера и выложить ее на другую страницу - это катастрофа? Возможно, но, конечно, не связанный с безопасностью. Бедствие безопасности будет читать куки из другого домена. Без этой клиентской стороны include будет точно таким же, как серверная. Не вижу здесь никаких проблем.
Serg
Вы можете попытаться получить банковскую страницу на стороне сервера, но ваш запрос не будет аутентифицирован, поэтому вы не сможете загрузить какую-либо сочную информацию. Запрос со стороны клиента включает файлы cookie и токены аутентификации HTTP; если вы можете прочитать ответ на такой запрос, вы можете полностью выдать себя за пользователя.
2010 года
@bobince: Есть ли какая-то причина, по которой в запрос на стороне клиента должны входить файлы cookie и токены аутентификации HTTP? Основной сценарий использования, который я видел бы для включений на стороне клиента, заключался бы в улучшении кэширования статического содержимого страницы. Если все шестнадцать страниц содержат одинаковые верхний и нижний колонтитулы, использование клиентского включения увеличит время, необходимое для загрузки первой, но уменьшит время загрузки оставшихся пятнадцати. Случаи использования, в которых включение было бы наиболее полезным, были бы именно такими, где данные, которые должны быть «включены», были бы статичными и, следовательно, не нуждались ...
Supercat
10

Они сделали. Это стало <frameset>тегом. Вскоре они добавили <iframe>тег.

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

greyfade
источник
4
Не совсем кадры служат совсем другой цели, чем включение. Кроме того, ограничения на фреймы, особенно в размере набора объектов, несомненно, не могли бы занять его место.
Jé Queue
5
Я не согласен - я думаю, что это именно то, что делают кадры. Для чего еще нужны фреймы, кроме включения большего количества HTML?
Жак Преториус
5
Фреймы включают в себя HTML, а не напрямую - в этом разница.
Барбекю
4
@Xepoch: ... с <iframe>. Вот что это за . Это действительно не сильно отличается от <div>сoverflow:auto;
Greyfade
3
Элемент <iframe> в основном говорит: «загрузите указанный HTML-документ и вставьте его сюда». Вы бы выбрали его вместо ajax, если хотите, чтобы документ загружался немедленно, а не при вызове javascript ... Кадры НЕ являются оконным макетом HTML. Div, p, br - это все элементы, используемые для разметки. Вы не используете рамки для макета (или вы не должны в любом случае).
Жак Преториус
3

Объект по-прежнему отображается в кадре, и у вас нет доступа DOM к «данным». То, что разработчики должны были дать несколько лет назад, это способ включить фрагменты с простым тегом. Даже если у этого тега есть ограничения в изолированной программной среде домена, было бы весьма полезно разделить функции, улучшить обслуживание и воспользоваться кэшированием браузера.

Я знаю, что есть много хороших плагинов jquery, которые делают это, и множество серверных сценариев, но нет веских причин не поддерживать такой тег. ИМО, это хороший вопрос "Почему нет клиентского тега включения?"

Если вам нравится jquery, вот хороший клиентский сценарий включения: inc: очень тонкий клиентский плагин jQuery

Jonas
источник
Ваш ответ - единственный, который, кажется, поразил гвоздь в голову. Вы думаете о чем-то вроде #include в C? Для меня это именно то, что означает «включение на стороне клиента» - средство для включения произвольных фрагментов HTML (а не целых документов HTML) в документ HTML в качестве целостного содержимого документа. Хотя он может быть спроектирован как неотъемлемая особенность HTML, а не как этап предварительного синтаксического анализа - предложенный синтаксис <include src = "..."> будет подходящим для этого.
Стюарт
Проблема с добавлением этого сейчас будет обратной совместимостью. Конечно, это не объясняет, почему он не был включен в оригинальный дизайн HTML.
Стюарт
В качестве альтернативы он мог бы быть спроектирован как функция SGML / XML в более общем смысле ...
Стюарт,
2

Ты пробовала

<object  type="text/html" data="page.html" height="500" width="500">
What I see if that didn't work 
</object>

Я думаю, что это реализовано в большинстве браузеров.

Питер Тернер
источник
Надо будет попробовать.
Jé Queue
2

Варианты <include>тега действительно рассматривались в ранней истории HTML , но они никогда не заходили слишком далеко.

наряжать
источник
1
Однако семантика этого тега <include> была похожа на семантику сегодняшнего фрейма / iframe / объекта - он включал бы html- документ , а не просто фрагменты текста / кода или случайные теги, как в #include C.
Томаш Поспишек