HTML dosyasına başka bir HTML dosyası dahil etme


626

2 HTML dosyam var, varsayalım a.htmlve b.html. In a.htmlben dahil etmek istediğiniz b.html.

JSF bunu böyle yapabilirim:

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

Bu, a.xhtmldosyanın içine dahil edebileceğim anlamına gelir b.xhtml.

*.htmlDosyada nasıl yapabiliriz ?



32
HAYIR! 2 farklı şey!
lolo

ile ilgili, ancak için localhost: stackoverflow.com/questions/7542872/…
cregox

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

Yanıtlar:


687

Bence en iyi çözüm jQuery kullanır:

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>

Bu yöntem sorunum için basit ve temiz bir çözümdür.

JQuery .load()belgeleri burada .


5
Yalnızca bu <script> $ ("# incluContent"). Load ("b.html"); </script> yapmanın farkı nedir?
Rodrigo Ruiz

10
@RodrigoRuiz $(function(){})ancak belge yüklemeyi bitirdikten sonra yürütülür.
ProfK

8
Eklenen HTML dosyasına CSS eklenmişse, sayfa stilinizi bozabilir.
Omar Jaafor

6
Ben tam olarak bahsettiğin gibiyim. Ben bootstrap kullanıyorum ve B.html için css üzerine yazma var. Ben. Bunun çözümü var mı?
Pavan Dittakavi

37
Bu bir sunucu gerektirir . Yerel bir dosyada kullanırken: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

Lolo'nun cevabını yukarıdan genişletmek, çok fazla dosya eklemeniz gerekiyorsa biraz daha otomasyon:

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

Ve sonra html'ye bir şey eklemek için:

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

Bu, views / header.html ve views / footer.html dosyasını içerir


Çok kullanışlı. Bir argümanı, başka bir veri parametresinden geçirmenin data-argument, dahil edilen dosyadaki gibi almanın ve almanın bir yolu var mı ?
chris

@chris GET parametrelerini kullanabilirsiniz, örneğin$("#postdiv").load('posts.php?name=Test&age=25');
Nam G VU

5
Küçük öneri - ihtiyacınız yok class="include"- sadece jQuery seçicinizi yapınvar includes = $('[data-include]');
jbyrd

yerel dosyalarla krom üzerinde çalışmaz "Çapraz menşe istekleri yalnızca protokol şemaları için desteklenir: htt"
Artem Bernatskyi

2
@ArtemBernatskyi Bunun yerine yerel bir sunucu çalıştırdığınızda yardımcı olur mu? İşte kolay bir öğretici: developer.mozilla.org/tr-TR/docs/Learn/Common_questions/…
mhanisch

146

Benim çözümüm yukarıdaki lolo'nunkine benzer . Ancak, HTML kodunu jQuery kullanmak yerine JavaScript'in document.write yolu ile ekliyorum:

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 kullanmaya karşı bana neden jQuery.js boyutu ~ 90kb olmasıdır ve ben mümkün olduğunca küçük veri yüklemek için miktarı tutmak istiyorum.

Çok fazla çalışma yapmadan düzgün bir şekilde kaçan JavaScript dosyasını almak için aşağıdaki sed komutunu kullanabilirsiniz:

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

Ya da sadece dönüştürme, gerekli tüm çalışmaları otomatik hale Github bir Gist'e olarak yayınlanan aşağıdaki kullanışlı bash komut dosyası kullanmak b.htmliçin b.js: https://gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6

Orijinal sed komutumun dikkate almadığı ters eğik çizgiler ve tek tırnaklardan kaçan geliştirilmiş sed komutu için Greg Minshall'a verilen krediler .

Alternatif olarak, şablon değişmezlerini destekleyen tarayıcılar için aşağıdakiler de çalışır:

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 Evet, haklısın, bu benim çözümümün dezavantajı ve bu çok şık değil. Ancak, her satırın sonuna basit bir normal ifadeyle bir '\' ekleyebileceğiniz için, bu benim için en iyisidir. Hmm ... belki cevabımı regex ile nasıl yapacağımı eklemeliyim ...
Tafkadasoh

2
Oh sheesh, bu çirkin - hayır, teşekkürler. Html'imi html olarak yazmayı tercih ederim. Komut satırında sed kullanabilir miyim umurumda değil - şablonun içeriğini her değiştirdiğimde buna güvenmek istemiyorum.
jbyrd

1
@Goodra 'İşaretleri olmayan herhangi bir HTML üzerinde çalışmalıdır . Sadece bir find yaparsanız / Sürekli değiştir ` with SONRA `\ bulmak / yerini değiştirmek 'ile \'bu cezayı çalışacak` `yeni-hatları ile yeni hatları ve.
wizzwizz4

1
@ wizzwizz4: Greg sayesinde sed komutu artık tek tırnak ve ters eğik çizgilerden de kaçıyor. Ayrıca, sizin için tüm işleri yapan bir bash betiği ekledim. :-)
Tafkadasoh

1
Backticks kullanabilirsiniz `- sonra gibi ifadeler ekleyebilirsiniz ${var}- o zaman sadece kaçmanız \`ve\$
inetphantom

85

Html5rocks öğreticisi aracılığıyla ve polimer projesinde HTML5 içe aktarmalarını kontrol edin

Örneğin:

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

27
HTML içe aktarmalarının, içeriği doğrudan sayfaya dahil etmesi amaçlanmaz. Bu yanıttaki kod yalnızca üst sayfa içinde şablon olarakstuff.html kullanılabilir , ancak kullanıcı tarafından görülebilir olması için üst sayfada DOM'sinin klonlarını oluşturmak için komut dosyası kullanmanız gerekir .
14'te

1
Html5rocks.com adresindeki bir HTML sayfasının içeriğini diğerine eklemek için verilen talimatlar, henüz pek çok tarayıcıda çalışmıyor gibi görünüyor. Opera 12.16 ve Superbird Sürüm 32.0.1700.7'de (233448) etkisiz (Xubuntu 15.04'te) denedim. Firefox'ta (umarım düzeltilmiş bir hata nedeniyle) veya Chrome'un birçok sürümünde çalışmadığını duydum. Dolayısıyla, gelecekte ideal bir çözüm gibi görünse de, tarayıcılar arası bir çözüm değildir.
Brōtsyorfuzthrāx

1
Görünüşe göre 2016 sonu itibariyle FireFox'ta (45.5.1 ESR) hazır değil. JS konsol diyor: TypeError: ... .import is undefined. MDN , "Bu özellik şu anda yerel olarak hiçbir tarayıcıda uygulanmadı" diyor. Bu özellik ile FF oluşturmanın mümkün olup olmadığını bilen var mı?
sphakka

3
Firefox desteklemez. Etkinleştirmek için "dom.webcomponents.enabled" ayarını deneyin. Yalnızca güncellenebilir web görünümüne sahip Chrome ve Opera, Android'de çalışır (başlangıç ​​4.4.3). Apple tarayıcıları bunu desteklemez. Web bileşenleri için iyi bir fikir gibi görünüyor, ancak henüz geniş çapta uygulanmadı.
Maxim

9
2018'in sonlarında güncelleme: HTML ithalatı bazı nedenlerden dolayı kullanımdan kaldırılıyor
V. Rubinetti

60

Bunu yazdığım bir kütüphanenin utanmaz fişi.

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

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

Yukarıdakilerin içeriğini /path/to/include.htmlalacak ve divonunla değiştirecektir .


4
Bu, include.html gömülmüşse JavaScript'i değerlendirir mi?
Seth

1
@Seth görünmüyor. Src ile oynayacağım ve bunu yapabilir miyim bakacağım. Michael-
Marr'a

2
Parlak!!!! Sizinki, nereye ekleneceği için bir jeton olarak kullanılan div etiketini DEĞİŞTİREN tek çözüm gibi görünüyor. Kaynağı daha sonra dikkatlice inceleyeceğim !! :-)
kpollock

1
teşekkürler bu çalışır, HTML / CSS içerir ama kaynak dosyalardan Javascript içermez. Sadece nerede kullanırsanız kullanın onu tekrar eklemeniz gerekir <div data-include="/path/to/include.html"></div>. Bu araç, basit bir eklenti olmayan çok sayfalı maketi temiz bir şekilde yapmanızı kolaylaştırır.
Vincent Tang

1
bu lib'i herhangi bir uygulamada kullanabilir miyim? Yani yazara nasıl kredi verebilirim? W3School benzer bir çözüm, tek fark vardır o özyinelemeli sıra pencere yüklendiğinde çağrı .... kodunuzu ihtiyacına yönelik w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
Eppe

43

Basit bir sunucu tarafı, aynı klasörde bulunan başka bir dosyayı dahil etmek için yönerge şöyle görünür:

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

21
Sunucunuzu SSI kullanmak için yapılandırmanız gerekir
lolo

7
Sunucunuz için SSI'yı
shasi kanth

Denemeye değer olabilirdi <!--#include file="a.html" -->yanı
jimmyjudas

SSI İçerme, Web Sunucusunu biraz daha yavaş hale getirir (mutlak gerekliliğe kadar bundan kaçınılmalıdır).
Amit Verma

36

Komut dosyalarına gerek yok. Herhangi bir fantezi şeyler yapmak gerek sunucu tarafı (tho muhtemelen daha iyi bir seçenek olurdu)

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

Eski tarayıcılar kesintisiz olarak desteklenmediğinden, düzeltmek için bazı css eklemelisiniz:

iframe[seamless] {
    border: none;
}

Sorunsuz desteklemeyen tarayıcılar için, iframe'deki bir bağlantıyı tıklarsanız çerçevenin tüm pencereye değil, o url'ye gitmesini sağlayacağını unutmayın. Gezinmenin bir yolu, tüm bağlantıların sahip olması target="_parent", tarayıcı desteğinin "yeterince iyi" olması.


7
üst sayfadan css stilleri uygulanmıyor gibi görünüyor.
Randy

5
@Randy So? Bu bir artı olarak sayılabilir (özellikle kullanıcı tarafından oluşturulan içerik ve benzerleri için). Yine de önbellekleme nedeniyle başka bir istekte bulunmadan css dosyalarını yine de kolayca ekleyebilirsiniz.
bjb568

Başka bir html dosyasına bir html dosyası nasıl
eklenir

2
JQuery veya komut dosyaları OLMADAN en iyi cevap budur. Güzel bjb568 teşekkürler!
DBS

12
seamlessÖznitelik edilmiş kaldırıldı geldiği HTML taslağından. Kullanma.
Mitja

33

O zamanlar ihtiyaçlarımı karşıladığım çok eski bir çözüm , ama standartlara uygun kodu nasıl yapacağım:

<!--[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
Bu anlaşılmaktadır <object>, <embed>ve <iframe>bunun için tüm çalışır, ancak her üç durumda da kendi stil ve komut dosyası bağlamlarda ayrı belgeler oluşturmak içlerinde ziyade varsayılan açıkken tarafından ve örneğin herhangi bir bağlantı (iframe özellikle çirkin sınırlarını ve kaydırma çubukları içerir) üst sayfa (hedef = "_ üst" ile geçersiz kılsa da). Tüm bunlardan iframe, HTML5 seamlessözelliği (bjb568 tarafından bahsedilir) ile daha entegre olma umuduna sahip olan tek şeydir, ancak henüz iyi desteklenmemektedir: caniuse.com/#feat=iframe-seamless
waldyrious

2
iframe-seamless HTML standardından çıkarıldı : github.com/whatwg/html/issues/331 . Yani @waldyrious yorum artık doğru değil (yorumunuzu güncellemek ister misiniz?)
Tomáš Pospíšek

1
Uyarı için teşekkürler, @ TomášPospíšek. Artık yorumumu düzenleyemiyorum, ancak umarım cevabınız okuyuculara gerekli uyarıyı sağlar. Açıkça söylemek gerekirse, son cümle ( seamlessnitelik hakkında) tek modası geçmiş kısımdır - gerisi hala geçerlidir.
waldyrious

17

Alternatif olarak, sunucunuzdaki .htaccess dosyasına erişiminiz varsa, php'nin .html uzantısıyla biten dosyalarda yorumlanmasına izin veren basit bir yönerge ekleyebilirsiniz.

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

Şimdi aşağıdaki gibi diğer dosyaları dahil etmek için basit bir php betiği kullanabilirsiniz:

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

28
Evet, bu çok kötü bir tavsiye. Html dosyaları statiktir ve apache tarafından çok hızlı sunulur. Tüm html dosyalarını php ayrıştırıcısına dosyaları sadece inlcude olarak eklerseniz, sunucularınızda çok fazla performans sorununuz olur. Javascript yolu (jQuery veya düz JS) çok iyi çözümler değildir, ancak yine de bundan daha verimli ve daha az tehlikelidirler.
Gfra54

@ Gfra54 Apache'yi yalnızca bunun için kullanırsak performans sorunları yaşayacağımızı mı ve site için herhangi bir php çalışması yapmadığımızı mı kastediyorsunuz? Yoksa php ve bu şeyi birlikte kullanırsam yavaşlayacak mı?
user3459110

1
Dikkat: Bu satırları eklemek .htaccess, htmlsayfaların tarayıcıda görüntülemek yerine dosya olarak indirilmesine neden olabilir . Önce test edin. Feragatname: Yukarıdaki çözümü denediğimde şimdi başıma geldi. Benim .htaccessiki satır yukarıda hariç boştu. Dikkat önerilir. loloBunun yerine jQuery çözümünü deneyin (aşağıda).
cssyphus

adam daha önce yapmama rağmen kendimi zorlaştırıyordum. Hatırlatma için teşekkürler. İhtiyacım olan amaç için performansı gerçekten etkilemiyor, bu yüzden iyiyim.
Gman

Ha bu performans ezici cevap, kullanıma hazır düşünmenin harika bir örneğidir. Ben asla bunu tavsiye etmem, ama php balyoz hızlı bir bit gerektiğinde belki bir cankurtaran. :-)
moodboom

14

Bazı dosyalardan html içeriğinin dahil edilmesi gerekiyorsa, aşağıdaki çalışmalar yapılır: Örneğin, aşağıdaki satır, OBJECT tanımının oluştuğu yere piece_to_include.html içeriğini içerecektir.

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

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


2
Bir cazibe gibi çalışır ve en temiz çözümdür. Bu kabul edilen cevap olmalı.
vbocan

Katılıyorum. Sadece bir not: kendiliğinden kapanan bir nesne etiketi yapmaya çalışmayın. Bundan sonraki metin silinir.
Sridhar Sarnobat

Yeni, iç içe yerleştirilmiş <html> ve <body> etiketlerini otomatik olarak içeren yeni bir "#document" oluşturuyor gibi görünüyor. Bu benim amacım için işe yaramadı; .html dosyamda <script src = "..." type = "text / javascript"> etiketleri var; ancak JS yeni referans hataları aldı.
IAM_AL_X

12

İşte yerinde çözümüm:

(() => {
    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
vay, daha basit
Arian saputra

Gerçekten güzel ve basit bir çözüm, teşekkürler ^^
Remling

11

W3.js'de şöyle çalışır:

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

Doğru açıklama için şuraya bakın: https://www.w3schools.com/howto/howto_html_include.asp


Belgenin ne zaman yüklendiğini bilmek istiyorsanız, bunu belgenin sonuna koyabilirsiniz: <img src = "thisimagedoesnotexist.dmy" onerror = 'initDocument ()' style = 'display: none;'> Akıllı hile , ha?
Kaj Risberg

2
google chrome ile çalışmıyor.
deepcell

9

Bu bana yardımcı oldu. Html kod bloğu eklemek için b.htmliçin a.html, bu işe gitmeli headetiketine a.html:

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

Daha sonra gövde etiketinde, kabı b.htmliçine yüklemek için benzersiz bir id ve bir javascript bloğu olan bir kap yapılır:

<div id="b-placeholder">

</div>

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

6
Bu cevap, bu sorunun kabul edilen cevabından nasıl farklıdır?
Mohammad Usman

2
@MohammadUsman Burada kapsayıcı ve javascript kodu gövde etiketinde yer alırken, kabul edilen yanıt bunları kafa etiketine yerleştirir ve kapsayıcıyı yalnızca gövde etiketine bırakır.
Ramtin

Bu yeni bir cevaba değmez ... bir yorum
Kennet Celeste

8

Bu çok eski bir yazı olduğunu biliyorum, bu yüzden bazı yöntemler o zamanlar mevcut değildi. Ama işte çok basit bir yaklaşımım (Lolo'nun cevabına dayanarak).

HTML5 data- * özniteliklerine dayanır ve bu nedenle çok geneldir, çünkü her bir .class eşleştirme "load-html" dosyasını almak için jQuery'nin for-işlevini kullanır ve içeriği yüklemek için ilgili 'veri kaynağı' özniteliğini kullanır:

<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

Çok sayıda HTML İçe Aktarımı ( https://www.html5rocks.com/en/tutorials/webcomponents/imports/ ) veya bu basitleştirilmiş çözümü https://github.com/dsheiko/html-import kullanabilirsiniz

Örneğin, HTML bloğunu şu şekilde içe aktarırsınız:

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

Blok kendi ithalatına sahip olabilir:

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

İthalatçı, yönergeyi SSI gibi yüklü HTML ile değiştirir

Bu küçük JavaScript'i yüklediğiniz anda bu yönergeler otomatik olarak sunulacaktır:

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

DOM otomatik olarak hazır olduğunda içe aktarmaları işler. Ayrıca, manuel olarak çalıştırmak, günlük almak vb. İçin kullanabileceğiniz bir API sunar. Zevk almak :)


Komut dosyası satırı html dosyasında nereye gitmeli?
Andrew Truckle

BODY içinde herhangi bir yerde. Dahil edilen dosyaların içeriğine tekrar tekrar yerleştirilebilir
Dmitry Sheiko

Bunu test ettin mi?
Bhikkhu Subhuti

Kesinlikle yaptım. Aslında yıllardır kullanıyorum. Neden soruyorsun? Herhangi bir problem?
Dmitry Sheiko

Yani "anahtar" script async srcöyle görünüyor. Deneyin!
javadba

6

Çözümlerin çoğu işe yarıyor, ancak jquery ile ilgili sorunları var :

Sorun, kod $(document).ready(function () { alert($("#includedContent").text()); }uyarılarını, dahil edilen içeriği uyarmak yerine hiçbir şey izlememek.

Aşağıdaki kodu yazıyorum, benim çözümümde $(document).readyişlevde bulunan içeriğe erişebilirsiniz :

(Anahtar, dahil edilen içeriği senkronize olarak yüklemektir).

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 üzerinde eklenti içerir


Bunu kullandıktan sonra sayfa kaynağını bir tarayıcıdan görüntülerken yalnızca komut dosyasını görürsünüz. Bu, arama motorlarının sitenizi ayrıştırma yeteneğini etkilemez ve sonuçta herhangi bir SEO çabasını yok etmez mi?
hmcclungiii

Evet, bu yöntem herhangi bir SEO yok yok :)
Amir Saniyan

Daha sonra, her JavaScript tabanlı yöntem bunu yapar.
wizzwizz4

5

Adı belirtilen dosyanın içeriğini eklemek için:

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

1
[] için köşeli parantez kullanma: [! - # include virtual = "include_omega.htm" -]
St.Eve

4

Athari´nin cevabı (ilk!) Çok kesinti! Çok iyi!

Ancak URL parametresi olarak eklenecek sayfanın adını iletmek isterseniz , bu yayının aşağıdakilerle birlikte kullanılması için çok güzel bir çözümü vardır:

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

Yani böyle bir şey olur:

URL'niz:

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

A.html kodu artık haline gelir:

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

Benim için çok iyi çalıştı! Umarım yardımcı olmuştur :)


Güvenlik sorunu, çünkü birisine şu bağlantıyı gönderebilirsiniz: www.yoursite.com/a.html?p=htttp://www.linktovir.us/here.html
JoostS

4

html5rocks.com bu şeyler hakkında çok iyi bir öğretici vardır ve bu biraz geç olabilir, ama kendim bunun var olduğunu bilmiyordum. w3schools ayrıca bunu w3.js adındaki yeni kitaplıklarını kullanarak yapmanın bir yoluna sahiptir. Mesele şu ki, bu bir web sunucusu ve HTTPRequest nesnesinin kullanılmasını gerektirir. Bunları yerel olarak yükleyemez ve makinenizde test edemezsiniz. Ancak yapabileceğiniz şey, üstteki html5rocks bağlantısında sağlanan çoklu dolguları kullanmak veya eğiticilerini takip etmektir. Küçük bir JS büyüsü ile böyle bir şey yapabilirsiniz:

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

Bu bağlantıyı (önceden ayarlanmışsa istenen bağlantı öğesi olarak değiştirebilir) oluşturur, içe aktarmayı (zaten yoksa) ayarlayın ve sonra ekleyin. Daha sonra bunu alır ve dosyayı HTML'de ayrıştırır ve ardından div altında istenen öğeye ekler. Bunların tümü, ekleme öğesinden kullandığınız bağlantıya gereksinimlerinize uyacak şekilde değiştirilebilir. Umarım bu yardımcı olmuştur, jQuery veya W3.js gibi kitaplıklar ve çerçeveler kullanmadan daha yeni, daha hızlı yollar ortaya çıkarsa artık ilgisiz olabilir.

GÜNCELLEME: Bu işlem, yerel içe aktarmanın CORS politikası tarafından engellendiğini bildiren bir hata oluşturur. Derin ağın özellikleri nedeniyle bunu kullanabilmek için derin ağa erişim gerekebilir. (Pratik kullanım yok anlamına gelir)


4

İşte Getirme API ve async işlevini kullanma yaklaşımım

<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

Şimdilik görev için doğrudan bir HTML çözümü yok. Hatta HTML İçe Aktarmaları (kalıcı olarak taslakta olan ) bunu yapmayacaktır, çünkü Import! = Include ve yine de bazı JS sihirleri gerekecektir.
Son zamanlarda herhangi bir sorun yaşamadan HTML'yi HTML'ye dahil etmek için bir VanillaJS betiği yazdım .

Sadece içine yerleştirin a.html

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

Öyle open-sourcebir fikir (umarım) verebilir


3

Bunu jQuery JavaScript kütüphanesi ile şu şekilde yapabilirsiniz:

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.htmlDiğer sayfalarınızın bulunduğu alanın altında olması gerektiğini lütfen unutmayın; aksi takdirde web sayfalarınız Kökeni Kaynak Paylaşımı politikaları banner.htmlnedeniyle dosyayı reddeder .

Ayrıca, içeriğinizi JavaScript ile yüklerseniz Google'ın dizine ekleyemeyeceğini ve bu nedenle SEO nedenleriyle tam olarak iyi bir yöntem olmadığını lütfen unutmayın.


2

Bir iFrame enjeksiyonunu denediniz mi?

Belgeye iFrame'i enjekte eder ve kendini siler (daha sonra HTML DOM'de olması gerekir)

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

Saygılarımızla


1

Bu konuya benzer bir şey aramaya geldim, ancak lolo'nun yarattığı sorundan biraz farklı. Diğer sayfalara bağlantılar içeren alfabetik bir menü içeren bir HTML sayfası oluşturmak istedim ve diğer sayfaların her biri var olabilir veya olmayabilir ve oluşturulma sırası alfabetik (hatta sayısal) olmayabilir. Ayrıca, Tafkadasoh gibi, web sayfasını jQuery ile şişirmek istemedim. Sorunu araştırıp birkaç saat denedikten sonra, benim için işe yarayan şey, ilgili açıklamalar eklendi:

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

İşte harika bir makale , Ortak kitaplığı uygulayabilir ve herhangi bir HTML dosyasını bir satıra aktarmak için aşağıdaki kodu kullanabilirsiniz.

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

Google Polimer'i de deneyebilirsiniz


6
"sadece bir satırda herhangi bir HTML dosyalarını almak için aşağıdaki kodu kullanın" oldukça tuhaf. Daha sonra içe aktardığınız herhangi bir içeriği kullanmak için bazı JS yazmanız gerekir, böylece "tek satır" dan çok daha fazla olur.
skybondsor

1

Kullanılması ES6 komutu ters tırnak ``: şablon değişmezleri !

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>

Bu şekilde, tırnak işaretlemeden html ekleyebilir, DOM'dan değişkenler ekleyebilir vb.

Güçlü bir şablonlama motorudur, ayrı js dosyaları kullanabilir ve içeriği yerinde yüklemek için olayları kullanabilir, hatta yığınlardaki her şeyi ayırabilir ve istek üzerine çağırabiliriz:

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

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


1
Güzel bir örnek - neden upvotes yok (şimdiye kadar)?
javadba

Hey, haklısın, 2018'de yukarıdaki gerçek bir RTFM'nin açık bir işaretiydi;) O javascriptrozeti o zamana kadar bir hobi programcısı olarak büyük ölçüde parçaladım .
NVRM

1

Eğer bulabilir dosya csi.min.js eklemenize gerek çalışma Çözüm almak için buraya .

GitHub'da gösterilen örneğe göre, bu kütüphaneyi kullanmak için sayfa başlığınıza csi.js dosyasını eklemeniz gerekir, ardından kapsayıcıya dahil etmek istediğiniz dosyaya değer kümesi ile data-include niteliğini eklemeniz gerekir öğesi.

Kopyalama Kodunu Gizle

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

... Umarım yardımcı olur.


0

PHP, sunucu düzeyinde bir betik dilidir. Birçok şey yapabilir, ancak popüler bir kullanım, sayfalarınıza HTML dokümanlarını SSI ile aynı şekilde dahil etmektir. SSI gibi, bu da sunucu düzeyinde bir teknolojidir. Web sitenizde PHP işlevselliği olup olmadığından emin değilseniz barındırma sağlayıcınıza başvurun.

PHP'nin etkin olduğu herhangi bir web sayfasına HTML pasajı eklemek için kullanabileceğiniz basit bir PHP betiği:

Dosyaları ayırmak için sitenizin ortak öğeleri için HTML'yi kaydedin. Örneğin, gezinme bölümünüz navigation.html veya navigation.php olarak kaydedilmiş olabilir. Bu HTML'yi her sayfaya eklemek için aşağıdaki PHP kodunu kullanın.

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

Dosyayı dahil etmek istediğiniz her sayfada aynı kodu kullanın. Belirlenen dosya adını dahil etme dosyanızın adı ve yoluyla değiştirdiğinizden emin olun.


0

Django / bootle gibi bir çerçeve kullanırsanız, genellikle bazı şablon motorları gönderirler. Şişe kullandığınızı ve varsayılan şablon motorunun SimpleTemplate Engine olduğunu varsayalım . Ve aşağıda saf html dosyası var

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

Footer.tpl dosyasını ana dosyanıza ekleyebilirsiniz, örneğin:

$ cat dashboard.tpl
%include footer

Bunun yanı sıra dashborard.tpl parametrenize parametre de iletebilirsiniz.


0

Https://stackoverflow.com/a/31837264/4360308 yanıtına dayanarak şöyle I (+ + cheerio ifade) Nodejs ile bu işlevselliği uyguladık:

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 -> içeriği div'e ekler

replace -> div'in yerini alır

aynı tasarımı izleyerek kolayca daha fazla davranış ekleyebilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.