Birden çok html sayfasına dahil edilecek üstbilgi ve altbilgi dosyaları oluşturun


141

Birkaç html sayfasında bulunan ortak üstbilgi ve altbilgi sayfaları oluşturmak istiyorum.

JavaScript kullanmak istiyorum. Bunu yalnızca html ve JavaScript kullanarak yapmanın bir yolu var mı?

Başka bir html sayfasına bir üstbilgi ve altbilgi sayfası yüklemek istiyorum.


1
Ajax'ı arıyorsunuz ... $ ('. MyElement) .load (' urltopage.html '); bu urltopage.html'nin içeriğini .myElement'e yükleyecektir
Salketer

Yanıtlar:


194

Bunu jquery ile başarabilirsiniz .

Bu kodu şuraya yerleştirin 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>

ve bu kodu içine header.htmlve footer.htmlile aynı yere yerleştirinindex.html

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

Şimdi, ziyaret index.htmlettiğinizde bağlantı etiketlerini tıklayabilmelisiniz.


Evet. tüm sayfa şu sayfa yapısına sahip olmalıdır
Hariprasad Prolanx

19
local fileGoogle Chrome veya IE'nin yeni sürümünde çalışmayan bir yükleme veya başka bir işlev , neden: güvenlik!
Sinac

7
Bazen insanların jQuery olmadan nasıl nefes alabileceğini merak ediyorum. Veya bir .breathe(in)ve .breathe(out)zaten var mı? Herhangi bir komut dosyası dili burada aşırıdır.
The Conspiracy

6
Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
Chrome'da koştuğumda

1
Kodun sunucuda çalıştırılması gerekir. Bu, url'nin "http: // ....." gibi olması gerektiği anlamına gelir.
Vatansever

37

Sunucu Tarafı Kodları kullanarak ortak parçaları üstbilgi ve altbilgi olarak ekliyorum . HTML ve JavaScript gerekmez. Bunun yerine, web sunucusu başka bir şey yapmadan önce dahil edilen kodu otomatik olarak ekler.

Dosyanızı eklemek istediğiniz yere aşağıdaki satırı eklemeniz yeterlidir:

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

6
Bu eski moda yolu seviyorum. Aslında, bu kadar basit bir eylem yapmak için komut dosyası kullanmanın pek bir faydası yok gibi görünüyor.
Jenna Yaprak

3
Aslında, bir komut dosyası kullanan dosyaları dahil etmenin büyük dezavantajları vardır: İstemcinin ana sayfayı indirmesi, DOM'u yüklemesi, komut dosyasını çalıştırması ve ancak o zaman dahil edilen dosyaları indirmesi gerektiğinden performansı engeller, bu da dahil edilen dosya başına ek bir sunucu isteği gerektirir . Sunucu Tarafı Kodları kullanılarak dosyalar dahil edildiğinde, ilk sunucu isteği sırasında tüm öğeler sunulur, herhangi bir istemci eylemi gerekmez.
Komplo

SSI bir dosya uzantısını kullanmayı gerektirir: .shtml, .stm, .shtm. Apache, LiteSpeed, nginx, lighttpd ve IIS'de çalışır.
ubershmekel

@ubershmekel Sizin de söylediğiniz gibi ilgili web sunucuları SGK'yı destekliyor. Dosya uzantısı sınırlı değildir .shtml, .stmve .shtm: IIS, tüm çözümlenen dosyalar örneğin SSI içerebilir .aspx. PHP ile çalışıyorsanız , aynı sonucu elde etmek için bunun yerine PHP includeveya virtualkomutu kullanmanız gerekir .
The Conspiracy

33

JavaScript ile html dosya yapısını kullanmak zorunda mısınız? Bunun yerine basit PHP içeren nesneyi kullanabilmek için PHP kullanmayı düşündünüz mü?

.Html sayfalarınızın dosya adlarını .php'ye dönüştürürseniz - o zaman .php sayfalarınızın her birinin üstünde header.php'nizin içeriğini eklemek için bir satır kod kullanabilirsiniz.

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

Footer.php dosyanızdaki içeriği eklemek için her sayfanın altbilgisinde aynısını yapın

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

JavaScript / Jquery veya ek dosyalar gerekmez.

NB .htaccess dosyanızda aşağıdakileri kullanarak .html dosyalarınızı .php dosyalarına da dönüştürebilirsiniz.

# 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 - OP yerel olarak barındırılan bir kurulumdan bahsetmiyor, bu yüzden sunucu tabanlı dosyalardan bahsettiğini varsaydım.
Sol

1
@Sol Bununla birlikte, OP DID özellikle Javascript kullanmak istediğinden bahsetti, bu yüzden cevabınız konu dışı. Tam yığın web geliştirme, PHP'yi kullanmaktan hızla uzaklaşıyor, Node.js tüm eşdeğer işlevselliği sağlıyor ve yalnızca Javascript'in kullanılmasını gerektiriyor. TL; DR lütfen sorulan soruları cevaplayınız. OP bir JS çözümü istedi, bu yüzden ona bir çözüm PHP, Ruby, Python, C ++ veya başka bir dil vermek uygun değil.
Zach

9

Bunu denedim: header.html gibi bir dosya oluşturun

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

Şimdi , HTML sayfalarınıza aşağıdaki gibi header.html'yi ekleyin:

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

Mükemmel çalışıyor.


1
Güzel çözüm, ancak bunun jquery çerçevesini iki kez yükleyeceğini düşünüyorum, bir kez ilk sayfa yüklemesi için ve ikincisi .load () yöntemi yürütüldüğünde - hedef sayfa da jquery içerdiğinden.
Delali

8

Ayrıca şunu da koyabilirsiniz: (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

Sanırım bu sorunun yanıtları çok eski ... şu anda bazı masaüstü ve mobil tarayıcılar bunu yapmak için HTML Şablonlarını destekliyor .

Küçük bir örnek oluşturdum:

Test Tamam Chrome 61.0, Opera 48.0, Opera Neon 1.0, Android Tarayıcı 6.0, Krom Mobile 61.0 ve AdBlocker Tarayıcı 54,0 yılında
KO test Safari 10.1'de, Firefox 56.0, Kenar 38.14 ve IE 11

Canisue.com'da daha fazla uyumluluk bilgisi

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

Bu HTML5 Rocks gönderisinde daha fazla örnek bulabilirsiniz


4
HTML İçe Aktarmaları artık kullanımdan kaldırılmıştır.
Jonathan Sharman

5

C # / Razor'da çalışıyorum ve evdeki dizüstü bilgisayarımda IIS kurulumu olmadığından projemiz için statik işaretleme oluştururken görünümleri yüklemek için bir javascript çözümü aradım.

"Jquery'den kurtulma" yöntemlerini açıklayan bir web sitesine rastladım, bu, sitedeki bir yöntemin, sade Jane javascript'te ( yazının altındaki referans bağlantısı) tam olarak aradığınız şeyi yaptığını gösteriyor . Bunu üretimde kullanmayı düşünüyorsanız, güvenlik açıklarını ve uyumluluk sorunlarını araştırdığınızdan emin olun. Değilim, bu yüzden kendim hiç araştırmadım.

JS İşlevi

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

İçeriği alın

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>

görüntüleme / başlık.html

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

Kaynak benim değil, sadece OP için iyi bir vanilya javascript çözümü olduğu için referans veriyorum. Orijinal kod burada yaşıyor: http://gomakethings.com/ditching-jquery#get-html-from-another-page


Güzel çözüm. Bunu jquery kullanmaya tercih ederim.
Delali

2

2018'den Aloha. Maalesef sizinle paylaşmak istediğim havalı veya fütüristik bir şey yok.

Bununla birlikte, jQuery load()yönteminin şu anda çalışmadığını söyleyenlere, muhtemelen yerel bir web sunucusu çalıştırmadan yöntemi yerel dosyalarla kullanmaya çalıştıklarını belirtmek istedim . Aksi fırlatır yük yöntemi ile yapılan bu sadece böyle protokol düzenleri için desteklenir olarak çapraz kökenli bu tür talep ettiğini belirtir sözü "çapraz kökenli" hatası, yukarıda http, dataya https. (Gerçek bir çapraz kaynak talebinde bulunmadığınızı varsayıyorum, yani header.html dosyası aslında istediğiniz sayfayla aynı etki alanında yer almaktadır)

Bu nedenle, kabul edilen cevap sizin için işe yaramıyorsa, lütfen bir web sunucusu çalıştırdığınızdan emin olun. Aceleniz varsa (ve Python önceden yüklenmiş bir Mac kullanıyorsanız) bunu yapmanın en hızlı ve basit yolu, basit bir Python http sunucusunu çalıştırmak olacaktır. Bunu yapmanın ne kadar kolay olduğunu buradan görebilirsiniz .

Umarım bu yardımcı olur!


Bir web sunucusu kullanmak bu noktayı aşar, en azından benim için Javascript kullanmanın nedeni onu daha kolay geliştirmektir.
Konrad Höffner

1

Başlığa komut dosyaları ve bağlantılar yüklemek de mümkündür. Yukarıdaki örneklerden birini ekleyeceğim ...

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

Bu soru ilk sorulduğundan beri mevcut olan diğer bir yaklaşım reactrb-express kullanmaktır (bkz. http://reactrb.org ) Bu, istemci tarafında ruby'de komut dosyası oluşturmanıza ve html kodunuzu ruby ​​ile yazılmış react bileşenleriyle değiştirmenize olanak tanır .


1
op sadece html ve javascript kullanarak sordu ama onu ruby ​​kullanmaya
götürüyorsunuz

Sorunun ruhunu, sunucu tarafında şablon dilleri olmadan aldım. hepsi Javascript'e derlendi, bu yüzden sorunun amacına uygun olduğuna inanıyorum.
Mitch VanDuyn

-1

Dahil etmek istediğiniz HTML'yi bir .html dosyasına kaydedin:

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'yi dahil et

HTML dahil etme, bir w3-include-html özelliği kullanılarak yapılır :

Misal

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

JavaScript'i ekleyin

HTML içerme, JavaScript ile yapılır.

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

Sayfanın altındaki includeHTML () öğesini arayın:

Misal

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

Ondan sonra index.html'yi test ettiğimde beyaz boş bir sayfa alıyorum
Hussein Elbeheiry
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.