Додайте ще один HTML-файл у файл HTML


625

У мене є 2 HTML файли, припустимо , що a.htmlіb.html . В a.htmlя хочу включити b.html.

У JSF я можу це зробити так:

<ui:include src="b.xhtml" />

Це означає, що всередині a.xhtml файлу я можу включити b.xhtml.

Як ми можемо це зробити у *.htmlфайлі?


5
можливий дублікат еквівалента include () у HTML
Wesley Murch

32
НІ! його 2 різні речі!
lolo

пов'язані, але localhost: stackoverflow.com/questions/7542872 / ...
cregox

<object type = "text / html" data = "b.xhtml"> </object>
MarMarAba

Відповіді:


686

На мою думку, найкраще рішення використовує jQuery:

a.html:

<html> 
  <head> 
    <script src="jquery.js"></script> 
    <script> 
    $(function(){
      $("#includedContent").load("b.html"); 
    });
    </script> 
  </head> 

  <body> 
     <div id="includedContent"></div>
  </body> 
</html>

b.html:

<p>This is my include file</p>

Цей метод - це просте і чітке рішення моєї проблеми.

Документація jQuery .load()знаходиться тут .


5
Яка різниця робити саме цей `<script> $ (" # включений контент "). Load (" b.html "); </script>?
Родріго Руїз

10
@RodrigoRuiz виконається $(function(){})лише після завершення завантаження документа.
ПрофК

8
Якщо до включеного HTML-файлу до нього додається CSS, він може зіпсувати стиль вашої сторінки.
Омар Джаафор

6
Я точно такий, як ви згадали. Я використовую завантажувальний інструмент і переписав css для B.html. Коли я використовую B.html в A.html, щоб він закінчувався заголовком A.html, я бачу, що css втратив пріоритет і має інший макет. Будь-які рішення для цього ?.
Pavan Dittakavi

36
Для цього потрібен сервер . Під час використання його у локальному файлі:XMLHttpRequest cannot load file:///.../b.html. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
Basj

155

Розгортаючи відповідь Лоло зверху, ось трохи більше автоматизації, якщо вам доведеться включити багато файлів:

<script>
  $(function(){
    var includes = $('[data-include]');
    jQuery.each(includes, function(){
      var file = 'views/' + $(this).data('include') + '.html';
      $(this).load(file);
    });
  });
</script>

А потім включити щось у html:

<div data-include="header"></div>
<div data-include="footer"></div>

Що включатиме перегляди файлів / header.html та представлення / footer.html


Дуже корисний. Чи є спосіб передати аргумент через інший параметр даних, наприклад, data-argumentі отримати його у включений файл?
chris

@chris Ви можете використовувати параметри GET, наприклад$("#postdiv").load('posts.php?name=Test&age=25');
Nam G VU

5
Невелика пропозиція - вам не потрібна class="include"- просто зробіть свій селектор jQueryvar includes = $('[data-include]');
jbyrd

не працює на хромі з локальними файлами "Перехресні запити підтримуються лише для протокольних схем: https"
Артем Бернацький

2
@ArtemBernatskyi Чи допомагає це, якщо ви замість цього запустите локальний сервер? Ось простий підручник: developer.mozilla.org/en-US/docs/Learn/Common_questions/…
mhanisch

146

Моє рішення схоже на рішення лоло вище. Однак я вставляю HTML-код через JavaScript document.write JavaScript замість jQuery:

a.html:

<html> 
  <body>
  <h1>Put your HTML content before insertion of b.js.</h1>
      ...

  <script src="b.js"></script>

      ...

  <p>And whatever content you want afterwards.</p>
  </body>
</html>

b.js:

document.write('\
\
    <h1>Add your HTML code here</h1>\
\
     <p>Notice however, that you have to escape LF's with a '\', just like\
        demonstrated in this code listing.\
    </p>\
\
');

Причиною проти використання jQuery є те, що розмір jQuery.js має розмір ~ 90 кб, і я хочу, щоб кількість даних для завантаження була якомога меншою.

Для того, щоб отримати належним чином уникнути JavaScript-файл без особливої ​​роботи, ви можете скористатися такою командою sed:

sed 's/\\/\\\\/g;s/^.*$/&\\/g;s/'\''/\\'\''/g' b.html > escapedB.html

Або просто скористайтеся наступним зручним скриптом bash, опублікованим як Gist on Github, який автоматизує всі необхідні роботи, перетворюючись b.htmlна b.js: https://gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6

Подяки Greg Minshall за вдосконалену команду sed, яка також уникає зворотних косих ринків і одинарних лапок, які моя оригінальна команда sed не враховувала.

Крім того, для веб-переглядачів, які підтримують літеральні шаблони, також працює наступне:

b.js:

document.write(`

    <h1>Add your HTML code here</h1>

     <p>Notice, you do not have to escape LF's with a '\',
        like demonstrated in the above code listing.
    </p>

`);

4
@TrevorHickey Так, ти маєш рацію, це недолік мого рішення, і це не дуже елегантно. Однак, як ви можете вставити "\" з простим регулярним виразом в кінці кожного рядка, це найкраще працює для мене. Хм ... можливо, я повинен додати свою відповідь, як зробити вставку за допомогою regex ...
Tafkadasoh

2
О, ше, це некрасиво - не дякую. Я вважаю за краще написати свій html як html. Мені байдуже, чи можу я використовувати команду sed у командному рядку - мені не хочеться покладатися на це щоразу, коли я змінюю вміст шаблону.
jbyrd

1
@Goodra Він повинен працювати на будь-якому HTML-коді без 'позначок. Якщо ви просто робите пошуку / заміни для заміни ` with \ `ТОДІ знайти / замінити замінити 'з \'і нового рядка з` `нового рядка , вона буде прекрасно працювати.
wizzwizz4

1
@ wizzwizz4: Завдяки Грегу, команда sed тепер також уникає одинарних лапок та зворотних косих ринків. Крім того, я додав сценарій bash, який виконує всю роботу за вас. :-)
Тафкадасох

1
Ви можете використовувати зворотні посилання `- тоді ви зможете вставити вирази на зразок ${var}- тоді вам потрібно лише втекти \`і\$
inetphantom

85

Оформити імпорт HTML5 за допомогою підручника Html5rocks та в полімерному проекті

Наприклад:

<head>
  <link rel="import" href="/path/to/imports/stuff.html">
</head>

27
Імпорт HTML не має на увазі фактичного включення вмісту на сторінку безпосередньо. Код у цій відповіді стає stuff.htmlдоступним лише як шаблон на батьківській сторінці, але вам доведеться використовувати сценарії для створення клонів своєї DOM на батьківській сторінці, щоб вони були видимі користувачеві.
waldyrious

1
Інструкції на html5rocks.com щодо вставки вмісту однієї сторінки HTML в іншу, схоже, не працюють у багатьох браузерах. Я спробував це в Opera 12.16 та Superbird Version 32.0.1700.7 (233448) без ефекту (на Xubuntu 15.04). Я чую, що це не працює у Firefox (через помилку, яка, сподіваємось, була виправлена) або багато версій Chrome. Тож, хоча це виглядає як ідеальне рішення в майбутньому, це не крос-браузерне рішення.
Brōtsyorfuzthrāx

1
Мабуть, не готові станом на кінець 2016 року у FireFox (45.5.1 ESR). JS консоль каже: TypeError: ... .import is undefined. MDN каже: "Ця функція наразі не реалізована в будь-яких браузерах". Хтось знає, чи можна створити FF за допомогою цієї функції?
сфакка

3
Firefox не підтримуватиме його. Щоб увімкнути його, спробуйте встановити "dom.webcomponents.enabled". Він працюватиме лише в Chrome і Opera, Android з оновленим веб-переглядом (старт 4.4.3). Браузери Apple не підтримують це. Це виглядає як приємна ідея для веб-компонентів, але ще не широко реалізована.
Максим

9
Оновлення наприкінці 2018 року: імпорт HTML, мабуть, з якихось причин
застаряється

60

Безсоромний штекер бібліотеки, яку я написав, вирішити це.

https://github.com/LexmarkWeb/csi.js

<div data-include="/path/to/include.html"></div>

Вищезгадане візьме вміст /path/to/include.htmlта замінить divйого.


4
Чи буде це оцінювати JavaScript, якщо він включив вбудований JavaScript.html?
Сет

1
@ Здається, це не здається. Я збираюся пограти з src і побачити, чи зможу я це зробити. Завдяки michael-marr
xandout

2
Блискуче !!!! Ваше здається єдиним рішенням, яке ЗАМОВЛЯЄ тег div, який використовується як маркер, куди потрібно вставити. Я буду вивчати джерело уважно пізніше !! :-)
кполлок

1
завдяки цьому працює, він включає HTML / CSS, але не Javascript з вихідних файлів. Вам просто потрібно включити його знову, де б ви не користувалися <div data-include="/path/to/include.html"></div>. Цей інструмент полегшує простий макет із багатосторінкових плагінів чистим способом.
Вінсент Тан

1
чи можу я використовувати цю вкладку в будь-якій програмі? Я маю на увазі, як можна кредитувати автора? У W3School є подібне рішення, лише різниця в тому, що ваш код забезпечує рекурсивний виклик і при завантаженні вікна .... w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
yeppe

43

Проста серверна сторінка включає директиву щодо включення іншого файлу, що знаходиться в тій же папці, виглядає так:

<!--#include virtual="a.html" --> 

21
Вам потрібно налаштувати свій сервер для використання SSI
lolo

7
Ось посилання на налаштування SSI для вашого сервера: httpd.apache.org/docs/2.4/howto/ssi.html#configuring
shasi kanth

Можливо, варто спробувати <!--#include file="a.html" -->також
jimmyjudas

Включення SSI робить Web-сервер набагато повільнішим (цього слід уникати до абсолютної необхідності).
Аміт Верма

36

Немає необхідності в сценаріях. Не потрібно робити будь-яких фантазійних речей на стороні сервера (Тхо, що, мабуть, буде кращим варіантом)

<iframe src="/path/to/file.html" seamless></iframe>

Оскільки старі веб-переглядачі не підтримують безперебійність, вам слід додати css, щоб виправити це:

iframe[seamless] {
    border: none;
}

Майте на увазі, що для веб-переглядачів, які не підтримують безпроблемну функцію, якщо ви натиснете посилання в iframe, це дозволить кадру перейти на цей URL, а не на все вікно. Спосіб подолання - це наявність усіх посилань target="_parent", через підтримку браузера - "достатньо хороший".


7
Схоже, не застосовується, наприклад, стилі css з батьківської сторінки.
Ренді

5
@Randy Так? Це можна вважати плюсом (особливо для створеного користувачем вмісту тощо). Ви можете легко включити файли css будь-коли знову, не роблячи іншого запиту через кешування.
bjb568

Відповів на мої потреби у відповіді на це питання - як включити html-файл до іншого html-файлу ...
Grimxn

2
Це найкраща відповідь БЕЗ JQuery або сценаріїв. Приємний bjb568 дякую!
DBS

12
seamlessАтрибут був видалений з HTML проекту він прийшов. Не використовуйте його.
Мітья

33

Дуже старе рішення я зустрів мої потреби тоді, але ось як це зробити відповідний стандартам код:

<!--[if IE]>
<object classid="clsid:25336920-03F9-11CF-8FD0-00AA00686F13" data="some.html">
<p>backup content</p>
</object>
<![endif]-->

<!--[if !IE]> <-->
<object type="text/html" data="some.html">
<p>backup content</p>
</object>
<!--> <![endif]-->

9
Здається <object>, <embed>і <iframe>всі працюють для цього, але у всіх трьох випадках вони створюють окремі документи зі власним контекстом стилів та сценаріїв (особливо, якщо рамка включає некрасиві рамки та смуги прокрутки), і, наприклад, будь-які посилання за замовчуванням відкриваються всередині них, а не на батьківська сторінка (хоча це може бути замінено на target = "_ parent"). З усіх цих, IFrame є єдиним, який має деяку надію стати більш інтегрованими через HTML5 seamlessатрибут (згаданої bjb568), але це ще не дуже добре підтримується: caniuse.com/#feat=iframe-seamless
waldyrious

2
iframe -amless випало зі стандарту HTML: github.com/whatwg/html/isissue/331 . Тож коментар @waldyrious більше не правильний (ви хочете оновити свій коментар?)
Tomáš Pospíšek

1
Дякую за голову, @ TomášPospíšek. Я не можу більше редагувати свій коментар, але, сподіваюся, ваша відповідь надає необхідний застереження читачам. Щоб було зрозуміло, останнє речення (про seamlessатрибут) є єдиною застарілою частиною - решта все ще діє.
waldyrious

17

Як альтернатива, якщо у вас є доступ до файлу .htaccess на вашому сервері, ви можете додати просту директиву, яка дозволить інтерпретувати php у файлах, що закінчуються розширенням .html.

RemoveHandler .html
AddType application/x-httpd-php .php .html

Тепер ви можете використовувати простий скрипт php для включення інших файлів, таких як:

<?php include('b.html'); ?>

28
Так, це дуже погана порада. Файли Html є статичними, і вони дуже швидко обслуговуються. Якщо ви додасте всі html-файли до PHP-аналізатора просто для файлів inlcude, у вас виникнуть багато проблем із продуктивністю на ваших серверах. Спосіб javascript (jQuery або звичайний JS) - не дуже хороші рішення, але вони все ще є більш ефективними та менш небезпечними, ніж цей.
Gfra54

@ Gfra54 Ви маєте на увазі, що у нас виникнуть проблеми з продуктивністю, якщо ми використовуватимемо Apache лише для цього, і ми не робимо жодної роботи на php для сайту? Або це сповільниться, якщо я буду використовувати php та цю річ разом?
user3459110

1
Увага: Додавання цих рядків .htaccessможе спричинити завантаження htmlсторінок як файли, а не перегляд у браузері. Перевірте спочатку. Відмова: Це якраз зараз сталося зі мною, коли я спробував вищевказане рішення. Моя .htaccessбула порожня за винятком вище двох рядків. Рекомендується обережність. Спробуйте скористатися loloрішенням jQuery (нижче).
cssyphus

людина, я ускладнював себе, хоча я це робив і раніше. Дякуємо за нагадування. Мені це потрібно, це не дуже впливає на продуктивність, тому я крутий.
Гман

Так, ця відповідь на роздум ефективності - дивовижний приклад нестандартного мислення. Я б ніколи цього не пропонував, але, можливо, рятівник, коли вам потрібен швидкий кувалд php. :-)
moodboom

14

Наступні роботи, якщо вміст html-файлу з якогось файлу потрібно включити: Наприклад, наступний рядок буде містити вміст piece_to_include.html у тому місці, де відбувається визначення OBJECT.

...text before...
<OBJECT data="file_to_include.html">
Warning: file_to_include.html could not be included.
</OBJECT>
...text after...

Довідка: http://www.w3.org/TR/WD-html40-970708/struct/includes.html#h-7.7.4


2
Працює як шарм, і це найчистіше рішення. Це має бути прийнятою відповіддю.
vbocan

Погодьтеся. Всього одна примітка: не намагайтеся робити тег об’єктів, що закриваються. Текст після нього буде стертий.
Шрідхар Сарнобат

Здається, створюється новий "#document", який автоматично містить нові, вкладені теги <html> та <body>. Це не спрацювало за моєю метою; мій файл .html містить теги <script src = "..." type = "text / javascript">; але JS отримав нові посилання на помилки.
IAM_AL_X

12

Ось моє місцеве рішення:

(() => {
    const includes = document.getElementsByTagName('include');
    [].forEach.call(includes, i => {
        let filePath = i.getAttribute('src');
        fetch(filePath).then(file => {
            file.text().then(content => {
                i.insertAdjacentHTML('afterend', content);
                i.remove();
            });
        });
    });
})();
<p>FOO</p>

<include src="a.html">Loading...</include>

<p>BAR</p>

<include src="b.html">Loading...</include>

<p>TEE</p>


1
Уау, простіше
Arian saputra

Дійсно приємне та просте рішення, дякую ^^
Remling

11

У w3.js включайте такі роботи:

<body>
<div w3-include-HTML="h1.html"></div>
<div w3-include-HTML="content.html"></div>
<script>w3.includeHTML();</script>
</body>

Для правильного опису подивіться це: https://www.w3schools.com/howto/howto_html_include.asp


Якщо ви хочете знати, коли документ завантажено, ви можете покласти це в кінці документа: <img src = "thisimagedoesnotexist.dmy" onerror = 'initDocument ()' style = 'display: none;'> Розумний трюк , а?
Кей Рісберг

2
не працює з Google Chrome.
deepcell

9

Це мені допомогло. Для додавання блоку html-коду від b.htmlдо a.html, він повинен увійти в headтег a.html:

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>

Потім у тезі тіла робиться контейнер з унікальним ідентифікатором та блоком javascript для завантаження b.htmlв контейнер таким чином:

<div id="b-placeholder">

</div>

<script>
$(function(){
  $("#b-placeholder").load("b.html");
});
</script>

5
Чим ця відповідь відрізняється від прийнятої відповіді на це запитання?
Мохаммед Усман

1
@MohammadUsman Тут контейнер та код JavaScript лежать у тезі body, тоді як прийнята відповідь розміщує їх у тезі head та залишає контейнер лише у тезі body.
Рамтін

Нової відповіді це не варто ... це коментар
Кеннет Селест

8

Я знаю, що це дуже стара публікація, тому деякі методи тоді ще не були доступні. Але ось мій дуже простий погляд на це (на основі відповіді Лоло).

Він покладається на атрибути HTML5 data- * і тому є дуже загальним у тому, що використовує jQuery для кожної функції, щоб отримати кожен .class, що відповідає "load-html", і використовує відповідний атрибут "джерело даних" для завантаження вмісту:

<div class="container-fluid">
    <div class="load-html" id="NavigationMenu" data-source="header.html"></div>
    <div class="load-html" id="MainBody" data-source="body.html"></div>
    <div class="load-html" id="Footer" data-source="footer.html"></div>
</div>
<script src="js/jquery.min.js"></script>
<script>
$(function () {
    $(".load-html").each(function () {
        $(this).load(this.dataset.source);
    });
});
</script>

7

Ви можете використовувати полізаповнення імпортів HTML ( https://www.html5rocks.com/en/tutorials/webcomponents/imports/ ) або спрощене рішення https://github.com/dsheiko/html-import

Наприклад, на сторінці ви імпортуєте такий блок HTML:

<link rel="html-import" href="./some-path/block.html" >

Блок може мати власний імпорт:

<link rel="html-import" href="./some-other-path/other-block.html" >

Імпортер замінює директиву завантаженим HTML майже як SSI

Ці директиви будуть подані автоматично, як тільки ви завантажите цей невеликий JavaScript:

<script async src="./src/html-import.js"></script>

Він обробить імпорт, коли DOM буде готовий автоматично. Крім того, він відкриває API, який ви можете використовувати для запуску вручну, для отримання журналів тощо. Насолоджуйтесь :)


Куди повинен піти рядок сценарію в html-файлі?
Ендрю Truckle

В будь-якому місці в BODY. Можна розміщувати рекурсивно у вмісті файлів, що включені
Дмитро Шейко

Ви тестували це?
Bhikkhu Subhuti

Звичайно, я. Я його фактично використовую роками. Чому питати? Якісь проблеми?
Дмитро Шейко

Тому "ключовим" у цьому є те, script async srcщо здається. Спробуйте це!
javadba

6

Більшість рішень працює, але у них проблеми з jquery :

Проблема полягає в наступному коді $(document).ready(function () { alert($("#includedContent").text()); } не сповіщає нічого, а не попереджати вміст, що входить.

Я пишу код нижче, у моєму рішенні ви можете отримати доступ до включеного вмісту $(document).ready функції:

(Ключ завантажує включений вміст синхронно).

index.htm :

<html>
    <head>
        <script src="jquery.js"></script>

        <script>
            (function ($) {
                $.include = function (url) {
                    $.ajax({
                        url: url,
                        async: false,
                        success: function (result) {
                            document.write(result);
                        }
                    });
                };
            }(jQuery));
        </script>

        <script>
            $(document).ready(function () {
                alert($("#test").text());
            });
        </script>
    </head>

    <body>
        <script>$.include("include.inc");</script>
    </body>

</html>

include.inc :

<div id="test">
    There is no issue between this solution and jquery.
</div>

jquery включає плагін на github


Використовуючи це та переглядаючи джерело сторінки з браузера, ви бачите лише сценарій. Це не впливає на можливість пошукових систем розбирати ваш сайт, в кінцевому рахунку знищуючи будь-які зусилля SEO?
hmcclungiii

Так, цей метод знищує будь-яку SEO :)
Амір Саніян

Знову ж таки, кожен метод на основі JavaScript робить це.
wizzwizz4

5

Щоб вставити вміст названого файлу:

<!--#include virtual="filename.htm"-->

1
використовуючи кутові дужки для []: [! - # include virtual = "include_omega.htm" -]
St.Eve

4

Відповідь Афарі (перша!) Була надто переконливою! Дуже добре!

Але якщо ви хочете передати ім’я сторінки, яка буде включена як параметр URL , ця публікація має дуже приємне рішення, яке можна використовувати в поєднанні з:

http://www.jquerybyexample.net/2012/06/get-url-parameters-using-jquery.html

Тож стає щось подібне:

Ваша URL-адреса:

www.yoursite.com/a.html?p=b.html

Код a.html тепер стає:

<html> 
  <head> 
    <script src="jquery.js"></script> 
    <script> 
    function GetURLParameter(sParam)
    {
      var sPageURL = window.location.search.substring(1);
      var sURLVariables = sPageURL.split('&');
      for (var i = 0; i < sURLVariables.length; i++) 
      {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam) 
        {
            return sParameterName[1];
        }
      }
    }​
    $(function(){
      var pinc = GetURLParameter('p');
      $("#includedContent").load(pinc); 
    });
    </script> 
  </head> 

  <body> 
     <div id="includedContent"></div>
  </body> 
</html>

Це працювало дуже добре для мене! Сподіваюся, допомогли :)


Проблема безпеки, тому що ви можете комусь надіслати це посилання: www.yoursite.com/a.html?p=htttp://www.linktovir.us/here.html
JoostS

4

html5rocks.com має дуже хороший підручник з цього матеріалу, і це може бути трохи пізно, але я сам не знав, що це існує. w3schools також має спосіб це зробити, використовуючи свою нову бібліотеку під назвою w3.js. Вся справа в тому, що для цього потрібне використання веб-сервера та об’єкта HTTPRequest. Ви не можете фактично завантажити їх локально та протестувати їх на своїй машині. Що ви можете зробити, це використовувати поліфауни, що надаються на посиланні html5rocks вгорі, або дотримуйтесь їх посібника. За допомогою невеликої магії JS ви можете зробити щось подібне:

 var link = document.createElement('link');
 if('import' in link){
     //Run import code
     link.setAttribute('rel','import');
     link.setAttribute('href',importPath);
     document.getElementsByTagName('head')[0].appendChild(link);
     //Create a phantom element to append the import document text to
     link = document.querySelector('link[rel="import"]');
     var docText = document.createElement('div');
     docText.innerHTML = link.import;
     element.appendChild(docText.cloneNode(true));
 } else {
     //Imports aren't supported, so call polyfill
     importPolyfill(importPath);
 }

Це зробить посилання (може змінитись як шуканий елемент посилання, якщо воно вже встановлено), встановити імпорт (якщо у вас його вже немає), а потім додати його. Тоді він звідти візьме це і проаналізує файл у HTML, а потім додасть його до потрібного елемента під ділом. Це все можна змінити відповідно до ваших потреб від додаючого елемента до посилання, яке ви використовуєте. Я сподіваюся, що це допомогло, і це може бути неактуально зараз, якщо з’являться новіші, більш швидкі способи без використання бібліотек та фреймворків, таких як jQuery або W3.js.

ОНОВЛЕННЯ: Це призведе до помилки про те, що локальний імпорт був заблокований політикою CORS. Можливо, потрібен доступ до глибокої веб-сторінки, щоб мати можливість використовувати це через властивості глибокої веб-сторінки. (Означає відсутність практичного використання)


4

Ось мій підхід із використанням програми Fetch API та функції асинхронізації

<div class="js-component" data-name="header" data-ext="html"></div>
<div class="js-component" data-name="footer" data-ext="html"></div>

<script>
    const components = document.querySelectorAll('.js-component')

    const loadComponent = async c => {
        const { name, ext } = c.dataset
        const response = await fetch(`${name}.${ext}`)
        const html = await response.text()
        c.innerHTML = html
    }

    [...components].forEach(loadComponent)
</script>

3

Наразі немає прямого рішення HTML для завдання. Навіть імпорт HTML (який постійно знаходиться в чернеті ) нічого не зробить, тому що Import! = Включити і будь-яку магію JS буде потрібно в будь-якому випадку.
Я недавно написав в VanillaJS сценарій , який як раз для включення HTML в HTML, без яких - або ускладнень.

Просто розмістіть у своєму a.html

<link data-wi-src="b.html" />
<!-- ... and somewhere below is ref to the script ... -->
<script src="wm-html-include.js"> </script>  

Це є open-sourceі може дати ідею (сподіваюся)


3

Це можна зробити з бібліотекою JavaScript jQuery таким чином:

HTML:

<div class="banner" title="banner.html"></div>

JS:

$(".banner").each(function(){
    var inc=$(this);
    $.get(inc.attr("title"), function(data){
        inc.replaceWith(data);
    });
});

Зауважте, що вони banner.htmlповинні розташовуватися під тим самим доменом, що і інші ваші сторінки, інакше веб-сторінки відмовляться від banner.htmlфайлу через політику спільного використання ресурсів .

Також зауважте, що якщо ви завантажите свій вміст JavaScript, Google не зможе його проіндексувати, тому це не зовсім хороший метод з причин SEO.


2

Ви пробували ін'єкцію iFrame?

Він вводить iFrame в документ і видаляє себе (це повинен бути тоді в HTML DOM)

<iframe src="header.html" onload="this.before((this.contentDocument.body||this.contentDocument).children[0]);this.remove()"></iframe>

З повагою


1

Я підійшов до цієї теми, шукаючи щось подібне, але трохи відмінне від проблеми, яку ставить лоло. Я хотів побудувати HTML-сторінку, що містить алфавітне меню посилань на інші сторінки, і кожна з інших сторінок може бути або не існувати, і порядок їх створення може бути не в алфавітному порядку (ані навіть числовим). Також, як і Tafkadasoh, я не хотів роздувати веб-сторінку jQuery. Після дослідження проблеми та експериментів протягом декількох годин, ось що для мене спрацювало, додавши відповідні зауваження:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/application/html; charset=iso-8859-1">
  <meta name="Author" content="me">
  <meta copyright="Copyright" content= "(C) 2013-present by me" />
  <title>Menu</title>

<script type="text/javascript">
<!--
var F000, F001, F002, F003, F004, F005, F006, F007, F008, F009,
    F010, F011, F012, F013, F014, F015, F016, F017, F018, F019;
var dat = new Array();
var form, script, write, str, tmp, dtno, indx, unde;

/*
The "F000" and similar variables need to exist/be-declared.
Each one will be associated with a different menu item,
so decide on how many items maximum you are likely to need,
when constructing that listing of them.  Here, there are 20.
*/


function initialize()
{ window.name="Menu";
  form = document.getElementById('MENU');
  for(indx=0; indx<20; indx++)
  { str = "00" + indx;
    tmp = str.length - 3;
    str = str.substr(tmp);
    script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = str + ".js";
    form.appendChild(script);
  }

/*
The for() loop constructs some <script> objects
and associates each one with a different simple file name,
starting with "000.js" and, here, going up to "019.js".
It won't matter which of those files exist or not.
However, for each menu item you want to display on this
page, you will need to ensure that its .js file does exist.

The short function below (inside HTML comment-block) is,
generically, what the content of each one of the .js files looks like:
<!--
function F000()
{ return ["Menu Item Name", "./URLofFile.htm", "Description string"];
}
-->

(Continuing the remarks in the main menu.htm file)
It happens that each call of the form.appendChild() function
will cause the specified .js script-file to be loaded at that time.
However, it takes a bit of time for the JavaScript in the file
to be fully integrated into the web page, so one thing that I tried,
but it didn't work, was to write an "onload" event handler.
The handler was apparently being called before the just-loaded
JavaScript had actually become accessible.

Note that the name of the function in the .js file is the same as one
of the the pre-defined variables like "F000".  When I tried to access
that function without declaring the variable, attempting to use an
"onload" event handler, the JavaScript debugger claimed that the item
was "not available".  This is not something that can be tested-for!
However, "undefined" IS something that CAN be tested-for.  Simply
declaring them to exist automatically makes all of them "undefined".
When the system finishes integrating a just-loaded .js script file,
the appropriate variable, like "F000", will become something other
than "undefined".  Thus it doesn't matter which .js files exist or
not, because we can simply test all the "F000"-type variables, and
ignore the ones that are "undefined".  More on that later.

The line below specifies a delay of 2 seconds, before any attempt
is made to access the scripts that were loaded.  That DOES give the
system enough time to fully integrate them into the web page.
(If you have a really long list of menu items, or expect the page
to be loaded by an old/slow computer, a longer delay may be needed.)
*/

  window.setTimeout("BuildMenu();", 2000);
  return;
}


//So here is the function that gets called after the 2-second delay  
function BuildMenu()
{ dtno = 0;    //index-counter for the "dat" array
  for(indx=0; indx<20; indx++)
  { str = "00" + indx;
    tmp = str.length - 3;
    str = "F" + str.substr(tmp);
    tmp = eval(str);
    if(tmp != unde) // "unde" is deliberately undefined, for this test
      dat[dtno++] = eval(str + "()");
  }

/*
The loop above simply tests each one of the "F000"-type variables, to
see if it is "undefined" or not.  Any actually-defined variable holds
a short function (from the ".js" script-file as previously indicated).
We call the function to get some data for one menu item, and put that
data into an array named "dat".

Below, the array is sorted alphabetically (the default), and the
"dtno" variable lets us know exactly how many menu items we will
be working with.  The loop that follows creates some "<span>" tags,
and the the "innerHTML" property of each one is set to become an
"anchor" or "<a>" tag, for a link to some other web page.  A description
and a "<br />" tag gets included for each link.  Finally, each new
<span> object is appended to the menu-page's "form" object, and thereby
ends up being inserted into the middle of the overall text on the page.
(For finer control of where you want to put text in a page, consider
placing something like this in the web page at an appropriate place,
as preparation:
<div id="InsertHere"></div>
You could then use document.getElementById("InsertHere") to get it into
a variable, for appending of <span> elements, the way a variable named
"form" was used in this example menu page.

Note: You don't have to specify the link in the same way I did
(the type of link specified here only works if JavaScript is enabled).
You are free to use the more-standard "<a>" tag with the "href"
property defined, if you wish.  But whichever way you go,
you need to make sure that any pages being linked actually exist!
*/

  dat.sort();
  for(indx=0; indx<dtno; indx++)
  { write = document.createElement('span');
    write.innerHTML = "<a onclick=\"window.open('" + dat[indx][1] +
                      "', 'Menu');\" style=\"color:#0000ff;" + 
                      "text-decoration:underline;cursor:pointer;\">" +
                      dat[indx][0] + "</a> " + dat[indx][2] + "<br />";
    form.appendChild(write);
  }
  return;
}

// -->
</script>
</head>

<body onload="initialize();" style="background-color:#a0a0a0; color:#000000; 

font-family:sans-serif; font-size:11pt;">
<h2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MENU
<noscript><br /><span style="color:#ff0000;">
Links here only work if<br />
your browser's JavaScript<br />
support is enabled.</span><br /></noscript></h2>
These are the menu items you currently have available:<br />
<br />
<form id="MENU" action="" onsubmit="return false;">
<!-- Yes, the <form> object starts out completely empty -->
</form>
Click any link, and enjoy it as much as you like.<br />
Then use your browser's BACK button to return to this Menu,<br />
so you can click a different link for a different thing.<br />
<br />
<br />
<small>This file (web page) Copyright (c) 2013-present by me</small>
</body>
</html>

1

Ось чудова стаття. Ви можете реалізувати загальну бібліотеку і просто використовувати нижче код, щоб імпортувати будь-які HTML-файли в одному рядку.

<head>
   <link rel="import" href="warnings.html">
</head>

Ви також можете спробувати Google Polymer


6
"просто використовувати код нижче, щоб імпортувати будь-які HTML-файли в один рядок" є досить обережним. Потім ви повинні написати деякий JS, щоб використовувати будь-який імпортний вміст, так що в кінцевому підсумку це набагато більше, ніж "один рядок".
skybondsor

1

Використання ES6 задніх рядків ``: літерали шаблонів !

let nick = "Castor", name = "Moon", nuts = 1

more.innerHTML = `

<h1>Hello ${nick} ${name}!</h1>

You collected ${nuts} nuts so far!

<hr>

Double it and get ${nuts + nuts} nuts!!

` 
<div id="more"></div>

Таким чином ми можемо включати html без кодування лапок, включати змінні з DOM тощо.

Це потужний механізм створення шаблонів, ми можемо використовувати окремі js-файли та використовувати події для завантаження вмісту на місце, або навіть розділити все на шматки та зателефонувати на вимогу:

let inject = document.createElement('script');
inject.src= '//....com/template/panel45.js';
more.appendChild(inject);

https://caniuse.com/#feat=template-literals


1
Гарний приклад - чому немає оновлень (до цих пір)?
javadba

Гей, ви праві, 2018 рік вище був явним ознакою справді доброго RTFM;) Я багато в чому розтрощив цей javascriptзнак як програму хобі до цього часу.
NVRM

1

Для роботи рішення потрібно включити файл csi.min.js, який ви можете знайти тут .

Відповідно до прикладу, показаного на GitHub, для використання цієї бібліотеки ви повинні включити файл csi.js у свій заголовок сторінки, тоді вам потрібно додати атрибут data-include з його значенням до файлу, який ви хочете включити, у контейнер елемент.

Сховати копію коду

<html>
  <head>
    <script src="csi.js"></script>
  </head>
  <body>
    <div data-include="Test.html"></div>
  </body>
</html>

... сподіваюся, що це допомагає.


0

PHP - це сценарна мова серверного рівня. Це може зробити багато речей, але одне популярне використання - це включення HTML-документів у ваші сторінки, приблизно так само, як SSI. Як і SSI, це технологія на рівні сервера. Якщо ви не впевнені, чи функціонує PHP на своєму веб-сайті, зв’яжіться зі своїм постачальником хостингу.

Ось простий скрипт PHP, який ви можете використовувати для включення фрагмента HTML на будь-яку веб-сторінку з підтримкою PHP:

Збережіть HTML для загальних елементів вашого сайту, щоб розділити файли. Наприклад, ваш розділ навігації може бути збережено як navigation.html або navigation.php. Використовуйте наступний код PHP, щоб включити цей HTML на кожну сторінку.

<?php require($DOCUMENT_ROOT . "navigation.php"); ?>

Використовуйте той самий код на кожній сторінці, до якої потрібно включити файл. Не забудьте змінити виділене ім’я файлу на ім'я та шлях до вашого файлу включення.


0

Якщо ви використовуєте якусь рамку, наприклад, django / bootle, вони часто постачають деякий шаблон двигуна. Скажімо, ви використовуєте флакон, а двигуном шаблону за замовчуванням є SimpleTemplate Engine . А нижче чистий файл html

$ cat footer.tpl
<hr> <footer>   <p>&copy; stackoverflow, inc 2015</p> </footer>

Ви можете включити footer.tpl у свій основний файл, наприклад:

$ cat dashboard.tpl
%include footer

Крім того, ви можете також передати параметр своєму dashborard.tpl.


0

На основі відповіді https://stackoverflow.com/a/31837264/4360308 я реалізував цю функціональність з Nodejs (+ express + cheerio) наступним чином:

HTML (index.html)

<div class="include" data-include="componentX" data-method="append"></div>
<div class="include" data-include="componentX" data-method="replace"></div>

JS

function includeComponents($) {
    $('.include').each(function () {
        var file = 'view/html/component/' + $(this).data('include') + '.html';
        var dataComp = fs.readFileSync(file);
        var htmlComp = dataComp.toString();
        if ($(this).data('method') == "replace") {
            $(this).replaceWith(htmlComp);
        } else if ($(this).data('method') == "append") {
            $(this).append(htmlComp);
        }
    })
}

function foo(){
    fs.readFile('./view/html/index.html', function (err, data) {
        if (err) throw err;
        var html = data.toString();
        var $ = cheerio.load(html);
        includeComponents($);
        ...
    }
}

append -> включає вміст у div

Замінити -> замінює дів

ви могли легко додати більше поведінки, слідуючи тому ж дизайну

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.