Зробіть, щоб файли заголовків і колонтитулів включалися до кількох 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.