Rendi i file di intestazione e piè di pagina da includere in più pagine html


141

Voglio creare pagine comuni di intestazione e piè di pagina che sono incluse in diverse pagine HTML.

Mi piacerebbe usare JavaScript. C'è un modo per farlo usando solo html e JavaScript?

Voglio caricare una pagina di intestazione e piè di pagina all'interno di un'altra pagina HTML.


1
Stai cercando ajax ... $ ('. MyElement) .load (' urltopage.html '); questo caricherà il contenuto di urltopage.html in .myElement
Salketer

Risposte:


193

Puoi farlo con jquery .

Inserisci questo codice in 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>

e inserisci questo codice header.htmle footer.html, nella stessa posizione diindex.html

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

Ora, quando visiti index.html, dovresti essere in grado di fare clic sui tag del link.


Sì. tutte le pagine dovrebbero avere questa struttura di pagine
Hariprasad Prolanx,

19
caricamento o altra funzione che importa o utilizza un local filenon funzionante nella nuova versione di Google Chrome o IE, motivo: sicurezza!
Sinac,

7
A volte mi chiedo come le persone possano persino respirare senza jQuery. O c'è un .breathe(in)e .breathe(out)già? Qualsiasi linguaggio di scripting è assolutamente eccessivo qui.
The Conspiracy

6
Continuo a Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.correre quando corro in chrome
digiwebguy

1
È necessario eseguire il codice nel server. Ciò significa che l'URL deve essere come "http: // .....".
Patriotic,

37

Aggiungo parti comuni come intestazione e piè di pagina usando Server Side Includes . Non è necessario HTML e JavaScript. Invece, il server web aggiunge automaticamente il codice incluso prima di fare qualsiasi altra cosa.

Basta aggiungere la seguente riga in cui si desidera includere il file:

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

6
mi piace questo vecchio stile. In effetti, non sembra avere molti benefici usando lo script per fare un'azione così semplice.
Jenna Leaf,

3
In effetti, includere i file utilizzando uno script presenta notevoli svantaggi: ostacola le prestazioni in quanto il client deve scaricare la pagina principale, caricare il DOM, eseguire lo script e solo allora può scaricare i file inclusi, che richiede una richiesta server aggiuntiva per file incluso . Includere i file usando Server Side Includes serve tutti gli elementi durante la prima richiesta del server, non è necessaria alcuna azione client.
The Conspiracy,

SSI richiede utilizzando un'estensione di file di: .shtml, .stm, .shtm. Funziona in Apache, LiteSpeed, nginx, lighttpd e IIS.
ubershmekel,

@ubershmekel Come hai detto, i server web pertinenti supportano SSI. L'estensione del file non è limitata a .shtml, .stme .shtm: In IIS, tutti i file parsed possono contenere SSI, ad es .aspx. Se lavori con PHP, devi usare PHP includeo il virtualcomando invece per ottenere lo stesso risultato.
The Conspiracy,

33

Devi usare la struttura dei file html con JavaScript? Hai preso in considerazione l'utilizzo di PHP invece di poter utilizzare semplice PHP include object?

Se converti i nomi dei file delle tue pagine .html in .php - quindi nella parte superiore di ciascuna delle tue pagine .php puoi usare una riga di codice per includere il contenuto del tuo header.php

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

Fai lo stesso nel piè di pagina di ogni pagina per includere il contenuto del tuo file footer.php

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

Nessun JavaScript / Jquery o file inclusi aggiuntivi richiesti.

NB Puoi anche convertire i tuoi file .html in file .php usando quanto segue nel tuo file .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 - l'OP non menziona nulla di un'installazione ospitata in locale, quindi ho pensato che stesse parlando di file basati su server.
Sol,

1
@Sol Tuttavia l'OP DID menziona specificamente il desiderio di utilizzare Javascript, quindi la tua risposta è fuori tema. Lo sviluppo web full-stack si sta rapidamente allontanando dall'uso di PHP, Node.js offre tutte le funzionalità equivalenti e richiede solo Javascript per essere utilizzato. TL; DR, rispondere alle domande poste. L'OP voleva una soluzione JS, quindi non è appropriato dargli una soluzione PHP, Ruby, Python, C ++ o qualsiasi altra lingua.
Zach

9

Ho provato questo: creare un file header.html come

<!-- 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>

Ora includi header.html nelle tue pagine HTML come:

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

Funziona perfettamente.


1
Bella soluzione, ma penso che questo carica il framework jquery due volte, una volta per il caricamento della pagina iniziale, e in secondo luogo quando viene eseguito il metodo .load (), poiché anche la pagina di destinazione contiene jquery.
Delali,

8

Puoi anche inserire: (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

Penso che le risposte a questa domanda siano troppo vecchie ... attualmente alcuni browser desktop e mobili supportano i modelli HTML per farlo.

Ho costruito un piccolo esempio:

Testato OK in Chrome 61.0, Opera 48.0, Opera Neon 1.0, Android Browser 6.0, Chrome Mobile 61.0 e Adblocker Browser 54.0
Testato KO in Safari 10.1, Firefox 56.0, Edge 38.14 e IE 11

Ulteriori informazioni sulla compatibilità in 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;
}

Puoi ottenere altri esempi in questo post HTML5 Rocks


4
Le importazioni HTML sono ora obsolete.
Jonathan Sharman,

5

Ho lavorato in C # / Razor e dal momento che non ho configurazione IIS sul mio laptop di casa ho cercato una soluzione javascript da caricare nelle viste durante la creazione di markup statico per il nostro progetto.

Mi sono imbattuto in un sito web che spiega i metodi di "abbandono jquery", dimostrando che un metodo sul sito fa esattamente quello che stai cercando nel semplice javascript di Jane ( link di riferimento in fondo al post ). Assicurati di indagare su eventuali vulnerabilità della sicurezza e problemi di compatibilità se intendi utilizzarlo in produzione. Non lo sono, quindi non l'ho mai esaminato da solo.

Funzione 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();
};

Ottieni il contenuto

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>

La fonte non è la mia, la sto semplicemente facendo riferimento perché è una buona soluzione javascript alla vanilla all'OP. Il codice originale risiede qui: http://gomakethings.com/ditching-jquery#get-html-from-another-page


Buona soluzione Preferisco questo per usare jquery.
Delali,

2

Aloha del 2018. Sfortunatamente, non ho nulla di bello o futuristico da condividere con te.

Volevo tuttavia sottolineare a coloro che hanno commentato che il load()metodo jQuery non funziona nel presente probabilmente stanno provando a utilizzare il metodo con file locali senza eseguire un server Web locale. Così facendo gettare il suddetto errore "origine croce", che specifica che origine incrociata richiede come quella effettuata con il metodo di carico sono supportati solo per schemi di protocollo come http, datao https. (Suppongo che tu non stia facendo una vera richiesta di origine incrociata, cioè il file header.html si trova effettivamente sullo stesso dominio della pagina da cui lo stai richiedendo)

Quindi, se la risposta accettata sopra non funziona per te, assicurati di eseguire un server web. Il modo più rapido e semplice per farlo se hai fretta (e usi un Mac, che ha Python preinstallato) sarebbe far girare un semplice server HTTP Python. Puoi vedere quanto è facile farlo qui .

Spero che aiuti!


L'uso di un web server sconfigge il punto, almeno per me il motivo per usare solo Javascript è di svilupparlo più facilmente.
Konrad Höffner,

1

È anche possibile caricare script e collegamenti nell'intestazione. Aggiungerò uno degli esempi sopra ...

<!--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

un altro approccio reso disponibile da quando questa domanda è stata posta per la prima volta è di usare reattrb-express (vedi http://reactrb.org ) Questo ti permetterà di scrivere script in ruby ​​sul lato client, sostituendo il tuo codice html con componenti di reazioni scritti in ruby.


1
op mi ha chiesto di usare solo html e javascript ma tu lo usi per usare il rubino ..: D lol ma
bravo

Ho preso lo spirito della domanda per essere - senza linguaggi templating lato server. si compila fino a Javascript, quindi credo che soddisfi l'intento della domanda.
Mitch VanDuyn,

-1

Salvare l'HTML che si desidera includere in un file .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>

Includi l'HTML

L'inclusione dell'HTML viene eseguita utilizzando un attributo w3-include-html :

Esempio

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

Aggiungi il JavaScript

Le inclusioni HTML vengono eseguite da 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>

Chiama includeHTML () nella parte inferiore della pagina:

Esempio

<!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>

Ottengo una pagina bianca vuota quando provo index.html dopo
Hussein Elbeheiry
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.