Tạo các tệp tiêu đề và chân trang để được bao gồm trong nhiều trang html


140

Tôi muốn tạo các trang tiêu đề và chân trang chung được bao gồm trên một số trang html.

Tôi muốn sử dụng javascript. Có cách nào để làm điều này chỉ bằng html và JavaScript không?

Tôi muốn tải một trang đầu trang và chân trang trong một trang html khác.


1
Bạn đang tìm kiếm ajax ... $ ('. MyEuity) .load (' urltopage.html '); điều này sẽ tải nội dung của urltopage.html trong .myEuity
Salketer

Câu trả lời:


192

Bạn có thể thực hiện điều này với jquery .

Đặt mã này vào 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>

và đặt mã này vào header.htmlfooter.html, tại cùng một vị trí vớiindex.html

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

Bây giờ, khi bạn truy cập index.html, bạn sẽ có thể nhấp vào các thẻ liên kết.


Đúng. tất cả các trang nên có cấu trúc trang này
Hariprasad Prolanx

19
tải hoặc chức năng khác nhập hoặc sử dụng local filekhông hoạt động trong phiên bản mới của Google Chrome hoặc IE, lý do: bảo mật!
Sinac

7
Đôi khi tôi tự hỏi làm thế nào mọi người thậm chí có thể thở mà không cần jQuery. Hoặc là có .breathe(in).breathe(out)đã có? Bất kỳ ngôn ngữ kịch bản là quá mức cần thiết ở đây.
Âm mưu

6
Tôi tiếp tục nhận được Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.khi tôi chạy trong chrome
digiwebguy

1
Nó là cần thiết để chạy mã trong máy chủ. Điều đó có nghĩa là url cần phải giống như "http: // .....".
Yêu nước

37

Tôi thêm các phần phổ biến làm đầu trang và chân trang bằng Server Side Bao gồm . Không có HTML và không cần JavaScript. Thay vào đó, máy chủ web sẽ tự động thêm mã được bao gồm trước khi làm bất cứ điều gì khác.

Chỉ cần thêm dòng sau vào nơi bạn muốn bao gồm tệp của mình:

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

6
tôi thích cách cổ điển này Trên thực tế, dường như không có nhiều lợi ích khi sử dụng tập lệnh để thực hiện một hành động đơn giản như vậy.
Lá Jenna

3
Trong thực tế, bao gồm các tệp sử dụng tập lệnh có nhược điểm lớn: Nó cản trở hiệu suất vì máy khách cần tải xuống trang chính, tải DOM, chạy tập lệnh và chỉ sau đó có thể tải xuống các tệp được bao gồm, yêu cầu máy chủ bổ sung cho mỗi tệp được bao gồm . Bao gồm các tệp bằng Server Side Bao gồm phục vụ tất cả các thành phần trong yêu cầu máy chủ đầu tiên, không cần có hành động máy khách nào.
Âm mưu

SSI đòi hỏi phải sử dụng một phần mở rộng tập tin của: .shtml, .stm, .shtm. Nó hoạt động trong Apache, LiteSpeed, nginx, lighttpd và IIS.
ubershmekel

@ubershmekel Như bạn đã nói, các máy chủ web có liên quan hỗ trợ SSI. Phần mở rộng tập tin không giới hạn .shtml, .stm.shtm: Trên IIS, tất cả các file phân tích cú pháp có thể chứa SSI, ví dụ .aspx. Nếu làm việc với PHP, bạn cần sử dụng PHP includehoặc virtuallệnh thay thế để đạt được kết quả tương tự.
Âm mưu

32

Bạn phải sử dụng cấu trúc tệp html với JavaScript? Bạn đã cân nhắc sử dụng PHP thay vào đó để bạn có thể sử dụng đối tượng bao gồm PHP đơn giản chưa?

Nếu bạn chuyển đổi tên tệp của các trang .html của mình thành .php - thì ở đầu mỗi trang .php của bạn, bạn có thể sử dụng một dòng mã để bao gồm nội dung từ tiêu đề.php của mình

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

Thực hiện tương tự ở chân trang của mỗi trang để bao gồm nội dung từ tệp footer.php của bạn

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

Không yêu cầu JavaScript / Jquery hoặc các tệp được bao gồm bổ sung.

NB Bạn cũng có thể chuyển đổi tệp .html của mình thành tệp .php bằng cách sử dụng tệp sau trong tệp .htaccess của bạn

# 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 không đề cập gì đến cài đặt được lưu trữ cục bộ, vì vậy tôi cho rằng anh ta đang nói về các tệp dựa trên máy chủ.
Sol

1
@Sol Tuy nhiên, OP DID đặc biệt đề cập đến việc muốn sử dụng Javascript, vì vậy câu trả lời của bạn không có chủ đề. Phát triển web đầy đủ ngăn xếp nhanh chóng chuyển sang sử dụng PHP, Node.js cung cấp tất cả các chức năng tương đương và chỉ yêu cầu sử dụng Javascript. TL; DR vui lòng trả lời các câu hỏi khi được hỏi. OP muốn có một giải pháp JS, vì vậy không phù hợp để cung cấp cho anh ấy một giải pháp PHP, Ruby, Python, C ++ hoặc bất kỳ ngôn ngữ nào khác.
Zach

9

Tôi đã thử điều này: Tạo một tiêu đề tệp.html như

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

Bây giờ bao gồm tiêu đề.html trong các trang HTML của bạn như:

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

Hoạt động hoàn toàn tốt.


1
Giải pháp tuyệt vời, nhưng tôi nghĩ rằng điều này sẽ tải khung công tác jquery hai lần, một lần cho lần tải trang ban đầu và lần thứ hai khi phương thức .load () thực thi - vì trang đích cũng chứa jquery.
Delali

8

Bạn cũng có thể đặt: (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

Tôi nghĩ rằng, câu trả lời cho câu hỏi này đã quá cũ ... hiện tại một số trình duyệt trên máy tính để bàn và thiết bị di động hỗ trợ Mẫu HTML để thực hiện việc này.

Tôi đã xây dựng một ví dụ nhỏ:

Đã kiểm tra OK trong Chrome 61.0, Opera 48.0, Opera Neon 1.0, Trình duyệt Android 6.0, Chrome Mobile 61.0 và Trình duyệt Adblocker 54.0
Đã kiểm tra KO trong Safari 10.1, Firefox 56.0, Edge 38,14 và IE 11

Thêm thông tin tương thích trong 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;
}

Bạn có thể lấy thêm ví dụ trong bài đăng trên HTML5 Rocks này


4
Nhập khẩu HTML hiện không được chấp nhận.
Jonathan Sharman

5

Tôi đã làm việc trong C # / Dao cạo và vì tôi không thiết lập IIS trên máy tính xách tay ở nhà, tôi đã tìm một giải pháp javascript để tải lượt xem trong khi tạo đánh dấu tĩnh cho dự án của chúng tôi.

Tôi tình cờ thấy một trang web giải thích các phương pháp "bỏ qua jquery", nó cho thấy một phương pháp trên trang web thực hiện chính xác những gì bạn đang tìm kiếm trong Jane javascript ( liên kết tham khảo ở cuối bài ). Hãy chắc chắn điều tra bất kỳ lỗ hổng bảo mật và các vấn đề tương thích nếu bạn có ý định sử dụng điều này trong sản xuất. Tôi thì không, vì vậy tôi không bao giờ tự nhìn vào nó.

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

Nhận nội dung

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>

lượt xem / tiêu đề.html

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

Nguồn không phải là của riêng tôi, tôi chỉ tham khảo nó vì đây là một giải pháp javascript tốt cho OP. Mã gốc tồn tại ở đây: http://eimakethings.com/ditching-jquery#get-html-from-another-page


Giải pháp tốt. Tôi thích cái này để sử dụng jquery.
Delali

2

Aloha từ năm 2018. Thật không may, tôi không có bất cứ điều gì hay ho để tương lai để chia sẻ với bạn.

Tuy nhiên, tôi đã muốn chỉ ra cho những người đã nhận xét rằng load()phương thức jQuery không hoạt động trong hiện tại có lẽ đang cố gắng sử dụng phương thức này với các tệp cục bộ mà không chạy máy chủ web cục bộ. Làm như vậy sẽ ném nêu trên "nguồn gốc chéo" lỗi, xác định rằng nguồn gốc chéo yêu cầu như đã làm theo phương pháp tải chỉ được hỗ trợ cho các chương trình giao thức như http, datahoặc https . (Tôi giả sử rằng bạn không thực hiện một yêu cầu có nguồn gốc thực sự, tức là tệp header.html thực sự nằm trên cùng một tên miền với trang bạn đang yêu cầu từ đó)

Vì vậy, nếu câu trả lời được chấp nhận ở trên không hiệu quả với bạn, vui lòng đảm bảo rằng bạn đang chạy một máy chủ web. Cách nhanh nhất và đơn giản nhất để làm điều đó nếu bạn đang vội (và sử dụng máy Mac, đã cài đặt sẵn Python) sẽ là khởi động một máy chủ Python http đơn giản. Bạn có thể thấy nó dễ dàng như thế nào để làm điều đó ở đây .

Tôi hi vọng cái này giúp được!


Tuy nhiên, việc sử dụng một máy chủ web sẽ đánh bại điểm này, ít nhất với tôi lý do chỉ sử dụng Javascript là để phát triển nó dễ dàng hơn.
Konrad Höffner

1

Cũng có thể tải tập lệnh và liên kết vào tiêu đề. Tôi sẽ thêm nó vào một trong những ví dụ trên ...

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

Một cách tiếp cận khác được đưa ra vì câu hỏi này lần đầu tiên được hỏi là sử dụng Reactrb-express (xem http://reactrb.org ) Điều này sẽ cho phép bạn viết kịch bản ruby ​​ở phía máy khách, thay thế mã html của bạn bằng các thành phần phản ứng được viết bằng ruby.


1
op yêu cầu chỉ sử dụng html và javascript nhưng bạn đưa anh ta sử dụng ruby ​​..: D lol nhưng người đàn ông công cụ tuyệt vời ..
Meily Chhon

Tôi lấy tinh thần của câu hỏi là - không có ngôn ngữ tạo khuôn mẫu máy chủ. tất cả đều được biên dịch thành Javascript vì vậy tôi tin rằng nó đáp ứng mục đích của câu hỏi.
Mitch VanDuyn

-1

Lưu HTML bạn muốn đưa vào tệp .html:

Nội dung.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>

Bao gồm HTML

Bao gồm HTML được thực hiện bằng cách sử dụng thuộc tính w3-include-html :

Thí dụ

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

Thêm JavaScript

HTML bao gồm được thực hiện bởi 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>

Gọi bao gồmHTML () ở cuối trang:

Thí dụ

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

Tôi nhận được trang trống trắng khi tôi kiểm tra index.html sau đó
Hussein Elbeheiry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.