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


18

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

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

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


Разве внешние сущности уже не дают вам это?
— Питер Тейлор

Трансклюзия считалась основной особенностью гипертекста даже после его изобретения в 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 будут во всех отношениях превосходить.


5
На самом деле, клиент (или прокси-сервер) может кэшировать более эффективно, поскольку шаблоны (или заголовок / нижний колонтитул) не имеют тенденцию изменяться от страницы к странице, что означает, что пользователь, по крайней мере, сможет увидеть часть страницы, хотя некоторые обработка на стороне сервера продолжается.
— Алан Пирс

1
Это сделало бы значительно больше, чем сервер. Я не уверен, почему это должно было бы заблокировать загрузку страницы, это могло бы позволить полную загрузку страницы с асинхронным заполнением контента. Конечно, браузеры могут ограничивать разрешение только на извлечение из исходных серверов или разрешать доменный DOM.
— Jé Queue

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

Вы можете попытаться получить банковскую страницу на стороне сервера, но ваш запрос не будет аутентифицирован, поэтому вы не сможете загрузить какую-либо сочную информацию. Запрос со стороны клиента включает файлы cookie и токены аутентификации HTTP; если вы можете прочитать ответ на такой запрос, вы можете полностью выдать себя за пользователя.
— 2010 года

@bobince: Есть ли какая-то причина, по которой в запрос на стороне клиента должны входить файлы cookie и токены аутентификации HTTP? Основной сценарий использования, который я видел бы для включений на стороне клиента, заключался бы в улучшении кэширования статического содержимого страницы. Если все шестнадцать страниц содержат одинаковые верхний и нижний колонтитулы, использование клиентского включения увеличит время, необходимое для загрузки первой, но уменьшит время загрузки оставшихся пятнадцати. Случаи использования, в которых включение было бы наиболее полезным, были бы именно такими, где данные, которые должны быть «включены», были бы статичными и, следовательно, не нуждались ...
— Supercat

10

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

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


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


Ваш ответ - единственный, который, кажется, поразил гвоздь в голову. Вы думаете о чем-то вроде #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.
— Томаш Поспишек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.