Зробіть, щоб файли заголовків і колонтитулів включалися до кількох HTML-сторінок


140

Я хочу створити загальні сторінки заголовків і колонтитулів, які містяться на кількох html-сторінках.

Я хотів би використовувати JavaScript. Чи можна це зробити за допомогою лише html та JavaScript?

Я хочу завантажити сторінку заголовка і колонтитула на іншу сторінку html.


1
Ви шукаєте ajax ... $ ('. MyElement) .load (' urltopage.html '); це завантажить вміст urltopage.html в .myElement
— Salketer

Відповіді:


192

Ви можете досягти цього за допомогою jquery .

Помістіть цей код у index.html

<html>
<head>
<title></title>
<script
    src="https://code.jquery.com/jquery-3.3.1.js"
    integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
    crossorigin="anonymous">
</script>
<script> 
$(function(){
  $("#header").load("header.html"); 
  $("#footer").load("footer.html"); 
});
</script> 
</head>
<body>
<div id="header"></div>
<!--Remaining section-->
<div id="footer"></div>
</body>
</html>

і введіть цей код у header.htmlі footer.htmlв тому самому місці, де іindex.html

<a href="http://www.google.com">click here for google</a>

Тепер, коли ви відвідуєте index.html, ви повинні мати можливість натискати теги посилань.


Так. всі сторінки повинні мати цю структуру сторінки
— Hariprasad Prolanx

19
завантаження чи інша функція, яка імпортує або використовує local fileне працює в новій версії Google Chrome або IE, причина: безпека!
— Сінак

7
Іноді мені цікаво, як люди можуть навіть дихати без jQuery. Або є .breathe(in)і .breathe(out)вже? Будь-яка мова сценаріїв тут є чистою надмірністю.
— Конспірація

6
Я продовжую отримувати, Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.коли біжу в хромі
— digiwebguy

1
Потрібно запустити код на сервері. Що означає, що URL-адреса має бути схожою на "http: // .....".
— Патріотичний

37

Я додаю загальні частини як колонтитул і колонтитул, використовуючи сервер Side Side Includes . Ні HTML, ні JavaScript не потрібні. Натомість веб-сервер автоматично додає включений код, перш ніж робити щось інше.

Просто додайте наступний рядок, куди ви хочете включити свій файл:

<!--#include file="include_head.html" -->

6
мені подобається цей старомодний спосіб. Насправді, мабуть, не так багато переваг, використовуючи скрипт, щоб зробити таку просту дію.
— Дженна Ліф

3
Насправді, включаючи файли, що використовують сценарій, є основні недоліки: це заважає продуктивності, оскільки клієнту потрібно завантажити головну сторінку, завантажити DOM, запустити скрипт і лише після цього можна завантажити додані файли, для чого потрібен додатковий запит сервера на включений файл . Включення файлів за допомогою сервера Side Includes обслуговує всі елементи під час першого запиту сервера, клієнтські дії не потрібні.
— Конспірація

SSI вимагає використання розширення файлу: .shtml, .stm, .shtm. Вона працює в Apache, LiteSpeed, nginx, lighttpd та IIS.
— ubershmekel

@ubershmekel Як ви вже говорили, відповідні веб-сервери підтримують SSI. Розширення файлу не обмежено .shtml, .stmі .shtm: В IIS, все згенеровані файли можуть містити SSI, наприклад .aspx. Якщо ви працюєте з PHP, вам потрібно використовувати PHP includeабо virtualкоманду замість цього, щоб досягти того ж результату.
— змова

32

Потрібно використовувати HTML-структуру файлів із JavaScript? Чи розглядали ви замість цього PHP, щоб ви могли використовувати прості PHP-об'єкти?

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

<?php include('header.php'); ?>

Зробіть те ж саме у нижньому колонтитулі кожної сторінки, щоб включити вміст у файл footer.php

<?php include('footer.php'); ?>

Не потрібно JavaScript / Jquery або додаткові файли, що додаються.

Примітка. Ви також можете конвертувати ваші .html-файли у .php-файли, використовуючи наступне у вашому .htaccess-файлі

# re-write html to php
RewriteRule ^(.*)\.html$ $1.php [L]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]


# re-write no extension to .php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

2
@ Justin808 - ОП нічого не згадує про локальну установку, тому я припускав, що він говорить про файли на сервері.
— Сол

1
@Sol Однак у OP DID конкретно згадується про те, що потрібно використовувати Javascript, тому ваша відповідь поза темою. Повна стека веб-розробка швидко відходить від використання PHP, Node.js забезпечує всі еквівалентні функціональні можливості і вимагає використання лише Javascript. TL; DR, будь ласка, відповідайте на запитання, як задали. ОП хотіла рішення JS, тому давати йому рішення PHP, Ruby, Python, C ++ або будь-яку іншу мову недоцільно.
— Зак

9

Я спробував це: Створіть файл header.html як

<!-- Meta -->
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<!-- JS -->
<script type="text/javascript" src="js/lib/jquery-1.11.1.min.js" ></script>
<script type="text/javascript" src="js/lib/angular.min.js"></script>
<script type="text/javascript" src="js/lib/angular-resource.min.js"></script>
<script type="text/javascript" src="js/lib/angular-route.min.js"></script>
<link rel="stylesheet" href="css/bootstrap.min.css">

<title>Your application</title>

Тепер включіть header.html на свої HTML сторінки, наприклад:

<head>
   <script type="text/javascript" src="js/lib/jquery-1.11.1.min.js" ></script>
   <script> 
     $(function(){ $("head").load("header.html") });
   </script>
</head>

Працює прекрасно.


1
Гарне рішення, але я думаю, що це би завантажило рамку jquery двічі, один раз для початкового завантаження сторінки, а по-друге, коли виконується метод .load () - оскільки цільова сторінка також містить jquery.
— Делалі

8

Ви також можете поставити: (load_essentials.js :)

document.getElementById("myHead").innerHTML =
	"<span id='headerText'>Title</span>"
	+ "<span id='headerSubtext'>Subtitle</span>";
document.getElementById("myNav").innerHTML =
	"<ul id='navLinks'>"
	+ "<li><a href='index.html'>Home</a></li>"
	+ "<li><a href='about.html'>About</a>"
	+ "<li><a href='donate.html'>Donate</a></li>"
	+ "</ul>";
document.getElementById("myFooter").innerHTML =
	"<p id='copyright'>Copyright &copy; " + new Date().getFullYear() + " You. All"
	+ " rights reserved.</p>"
	+ "<p id='credits'>Layout by You</p>"
	+ "<p id='contact'><a href='mailto:you@you.com'>Contact Us</a> / "
	+ "<a href='mailto:you@you.com'>Report a problem.</a></p>";
<!--HTML-->
<header id="myHead"></header>
<nav id="myNav"></nav>
Content
<footer id="myFooter"></footer>

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


6

Я думаю, що відповіді на це запитання занадто давні ... на даний момент деякі настільні та мобільні браузери підтримують HTML-шаблони для цього.

Я створив невеликий приклад:

Перевірено в Chrome 61.0, Opera 48.0, Opera Neon 1.0, Android Browser 6.0, Chrome Mobile 61.0 та Adblocker Browser 54.0
Тестовано КО у Safari 10.1, Firefox 56.0, Edge 38.14 та IE 11

Більше інформації про сумісність на сайті canisue.com

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML Template Example</title>

    <link rel="stylesheet" href="styles.css">
    <link rel="import" href="autoload-template.html">
</head>
<body>

<div class="template-container">1</div>
<div class="template-container">2</div>
<div class="template-container">3</div>
<div class="template-container">4</div>
<div class="template-container">5</div>

</body>
</html>

autoload-template.html

<span id="template-content">
    Template Hello World!
</span>

<script>
    var me = document.currentScript.ownerDocument;
    var post = me.querySelector( '#template-content' );

    var container = document.querySelectorAll( '.template-container' );

    //alert( container.length );
    for(i=0; i<container.length ; i++) {
        container[i].appendChild( post.cloneNode( true ) );
    }
</script>

styles.css

#template-content {
    color: red;
}

.template-container {
    background-color: yellow;
    color: blue;
}

Ви можете отримати більше прикладів у цій публікації HTML5 Rocks


4
HTML-імпорт тепер застарілий.
— Джонатан Шарман

5

Я працюю в C # / Razor, і оскільки у мене не встановлено IIS на своєму домашньому ноутбуці, я шукав рішення Javascript для завантаження поглядів, створюючи статичну розмітку для нашого проекту.

Я натрапив на веб-сайт, що пояснює методи "виривання jquery", він демонструє метод на сайті робить саме те, що ви шукаєте в простому Джейн-JavaScript ( посилання на посилання внизу повідомлення ). Не забудьте вивчити будь-які вразливості безпеки та проблеми сумісності, якщо ви плануєте використовувати це у виробництві. Я ні, тому я ніколи сам не заглядав у це.

Функція JS

var getURL = function (url, success, error) {
    if (!window.XMLHttpRequest) return;
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === 4) {
            if (request.status !== 200) {
                if (error && typeof error === 'function') {
                    error(request.responseText, request);
                }
                return;
            }
            if (success && typeof success === 'function') {
                success(request.responseText, request);
            }
        }
    };
    request.open('GET', url);
    request.send();
};

Отримайте вміст

getURL(
    '/views/header.html',
    function (data) {
        var el = document.createElement(el);
        el.innerHTML = data;
        var fetch = el.querySelector('#new-header');
        var embed = document.querySelector('#header');
        if (!fetch || !embed) return;
        embed.innerHTML = fetch.innerHTML;

    }
);

index.html

<!-- This element will be replaced with #new-header -->
<div id="header"></div>

views / header.html

<!-- This element will replace #header -->
<header id="new-header"></header>

Джерело не є моїм власним, я просто посилаюсь на це, оскільки це хороше рішення для ванільного javascript для ОП. Оригінальний код живе тут: http://gomakethings.com/ditching-jquery#get-html-from-another-page


Гарне рішення. Я вважаю за краще цей варіант використання jquery.
— Делалі

2

Aloha з 2018 року. На жаль, у мене немає нічого крутого чи футуристичного, щоб поділитися з вами.

Однак я хотів би вказати тим, хто коментує, що load()метод jQuery не працює в даний час, ймовірно, намагаються використовувати метод з локальними файлами без запуску локального веб-сервера. В іншому випадку буде кидати вказане вище помилки «хрест походження», який вказує , що хрест походження запитує як , наприклад, за способом навантаження підтримуються тільки для схем протоколу , таких як http, dataабо https. (Я припускаю, що ви не робите фактичного запиту перехресного походження, тобто файл header.html насправді знаходиться на тому самому домені, що і сторінка, від якої ви його вимагаєте)

Отже, якщо прийнята відповідь вище не працює для вас, переконайтеся, що ви працюєте з веб-сервером. Найшвидший і найпростіший спосіб зробити це, якщо ви поспішаєте (і використовуєте Mac, на якому попередньо встановлений Python) - це створити простий http-сервер Python. Ви можете бачити , як легко це зробити тут .

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


Використання веб-сервера перемагає точку, хоча, принаймні, для мене причина використовувати лише Javascript - це зробити його простіше.
— Konrad Höffner

1

Також можливо завантажити сценарії та посилання в заголовки. Я додам це один із прикладів вище ...

<!--load_essentials.js-->
document.write('<link rel="stylesheet" type="text/css" href="css/style.css" />');
document.write('<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />');
document.write('<script src="js/jquery.js" type="text/javascript"></script>');

document.getElementById("myHead").innerHTML =
"<span id='headerText'>Title</span>"
+ "<span id='headerSubtext'>Subtitle</span>";
document.getElementById("myNav").innerHTML =
"<ul id='navLinks'>"
+ "<li><a href='index.html'>Home</a></li>"
+ "<li><a href='about.html'>About</a>"
+ "<li><a href='donate.html'>Donate</a></li>"
+ "</ul>";
document.getElementById("myFooter").innerHTML =
"<p id='copyright'>Copyright &copy; " + new Date().getFullYear() + " You. All"
+ " rights reserved.</p>"
+ "<p id='credits'>Layout by You</p>"
+ "<p id='contact'><a href='mailto:you@you.com'>Contact Us</a> / "
+ "<a href='mailto:you@you.com'>Report a problem.</a></p>";

<!--HTML-->
<header id="myHead"></header>
<nav id="myNav"></nav>
Content
<footer id="myFooter"></footer>

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

0

Ще один підхід, опублікований з першого запитання, - це використовувати reactrb-express (див. http://reactrb.org ). Це дозволить вам сценарій в рубіні на стороні клієнта, замінивши ваш html-код на компоненти реакції, написані в рубіні.


1
op запитав лише за допомогою html та javascript, але ти береш його для використання ruby ​​..: D lol, але крутий інструмент man ..
— Meily Chhon

Я сприйняв дух питання - без мов шаблону на стороні серверів. все це зводиться до Javascript, тому я вважаю, що відповідає наміру питання.
— Мітч ВанДюйн

-1

Збережіть HTML, який потрібно включити у файл .html:

Content.html

<a href="howto_google_maps.asp">Google Maps</a><br>
<a href="howto_css_animate_buttons.asp">Animated Buttons</a><br>
<a href="howto_css_modals.asp">Modal Boxes</a><br>
<a href="howto_js_animate.asp">Animations</a><br>
<a href="howto_js_progressbar.asp">Progress Bars</a><br>
<a href="howto_css_dropdown.asp">Hover Dropdowns</a><br>
<a href="howto_js_dropdown.asp">Click Dropdowns</a><br>
<a href="howto_css_table_responsive.asp">Responsive Tables</a><br>

Включіть HTML

Включення HTML відбувається за допомогою атрибута w3-include-html :

Приклад

    <div w3-include-html="content.html"></div>

Додайте JavaScript

HTML включає в себе JavaScript.

    <script>
    function includeHTML() {
      var z, i, elmnt, file, xhttp;
      /*loop through a collection of all HTML elements:*/
      z = document.getElementsByTagName("*");
      for (i = 0; i < z.length; i++) {
        elmnt = z[i];
        /*search for elements with a certain atrribute:*/
        file = elmnt.getAttribute("w3-include-html");
        if (file) {
          /*make an HTTP request using the attribute value as the file name:*/
          xhttp = new XMLHttpRequest();
          xhttp.onreadystatechange = function() {
            if (this.readyState == 4) {
              if (this.status == 200) {elmnt.innerHTML = this.responseText;}
              if (this.status == 404) {elmnt.innerHTML = "Page not found.";}
              /*remove the attribute, and call this function once more:*/
              elmnt.removeAttribute("w3-include-html");
              includeHTML();
            }
          } 
          xhttp.open("GET", file, true);
          xhttp.send();
          /*exit the function:*/
          return;
        }
      }
    }
    </script>

Виклик includeHTML () внизу сторінки:

Приклад

<!DOCTYPE html>
<html>
<script>
function includeHTML() {
  var z, i, elmnt, file, xhttp;
  /*loop through a collection of all HTML elements:*/
  z = document.getElementsByTagName("*");
  for (i = 0; i < z.length; i++) {
    elmnt = z[i];
    /*search for elements with a certain atrribute:*/
    file = elmnt.getAttribute("w3-include-html");
    if (file) {
      /*make an HTTP request using the attribute value as the file name:*/
      xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
        if (this.readyState == 4) {
          if (this.status == 200) {elmnt.innerHTML = this.responseText;}
          if (this.status == 404) {elmnt.innerHTML = "Page not found.";}
          /*remove the attribute, and call this function once more:*/
          elmnt.removeAttribute("w3-include-html");
          includeHTML();
        }
      }      
      xhttp.open("GET", file, true);
      xhttp.send();
      /*exit the function:*/
      return;
    }
  }
};
</script>
<body>

<div w3-include-html="h1.html"></div> 
<div w3-include-html="content.html"></div> 

<script>
includeHTML();
</script>

</body>
</html>

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