Includi un altro file HTML in un file HTML


627

Ho 2 file HTML, supponiamo a.htmle b.html. In a.htmlvoglio includereb.html .

In JSF posso farlo in questo modo:

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

Significa che all'interno del a.xhtmlfile, posso includereb.xhtml .

Come possiamo farlo in *.htmlarchivio?



32
NO! le sue 2 cose diverse!
lolo

correlate, ma per localhost: stackoverflow.com/questions/7542872/...
cregox

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

Risposte:


687

Secondo me la migliore soluzione utilizza 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>

Questo metodo è una soluzione semplice e pulita al mio problema.

La .load()documentazione di jQuery è qui .


5
Qual è la differenza nel fare solo questo <script> $ ("# includedContent"). Load ("b.html"); </script>?
Rodrigo Ruiz,

10
@RodrigoRuiz $(function(){})verrà eseguito solo al termine del caricamento del documento.
ProfK,

8
Se il file HTML incluso ha CSS allegato, potrebbe rovinare il tuo stile di pagina.
Omar Jaa per il

6
Sono esattamente come hai menzionato. Sto usando bootstrap e ho sovrascrive CSS per B.html. Quando uso B.html in A.html in modo che finisca come intestazione di A.html, vedo che il CSS ha perso la sua priorità e ha un layout diverso. Qualche soluzione a questo ?.
Pavan Dittakavi,

38
Ciò richiede un server . Quando lo si utilizza su un file locale: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

Espandendo la risposta di Lolo dall'alto, ecco un po 'più di automazione se devi includere molti file:

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

E quindi per includere qualcosa nell'html:

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

Che includerebbe il file views / header.html e views / footer.html


Molto utile. C'è un modo per passare un argomento attraverso un altro parametro di dati, come data-argumente recuperarlo nel file incluso?
chris

@chris È possibile utilizzare i parametri GET, ad esempio$("#postdiv").load('posts.php?name=Test&age=25');
Nam G VU

5
Piccolo suggerimento - non ti serve class="include"- crea il tuo selettore jQueryvar includes = $('[data-include]');
jbyrd

non funziona su Chrome con file locali "Le richieste di origine incrociata sono supportate solo per gli schemi di protocollo: htt"
Artem Bernatskyi,

2
@ArtemBernatskyi Aiuta invece quando si esegue un server locale? Ecco un semplice tutorial: developer.mozilla.org/en-US/docs/Learn/Common_questions/…
mhanisch

146

La mia soluzione è simile a quella di Lolo sopra. Tuttavia, inserisco il codice HTML tramite document.write di JavaScript invece di utilizzare 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>\
\
');

La ragione per cui mi oppongo all'uso di jQuery è che jQuery.js ha una dimensione di ~ 90kb e voglio mantenere la quantità di dati da caricare il più piccola possibile.

Per ottenere il file JavaScript con escape corretto senza molto lavoro, è possibile utilizzare il seguente comando sed:

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

O semplicemente usa il seguente script bash pubblicato come Gist su Github, che automatizza tutto il lavoro necessario, convertendolo b.htmlin b.js: https://gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6

Crediti a Greg Minshall per il migliorato comando sed che sfugge anche a barre e virgolette singole, che il mio comando sed originale non ha preso in considerazione.

In alternativa, per i browser che supportano letterali template funziona anche quanto segue:

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 Sì, hai ragione, questo è lo svantaggio della mia soluzione e non è molto elegante. Tuttavia, poiché puoi inserire un '\' con una semplice regex alla fine di ogni riga, questo funziona meglio per me. Hmm ... forse dovrei aggiungere alla mia risposta come fare l'inserimento tramite regex ...
Tafkadasoh,

2
Oh scema, è brutto - no grazie. Preferirei scrivere il mio HTML come HTML. Non mi interessa se posso usare sed dalla riga di comando - non voglio fare affidamento su questo ogni volta che cambio il contenuto del modello.
jbyrd,

1
@Goodra Dovrebbe funzionare su qualsiasi HTML senza 'segni in esso. Se fai solo una ricerca / sostituzione per sostituire ` with \ `POI trova / sostituisci per sostituire 'con \'e new-line con` `new-line funzionerà bene.
wizzwizz4,

1
@ wizzwizz4: Grazie a Greg, il comando sed ora sfugge anche a virgolette singole e barre rovesciate. Inoltre, ho aggiunto uno script bash che fa tutto il lavoro per te. :-)
Tafkadasoh,

1
Puoi usare i backtick `- quindi puoi inserire espressioni come ${var}- devi solo scappare \`e\$
inetphantom

85

Verifica le importazioni HTML5 tramite il tutorial Html5rocks e sul progetto polimerico

Per esempio:

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

27
Le importazioni HTML non hanno lo scopo di includere direttamente il contenuto nella pagina. Il codice in questa risposta è stuff.htmldisponibile solo come modello all'interno della pagina padre, ma dovresti usare gli script per creare cloni del suo DOM nella pagina padre in modo che siano visibili all'utente.
waldyrious

1
Le istruzioni su html5rocks.com per l'inserimento dei contenuti di una pagina HTML in un'altra non sembrano funzionare in molti browser là fuori, ancora. L'ho provato in Opera 12.16 e Superbird versione 32.0.1700.7 (233448) senza effetto (su Xubuntu 15.04). Ho sentito che non funziona in Firefox (a causa di un bug che si spera sia stato corretto) o in molte versioni di Chrome, però. Quindi, sebbene possa sembrare una soluzione ideale in futuro, non è una soluzione cross-browser.
Brōtsyorfuzthrāx,

1
Apparentemente non pronto alla fine del 2016 in FireFox (45.5.1 ESR). JS console dice: TypeError: ... .import is undefined. MDN dice "Al momento questa funzione non è implementata in nessun browser in modo nativo". Qualcuno sa se è possibile creare FF con questa funzione?
Sphakka,

3
Firefox non lo supporterà. Per abilitarlo prova a impostare "dom.webcomponents.enabled". Funzionerà solo su Chrome e Opera, Android con vista web aggiornabile (a partire da 4.4.3). I browser Apple non lo supportano. Sembra una bella idea per i componenti web ma non ancora ampiamente implementata.
Massimo

9
Aggiornamento alla fine del 2018: le importazioni di HTML sembrano essere state deprecate per qualche motivo
V. Rubinetti

60

Spina spudorata di una biblioteca che ho scritto per risolvere questo.

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

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

Quanto sopra prenderà il contenuto di /path/to/include.html e lo sostituirà divcon esso.


4
Questo valuterà JavaScript se include.html lo ha incorporato?
Seth,

1
@Seth non sembra. Ho intenzione di giocare con l'src e vedere se riesco a farlo. Grazie a michael-marr
xandout il

2
Brillante!!!! La tua sembra l'unica soluzione che SOSTITUISCE il tag div usato come token per dove inserire. Studierò attentamente la fonte più tardi !! :-)
kpollock

1
grazie funziona, include HTML / CSS ma non Javascript dai file sorgente. Devi solo includerlo di nuovo ovunque usi <div data-include="/path/to/include.html"></div>. Questo strumento semplifica la creazione di un semplice mockup multipagina senza plug-in in modo pulito.
Vincent Tang,

1
posso usare questa lib in qualsiasi applicazione? Voglio dire, come può accreditare l'autore? W3School ha una soluzione simile, con l'unica differenza che il tuo codice provvede anche alla chiamata ricorsiva al caricamento della finestra .... w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
yeppe

43

Un semplice lato server include la direttiva per includere un altro file trovato nella stessa cartella in questo modo:

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

21
Devi configurare il tuo server per usare SSI
lolo

7
Ecco un riferimento per la configurazione dell'SSI per il tuo server: httpd.apache.org/docs/2.4/howto/ssi.html#configuring
shasi kanth

Potrebbe valere la pena provare <!--#include file="a.html" -->anche
jimmyjudas,

L'inclusione SSI rende il Web Server un po 'più lento (quindi dovrebbe essere evitato fino alla necessità assoluta).
Amit Verma,

36

Non c'è bisogno di script. Non c'è bisogno di fare cose di fantasia sul lato server (anche se probabilmente sarebbe un'opzione migliore)

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

Poiché i vecchi browser non supportano la continuità, è necessario aggiungere alcuni CSS per risolverlo:

iframe[seamless] {
    border: none;
}

Tieni presente che per i browser che non supportano la continuità, se fai clic su un collegamento nell'iframe, il frame diventerà il frame passerà a quell'URL, non all'intera finestra. Un modo per aggirare il problema è avere tutti i collegamenti target="_parent", anche se il supporto del browser è "abbastanza buono".


7
ad esempio, non sembra applicare gli stili CSS dalla pagina principale.
Randy,

5
@Randy Quindi? Questo potrebbe essere conteggiato come un vantaggio (specialmente per contenuti generati dagli utenti e simili). Puoi facilmente includere nuovamente i file CSS in ogni caso senza fare un'altra richiesta a causa della memorizzazione nella cache.
bjb568,

Ho risposto alle mie esigenze per la risposta a questa domanda: come includere un file html in un altro file html ...
Grimxn,

2
Questa è la risposta migliore SENZA JQuery o script. Bello bjb568 grazie!
DBS,

12
L' seamlessattributo è stato rimosso dalla bozza HTML da cui proveniva. Non usarlo.
Mitja,

33

Una soluzione molto vecchia che avevo soddisfatto ai miei bisogni allora, ma ecco come farlo codice conforme agli standard:

<!--[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
Sembra che <object>, <embed>e <iframe>tutti funzionino per questo, ma in tutti e tre i casi creano documenti separati con i loro contesti di stile e script (iframe in particolare include brutti bordi e barre di scorrimento), e per esempio tutti i collegamenti di default si aprono al loro interno piuttosto che sul pagina principale (sebbene ciò possa essere sovrascritto con target = "_ parent"). Da tutti questi, iframe è l'unico che ha qualche speranza di diventare più integrato attraverso l' seamlessattributo HTML5 (menzionato da bjb568), ma non è ancora ben supportato: caniuse.com/#feat=iframe-seamless
waldyrious

2
iframe-seamless è stato eliminato dallo standard HTML: github.com/whatwg/html/issues/331 . Quindi il commento di @waldyrious non è più corretto (ti dispiace aggiornarlo il tuo commento?)
Tomáš Pospíšek,

1
Grazie per l'heads-up, @ TomášPospíšek. Non posso più modificare il mio commento, ma spero che la tua risposta fornisca le avvertenze necessarie ai lettori. Per essere chiari, l'ultima frase (sull'attributo seamless) è l'unica parte obsoleta - il resto si applica ancora.
waldyrious

17

In alternativa, se hai accesso al file .htaccess sul tuo server, puoi aggiungere una semplice direttiva che permetterà a php di essere interpretato su file che terminano con estensione .html.

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

Ora puoi usare un semplice script php per includere altri file come:

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

28
Sì, questo è un pessimo consiglio. I file HTML sono statici e sono serviti da Apache molto velocemente. Se aggiungi tutti i file html al parser php solo per includere i file, avrai molti problemi di prestazioni sui tuoi server. Il modo javascript (jQuery o JS semplice) non è un'ottima soluzione, ma è comunque molto più efficiente e meno pericoloso di questo.
Gfra54,

@ Gfra54 Vuoi dire che avremo problemi di prestazioni se usiamo Apache solo per questo, e non facciamo alcun lavoro php per il sito? O rallenterà se uso php e questa cosa insieme?
user3459110

1
Attenzione: l'aggiunta di queste righe a .htaccesspuò far sì che le htmlpagine provino a scaricare come file anziché a visualizzarle nel browser. Prima prova. Disclaimer: questo è successo solo a me quando ho provato la soluzione di cui sopra. Il mio .htaccessera vuoto, tranne per due righe sopra. Attenzione consigliata. Prova invece lolola soluzione jQuery (sotto).
cssyphus,

amico, mi stavo complicando anche se l'ho già fatto prima. Grazie per il promemoria. Per lo scopo di cui ho bisogno non influisce davvero sulle prestazioni, quindi sono forte.
Gman,

Ha questa risposta schiacciante delle prestazioni è un fantastico esempio di pensiero fuori dagli schemi. Non lo suggerirei mai, ma forse un salvavita quando hai bisogno di un po 'di mazza php. :-)
moodboom

14

Di seguito funziona se è necessario includere il contenuto html da alcuni file: Ad esempio, la riga seguente includerà il contenuto di piece_to_include.html nella posizione in cui si verifica la definizione OBJECT.

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

Riferimento: http://www.w3.org/TR/WD-html40-970708/struct/includes.html#h-7.7.4


2
Funziona come un fascino ed è la soluzione più pulita. Questa dovrebbe essere la risposta accettata.
Vbocan,

Essere d'accordo. Solo una nota: non provare a fare un tag oggetto a chiusura automatica. Il testo dopo verrà cancellato.
Sridhar Sarnobat,

Sembra creare un nuovo "documento #" che contiene automaticamente tag <html> e <body> nuovi, nidificati. Questo non ha funzionato per il mio scopo; il mio file .html contiene tag <script src = "..." type = "text / javascript">; ma JS ha ricevuto nuovi errori di riferimento.
IAM_AL_X,

12

Ecco la mia soluzione sul posto:

(() => {
    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
wow, è più semplice
Arian saputra,

Soluzione davvero piacevole e semplice, grazie ^^
Remling

11

In w3.js includi lavori come questo:

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

Per una descrizione corretta, consultare questo: https://www.w3schools.com/howto/howto_html_include.asp


Se vuoi sapere quando il documento è stato caricato, puoi metterlo alla fine del documento: <img src = "thisimagedoesnotexist.dmy" onerror = 'initDocument ()' style = 'display: none;'> Trucco intelligente eh?
Kaj Risberg,

2
non funziona con Google Chrome.
deepcell

9

Questo è ciò che mi ha aiutato. Per aggiungere un blocco di codice html da b.htmla a.html, questo dovrebbe andare nel headtag di a.html:

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

Quindi nel tag body, viene creato un contenitore con un ID univoco e un blocco javascript per caricare b.htmlil contenitore nel contenitore, come segue:

<div id="b-placeholder">

</div>

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

6
In che modo questa risposta è diversa dalla risposta accettata di questa domanda?
Mohammad Usman,

2
@MohammadUsman Qui il contenitore e il codice javascript si trovano nel tag body mentre la risposta accettata li posiziona nel tag head e lascia il contenitore solo nel tag body.
Ramtin,

Questo non merita una nuova risposta ... è un commento
Kennet Celeste,

8

So che questo è un post molto vecchio, quindi alcuni metodi non erano disponibili allora. Ma ecco la mia interpretazione molto semplice (basata sulla risposta di Lolo).

Si basa sugli attributi data- * HTML5 ed è quindi molto generico in quanto utilizza la funzione for-each di jQuery per ottenere ogni .class corrispondente a "load-html" e utilizza il rispettivo attributo "origine dati" per caricare il contenuto:

<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

Puoi utilizzare un polyfill di importazioni HTML ( https://www.html5rocks.com/en/tutorials/webcomponents/imports/ ) o quella soluzione semplificata https://github.com/dsheiko/html-import

Ad esempio, nella pagina si importa un blocco HTML in questo modo:

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

Il blocco può avere importazioni proprie:

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

L'importatore sostituisce la direttiva con l'HTML caricato più o meno come SSI

Queste direttive verranno pubblicate automaticamente non appena carichi questo piccolo JavaScript:

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

Elaborerà le importazioni quando DOM sarà pronto automaticamente. Inoltre, espone un'API che è possibile utilizzare per eseguire manualmente, per ottenere i registri e così via. Godere :)


Dove dovrebbe andare la riga di script nel file html?
Andrew Truckle,

Ovunque all'interno di BODY. Può essere inserito in modo ricorsivo nel contenuto dei file inclusi
Dmitry Sheiko,

Hai provato questo?
Bhikkhu Subhuti,

Sicuramente l'ho fatto. Lo sto usando da anni. Perché chiedere? Alcun problema?
Dmitry Sheiko il

Quindi la "chiave" per questo è il script async srcsembra. Provandolo!
javadba,

6

La maggior parte delle soluzioni funziona ma hanno problemi con jquery :

Il problema è che il codice seguente $(document).ready(function () { alert($("#includedContent").text()); }non avvisa nulla invece di avvisare il contenuto incluso.

Scrivo il codice seguente, nella mia soluzione è possibile accedere al contenuto incluso nella $(document).readyfunzione:

(La chiave sta caricando il contenuto incluso in modo sincrono).

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 include plugin su github


Quando lo usi e poi visualizzi l'origine della pagina da un browser vedi solo lo script. Ciò non influisce sulla capacità dei motori di ricerca di analizzare il tuo sito, distruggendo in definitiva qualsiasi sforzo SEO?
hmcclungiii,

Sì, questo metodo distrugge qualsiasi SEO :)
Amir Saniyan,

Inoltre, ogni metodo basato su JavaScript lo fa.
wizzwizz4,

5

Per inserire il contenuto del file indicato:

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

1
utilizzando parentesi angolari per []: [! - # include virtual = "include_omega.htm" -]
St.Eve

4

La risposta di Athari (la prima!) È stata troppo conclusiva! Molto bene!

Ma se desideri passare il nome della pagina da includere come parametro URL , questo post ha una soluzione molto bella da utilizzare in combinazione con:

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

Quindi diventa qualcosa del genere:

Il tuo URL:

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

Il codice a.html ora diventa:

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

Ha funzionato molto bene per me! Spero di aver aiutato :)


Problema di sicurezza, perché puoi inviare a qualcuno questo link: www.yoursite.com/a.html?p=htttp://www.linktovir.us/here.html
JoostS

4

html5rocks.com ha un ottimo tutorial su queste cose, e potrebbe essere un po 'tardi, ma io stesso non sapevo che esistesse. w3schools ha anche un modo per farlo usando la loro nuova libreria chiamata w3.js. Il fatto è che ciò richiede l'uso di un server Web e di un oggetto HTTPRequest. Non puoi effettivamente caricarli localmente e testarli sul tuo computer. Quello che puoi fare, però, è utilizzare i polyfill forniti sul link html5rocks nella parte superiore o seguire il loro tutorial. Con un po 'di magia JS, puoi fare qualcosa del genere:

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

Questo renderà il collegamento (può cambiare per essere l'elemento desiderato del collegamento se già impostato), impostare l'importazione (a meno che non lo possediate già) e quindi aggiungerlo. Da lì lo prenderà e analizzerà il file in HTML, quindi lo aggiungerà all'elemento desiderato sotto un div. Tutto ciò può essere modificato per adattarsi alle tue esigenze dall'elemento aggiunto al link che stai utilizzando. Spero che questo abbia aiutato, potrebbe non essere importante ora se sono usciti modi più recenti e più veloci senza usare librerie e framework come jQuery o W3.js.

AGGIORNAMENTO: Questo genererà un errore che dice che l'importazione locale è stata bloccata dalla politica CORS. Potrebbe essere necessario accedere al deep web per poterlo utilizzare a causa delle proprietà del deep web. (Significa nessun uso pratico)


4

Ecco il mio approccio usando l'API Fetch e la funzione asincrona

<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

Per ora non esiste una soluzione HTML diretta per l'attività. Anche le importazioni HTML (che sono permanentemente in bozza ) non faranno la cosa, perché Import! = Include e un po 'di magia JS sarà comunque richiesta.
Di recente ho scritto uno script VanillaJS che è solo per l'inclusione di HTML in HTML, senza complicazioni.

Posizionalo nel tuo a.html

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

È open-sourcee può dare un'idea (spero)


3

Puoi farlo con la libreria jQuery di JavaScript in questo modo:

HTML:

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

JS:

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

Tieni presente che banner.htmldovrebbe trovarsi nello stesso dominio in cui si trovano le tue altre pagine, altrimenti le tue pagine web rifiuteranno il banner.htmlfile a causa delle politiche di condivisione delle risorse tra le origini .

Inoltre, tieni presente che se carichi i tuoi contenuti con JavaScript, Google non sarà in grado di indicizzarli, quindi non è esattamente un buon metodo per motivi SEO.


2

Hai provato un'iniezione di iFrame?

Inietta l'iFrame nel documento ed elimina se stesso (dovrebbe essere quindi nel DOM HTML)

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

Saluti


1

Sono arrivato a questo argomento cercando qualcosa di simile, ma un po 'diverso dal problema posto da Lolo. Volevo costruire una pagina HTML contenente un menu alfabetico di collegamenti ad altre pagine, e ciascuna delle altre pagine potrebbe o non potrebbe esistere, e l'ordine in cui sono state create potrebbe non essere alfabetico (o addirittura numerico). Inoltre, come Tafkadasoh, non volevo gonfiare la pagina Web con jQuery. Dopo aver studiato il problema e sperimentato per diverse ore, ecco cosa ha funzionato per me, con l'aggiunta di osservazioni pertinenti:

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

Ecco un ottimo articolo , puoi implementare una libreria comune e usare semplicemente il codice seguente per importare qualsiasi file HTML in una riga.

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

Puoi anche provare Google Polymer


6
"basta usare il codice sottostante per importare qualsiasi file HTML in una riga" è piuttosto disonesto. Devi quindi scrivere alcuni JS per utilizzare qualsiasi contenuto importato, quindi finisce per essere molto più di "una riga".
skybondsor,

1

Uso dei backtick ES6 ``: letterali template !

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>

In questo modo possiamo includere HTML senza codificare le virgolette, includere variabili dal DOM e così via.

È un potente motore di template, possiamo usare file js separati e usare eventi per caricare il contenuto sul posto, o persino separare tutto in blocchi e chiamare su richiesta:

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

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


1
Bell'esempio: perché nessun voto (fino ad ora)?
javadba,

Ehi, hai ragione, nel 2018 quanto sopra era un chiaro segno di un vero e proprio RTFM;) javascriptFino ad allora ho in gran parte rotto quel distintivo come programmatore di hobby.
NVRM

1

Per far funzionare la Soluzione è necessario includere il file csi.min.js, che è possibile individuare qui .

Come nell'esempio mostrato su GitHub, per utilizzare questa libreria è necessario includere il file csi.js nell'intestazione della pagina, quindi è necessario aggiungere l'attributo di inclusione dei dati con il valore impostato nel file che si desidera includere, nel contenitore elemento.

Nascondi il codice di copia

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

... spero che sia d'aiuto.


0

PHP è un linguaggio di scripting a livello di server. Può fare molte cose, ma un uso popolare è quello di includere documenti HTML all'interno delle tue pagine, più o meno come SSI. Come SSI, questa è una tecnologia a livello di server. Se non sei sicuro di avere la funzionalità PHP sul tuo sito web, contatta il tuo provider di hosting.

Ecco un semplice script PHP che puoi utilizzare per includere uno snippet di HTML in qualsiasi pagina Web abilitata per PHP:

Salva l'HTML per gli elementi comuni del tuo sito in file separati. Ad esempio, la sezione di navigazione potrebbe essere salvata come navigation.html o navigation.php. Usa il seguente codice PHP per includere quell'HTML in ogni pagina.

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

Usa lo stesso codice su ogni pagina in cui desideri includere il file. Assicurati di cambiare il nome del file evidenziato con il nome e il percorso del tuo file include.


0

Se usi un framework come django / bootle, spesso spediscono alcuni template engine. Supponiamo che tu usi la bottiglia e che il motore modello predefinito sia SimpleTemplate Engine . E sotto è il file html puro

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

Puoi includere footer.tpl nel tuo file principale, come:

$ cat dashboard.tpl
%include footer

Oltre a ciò, puoi anche passare i parametri a dashborard.tpl.


0

Basato sulla risposta di https://stackoverflow.com/a/31837264/4360308 ho implementato questa funzionalità con Nodejs (+ express + cheerio) come segue:

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 -> include il contenuto nel div

sostituisci -> sostituisce il div

potresti facilmente aggiungere più comportamenti seguendo lo stesso design

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.