Bao gồm một tệp HTML khác trong một tệp HTML


627

Tôi có 2 tệp HTML, giả sử a.htmlb.html. Trong a.htmltôi muốn bao gồm b.html.

Trong JSF tôi có thể làm như thế:

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

Nó có nghĩa là bên trong a.xhtmltập tin, tôi có thể bao gồm b.xhtml.

Làm thế nào chúng ta có thể làm điều đó trong *.htmltập tin?



32
KHÔNG! 2 thứ khác nhau của nó!
lolo

có liên quan, nhưng đối với localhost: stackoverflow.com/questions/7542872/ từ
cregox

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

Câu trả lời:


687

Theo tôi, giải pháp tốt nhất sử dụng 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>

Phương pháp này là một giải pháp đơn giản và sạch sẽ cho vấn đề của tôi.

.load()Tài liệu jQuery ở đây .


5
Sự khác biệt của việc thực hiện điều này `<script> $ (" # includeContent "). Load (" b.html "); </ script> là gì?
Rodrigo Ruiz

10
@RodrigoRuiz $(function(){})sẽ chỉ thực hiện sau khi tải tài liệu xong.
ProfK

8
Nếu tệp HTML đi kèm có CSS ​​được đính kèm, nó có thể làm rối kiểu trang của bạn.
Omar Jaafor 7/10/2015

6
Tôi chính xác như bạn đã đề cập. Tôi đang sử dụng bootstrap và có ghi đè css cho B.html. Khi tôi sử dụng B.html trong A.html để nó sẽ trở thành tiêu đề của A.html, tôi có thể thấy rằng css đã mất ưu tiên và có bố cục khác. Bất kỳ giải pháp cho điều này?.
Pavan Dittakavi

37
Điều này không yêu cầu một máy chủ . Khi sử dụng nó trên một tệp cục bộ: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

Mở rộng câu trả lời của lolo từ trên xuống, đây là một chút tự động hóa hơn nếu bạn phải bao gồm rất nhiều tệp:

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

Và sau đó để bao gồm một cái gì đó trong html:

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

Mà sẽ bao gồm các lượt xem tập tin / header.html và lượt xem / footer.html


Rất hữu ích. Có cách nào để chuyển một đối số thông qua một tham số dữ liệu khác, như data-argumentvà truy xuất nó trong tệp được bao gồm không?
chris

@ Chris Bạn có thể sử dụng GET params ví dụ$("#postdiv").load('posts.php?name=Test&age=25');
Nam G VU

5
Gợi ý nhỏ - bạn không cần class="include"- chỉ cần tạo bộ chọn jQuery của bạnvar includes = $('[data-include]');
jbyrd 8/12/2016

không hoạt động trên chrome với các tệp cục bộ "Yêu cầu nguồn gốc chéo chỉ được hỗ trợ cho các lược đồ giao thức: ome"
Artem Bernatskyi

2
@ArtemBernatskyi Nó có giúp gì không, khi bạn chạy một máy chủ cục bộ thay thế? Đây là một hướng dẫn dễ dàng: developer.mozilla.org/en-US/docs/Learn/Common_questions/
Kẻ

146

Giải pháp của tôi tương tự như một trong những lolo ở trên. Tuy nhiên, tôi chèn mã HTML qua document.write của JavaScript thay vì sử dụng 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>\
\
');

Lý do tôi không sử dụng jQuery là jQuery.js có kích thước ~ 90kb và tôi muốn giữ lượng dữ liệu để tải càng nhỏ càng tốt.

Để có được tệp JavaScript thoát đúng mà không cần nhiều công việc, bạn có thể sử dụng lệnh sed sau:

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

Hoặc chỉ sử dụng tập lệnh bash tiện dụng sau được xuất bản dưới dạng Gist trên Github, tự động hóa tất cả các công việc cần thiết, chuyển đổi b.htmlthành b.js: https://gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6

Tín dụng cho Greg Minshall cho lệnh sed cải tiến cũng thoát khỏi dấu gạch chéo và dấu ngoặc đơn, điều mà lệnh sed ban đầu của tôi không xem xét.

Ngoài ra, đối với các trình duyệt hỗ trợ mẫu bằng chữ, các thao tác sau cũng hoạt động:

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 Vâng, bạn nói đúng, đó là nhược điểm của giải pháp của tôi và điều đó không thanh lịch lắm. Tuy nhiên, vì bạn có thể chèn một '\' với một biểu thức chính đơn giản ở cuối mỗi dòng, điều này làm việc tốt nhất với tôi. Hmm ... có lẽ tôi nên thêm vào câu trả lời của mình cách thực hiện thao tác chèn qua regex ...
Tafkadasoh

2
Oh sheesh, thật là xấu xí - không, cảm ơn. Tôi muốn viết html của tôi dưới dạng html. Tôi không quan tâm nếu tôi có thể sử dụng sed trên dòng lệnh - tôi không muốn phải dựa vào điều đó mỗi khi tôi thay đổi nội dung của mẫu.
jbyrd

1
@ Goodra Nó nên hoạt động trên mọi HTML mà không có 'dấu trong đó. Nếu bạn chỉ thực hiện tìm / thay thế để thay thế ` with \ `THEN find / thay thế để thay thế 'bằng \'và các dòng mới bằng` `dòng mới, nó sẽ hoạt động tốt.
wizzwizz4

1
@ wizzwizz4: Nhờ Greg, lệnh sed bây giờ cũng thoát khỏi dấu ngoặc đơn và dấu gạch chéo ngược. Hơn nữa, tôi đã thêm một tập lệnh bash thực hiện tất cả công việc cho bạn. :-)
Tafkadasoh

1
Bạn có thể sử dụng backticks `- sau đó bạn có thể chèn các biểu thức như ${var}- sau đó bạn chỉ cần thoát \`\$
inetph Phantom

85

Kiểm tra nhập HTML5 thông qua hướng dẫn Html5rocks và tại dự án polymer

Ví dụ:

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

27
Nhập HTML không có nghĩa là thực sự bao gồm trực tiếp nội dung trong trang. Mã trong câu trả lời này chỉ stuff.htmlcó sẵn dưới dạng mẫu trong trang mẹ, nhưng bạn phải sử dụng tập lệnh để tạo bản sao DOM của nó trong trang mẹ để chúng hiển thị cho người dùng.
waldyrious

1
Các hướng dẫn tại html5rocks.com để chèn nội dung của một trang HTML vào một trang khác dường như không hoạt động trong nhiều trình duyệt ngoài đó. Tôi đã thử nó trong Opera 12.16 và Superbird Phiên bản 32.0.1700.7 (233448) mà không có hiệu lực (trên Xubfox 15.04). Tuy nhiên, tôi nghe nói nó không hoạt động trong Firefox (do lỗi đã được sửa) hoặc rất nhiều phiên bản Chrome. Vì vậy, mặc dù có vẻ như nó có thể là một giải pháp lý tưởng trong tương lai, nhưng nó không phải là một giải pháp đa trình duyệt.
Brōtsyorfuzthrāx

1
Rõ ràng là chưa sẵn sàng vào cuối năm 2016 trong FireFox (45.5.1 ESR). Bảng điều khiển JS nói : TypeError: ... .import is undefined. MDN cho biết "Tính năng này không được triển khai trong mọi trình duyệt nguyên bản tại thời điểm này." Có ai biết nếu có thể xây dựng FF với tính năng này không?
sphakka

3
Firefox sẽ không hỗ trợ nó. Để kích hoạt nó, hãy thử đặt "dom.webcomponents.enables". Nó sẽ chỉ hoạt động trong Chrome và Opera, Android với chế độ xem web có thể cập nhật (bắt đầu 4.4.3). Các trình duyệt của Apple không hỗ trợ nó. Có vẻ như đó là một ý tưởng hay cho các thành phần web nhưng chưa được triển khai rộng rãi.
Maxim

9
Cập nhật cuối năm 2018: Nhập khẩu HTML dường như không
V. Rubinetti

60

Ổ cắm không biết xấu hổ của một thư viện mà tôi đã viết giải quyết này.

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

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

Ở trên sẽ lấy nội dung /path/to/include.htmlvà thay thế divbằng nó.


4
Điều này sẽ đánh giá JavaScript nếu include.html có được nhúng không?
Seth

1
@ Có vẻ như không phải vậy. Tôi sẽ chơi xung quanh với src và xem liệu tôi có thể làm cho nó làm điều đó không. Cảm ơn michael-marr
xandout

2
Xuất sắc!!!! Bạn dường như là giải pháp duy nhất thay thế thẻ div được sử dụng làm mã thông báo cho vị trí cần chèn. Tôi sẽ nghiên cứu kỹ về nguồn sau !! :-)
kpollock

1
cảm ơn vì điều này hoạt động, nó bao gồm HTML / CSS nhưng không bao gồm Javascript từ các tệp nguồn. Bạn chỉ cần bao gồm nó một lần nữa bất cứ nơi nào bạn sử dụng <div data-include="/path/to/include.html"></div>. Công cụ này giúp dễ dàng thực hiện một mockup nhân nhiều plugin đơn giản một cách sạch sẽ.
Vincent Tang

1
Tôi có thể sử dụng lib này trong bất kỳ ứng dụng nào không? Tôi có nghĩa là làm thế nào có thể tín dụng các tác giả? W3School có giải pháp tương tự, chỉ khác là mã của bạn phục vụ cuộc gọi đệ quy khi tải cửa sổ nữa .... w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
yeppe 20/12/18

43

Một phía máy chủ đơn giản bao gồm chỉ thị để bao gồm một tệp khác được tìm thấy trong cùng thư mục trông như thế này:

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

21
Bạn cần định cấu hình máy chủ của mình để sử dụng SSI
lolo

7
Dưới đây là tài liệu tham khảo để định cấu hình SSI cho máy chủ của bạn: httpd.apache.org/docs/2.4/howto/ssi.html#configuring
shasi kanth

Có thể là giá trị cố gắng <!--#include file="a.html" -->cũng
jimmyjudas

Sự bao gồm của SSI làm cho Máy chủ Web chậm hơn một chút (vì vậy nên tránh cho đến khi cần thiết tuyệt đối).
Amit Verma

36

Không cần kịch bản. Không cần phải làm bất kỳ công cụ ưa thích nào phía máy chủ (tho có lẽ sẽ là một lựa chọn tốt hơn)

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

Vì các trình duyệt cũ không hỗ trợ liền mạch, bạn nên thêm một số css để sửa lỗi:

iframe[seamless] {
    border: none;
}

Hãy nhớ rằng đối với các trình duyệt không hỗ trợ liền mạch, nếu bạn nhấp vào một liên kết trong iframe, nó sẽ làm cho khung đi đến url đó, chứ không phải toàn bộ cửa sổ. Một cách để khắc phục điều đó là có tất cả các liên kết target="_parent", tho hỗ trợ trình duyệt là "đủ tốt".


7
nó dường như không áp dụng kiểu css từ trang mẹ chẳng hạn.
Randy

5
@Randy Vậy sao? Điều này có thể được tính là một điểm cộng (đặc biệt đối với nội dung do người dùng tạo và tương tự). Bạn có thể dễ dàng bao gồm các tệp css một lần nữa mà không cần thực hiện một yêu cầu khác vì bộ nhớ đệm nào.
bjb568

Đã trả lời nhu cầu của tôi cho câu trả lời cho câu hỏi này - cách đưa tệp html vào một tệp html khác ...
Grimxn

2
Đó là câu trả lời tốt nhất mà KHÔNG CÓ JQuery hoặc các tập lệnh. Đẹp bjb568 cảm ơn!
DBS

12
Các seamlessthuộc tính đã được loại bỏ khỏi dự thảo HTML nó đến từ đâu. Đừng sử dụng nó.
Mitja

33

Một giải pháp rất cũ tôi đã đáp ứng nhu cầu của tôi hồi đó, nhưng đây là cách thực hiện mã tuân thủ tiêu chuẩn:

<!--[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
Dường như <object>, <embed><iframe>tất cả đều hoạt động cho điều này, nhưng trong cả ba trường hợp, họ tạo ra các tài liệu riêng biệt với bối cảnh kịch bản và kiểu chữ riêng (iframe đặc biệt bao gồm các đường viền và thanh cuộn xấu xí), và ví dụ, bất kỳ liên kết nào mặc định mở trong chúng thay vì trên trang mẹ (mặc dù điều này có thể được ghi đè bằng target = "_ Parent"). Từ tất cả những điều này, iframe là người duy nhất có hy vọng được tích hợp nhiều hơn thông qua seamlessthuộc tính HTML5 (được đề cập bởi bjb568), nhưng nó vẫn chưa được hỗ trợ tốt: caniuse.com/#feat=iframe-siền
waldyrious

2
iframe-liền mạch đã bị loại bỏ khỏi tiêu chuẩn HTML: github.com/whatwg/html/issues/331 . Vì vậy, bình luận @waldyrious không còn đúng nữa (bạn có muốn cập nhật nhận xét của mình không?)
Tomáš Pospíšek

1
Cảm ơn bạn đã ủng hộ, @ TomášPospíšek. Tôi không thể chỉnh sửa nhận xét của mình nữa, nhưng hy vọng phản hồi của bạn cung cấp sự cảnh báo cần thiết cho độc giả. Để rõ ràng, câu cuối cùng (về seamlessthuộc tính) là phần lỗi thời duy nhất - phần còn lại vẫn được áp dụng.
waldyrious

17

Cách khác, nếu bạn có quyền truy cập vào tệp .htaccess trên máy chủ của mình, bạn có thể thêm một lệnh đơn giản cho phép php được diễn giải trên các tệp kết thúc bằng phần mở rộng .html.

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

Bây giờ bạn có thể sử dụng tập lệnh php đơn giản để bao gồm các tệp khác, chẳng hạn như:

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

28
Vâng, đó là một lời khuyên rất xấu. Các tệp Html là tĩnh và được phục vụ bởi apache rất nhanh. Nếu bạn thêm tất cả các tệp html vào trình phân tích cú pháp php chỉ vào các tệp inlcude, bạn sẽ gặp nhiều vấn đề về hiệu năng trên các máy chủ của mình. Cách javascript (jQuery hoặc JS đơn giản) không phải là giải pháp rất tốt, nhưng chúng vẫn hiệu quả hơn và ít nguy hiểm hơn cách này.
Gfra54

@ Gfra54 Bạn có nghĩa là chúng tôi sẽ gặp vấn đề về hiệu năng nếu chúng tôi chỉ sử dụng Apache cho việc này và chúng tôi không thực hiện bất kỳ công việc php nào cho trang web? Hoặc nó sẽ chậm lại nếu tôi sử dụng php và thứ này cùng nhau?
dùng3459110

1
Thận trọng: Việc thêm các dòng này vào .htaccesscó thể khiến htmlcác trang cố tải xuống dưới dạng tệp thay vì xem trong trình duyệt. Kiểm tra trước. Tuyên bố miễn trừ trách nhiệm: Điều đó vừa xảy ra với tôi khi tôi thử giải pháp trên. My .htaccessđã trống, ngoại trừ hai dòng trên. Thận trọng. loloThay vào đó, hãy thử giải pháp jQuery (bên dưới).
cssyphus

Tôi đã làm phức tạp bản thân mình mặc dù tôi đã làm điều đó trước đây. Cảm ơn đã nhắc nhở. Với mục đích tôi cần, nó không thực sự ảnh hưởng đến hiệu suất nên tôi rất tuyệt.
Gman

Câu trả lời hiệu suất này là một ví dụ tuyệt vời về tư duy vượt trội. Tôi sẽ không bao giờ đề xuất nó, nhưng có lẽ là cứu cánh khi bạn cần một chút nhanh chóng của php sledgehammer. :-)
psychboom

14

Các công việc sau đây nếu nội dung html từ một số tệp cần được đưa vào: Chẳng hạn, dòng sau sẽ bao gồm nội dung của mảnh_to_include.html tại vị trí xảy ra định nghĩa ĐỐI TƯỢNG.

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

Tham khảo: http://www.w3.org/TR/WD-html40-970708/struct/includes.html#h-7.7.4


2
Hoạt động như một bùa mê và đó là giải pháp sạch nhất. Đây phải là câu trả lời được chấp nhận.
vbocan

Đồng ý. Chỉ cần một lưu ý: đừng cố làm thẻ đối tượng tự đóng. Các văn bản sau khi nó sẽ bị xóa.
Sridhar Sarnobat

Nó dường như tạo ra một "#document" mới tự động chứa các thẻ <html> và <body> mới, lồng nhau. Điều này đã không làm việc cho mục đích của tôi; tệp .html của tôi chứa các thẻ <script src = "..." type = "text / javascript">; nhưng JS có lỗi tham chiếu mới.
IAM_AL_X

12

Đây là giải pháp tại chỗ của tôi:

(() => {
    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
woow, nó đơn giản hơn
Arian saputra

Giải pháp thực sự tốt và đơn giản, cảm ơn ^^
Remling

11

Trong w3.js bao gồm các tác phẩm như thế này:

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

Để biết mô tả thích hợp, hãy xem phần này: https://www.w3schools.com/howto/howto_html_include.asp


Nếu bạn muốn biết khi tài liệu đã được tải, bạn có thể đặt tài liệu này ở cuối tài liệu: <img src = "thisimagedoesnotexist.dmy" onerror = 'initDocument ()' style = 'display: none;'> Thủ thuật thông minh , Hở?
Kaj Risberg

2
không hoạt động với google chrome.
Deepcell

9

Đây là những gì đã giúp tôi. Để thêm một khối mã html từ b.htmlđến a.html, điều này sẽ đi vào headthẻ của a.html:

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

Sau đó, trong thẻ body, một container được tạo với một id duy nhất và một khối javascript để tải b.htmlvào container, như sau:

<div id="b-placeholder">

</div>

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

6
Câu trả lời này khác với câu trả lời được chấp nhận của câu hỏi này như thế nào?
Mohammad Usman

2
@MohammadUsman Ở đây, mã vùng chứa và mã javascript nằm trong thẻ body trong khi câu trả lời được chấp nhận đặt chúng vào thẻ head và chỉ để lại vùng chứa trong thẻ body.
Ramtin

Điều này không đáng để trả lời mới ... đó là một nhận xét
Kennet Celeste

8

Tôi biết đây là một bài viết rất cũ, vì vậy một số phương pháp không có sẵn trước đó. Nhưng đây là cách làm rất đơn giản của tôi (dựa trên câu trả lời của Lolo).

Nó phụ thuộc vào các thuộc tính dữ liệu HTML5 * và do đó rất chung chung là sử dụng hàm for-every của jQuery để lấy mọi "lớp-html" khớp với nhau và sử dụng thuộc tính 'nguồn dữ liệu' tương ứng của nó để tải nội dung:

<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

Bạn có thể sử dụng một polyfill của Nhập khẩu HTML ( https://www.html5rocks.com/en/tutorials/webcomponents/imports/ ) hoặc giải pháp đơn giản đó https://github.com/dsheiko/html-import

Ví dụ: trên trang bạn nhập khối HTML như thế:

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

Các khối có thể có nhập khẩu của riêng mình:

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

Nhà nhập khẩu thay thế chỉ thị bằng HTML được tải khá giống như SSI

Các chỉ thị này sẽ được cung cấp tự động ngay khi bạn tải JavaScript nhỏ này:

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

Nó sẽ xử lý việc nhập khi DOM sẵn sàng tự động. Ngoài ra, nó hiển thị một API mà bạn có thể sử dụng để chạy thủ công, để nhận nhật ký, v.v. Thưởng thức :)


Dòng script nên đi đâu trong Tệp html?
Andrew Truckle

Bất cứ nơi nào trong CƠ THỂ. Có thể được đặt đệ quy trong nội dung của các tệp được bao gồm
Dmitry Sheiko

Bạn đã kiểm tra điều này?
Tỳ kheo Subhuti

Chắc chắn tôi đã làm. Tôi đã thực sự sử dụng nó trong nhiều năm. Tại sao lại hỏi? Có vấn đề gì không?
Dmitry Sheiko

Vì vậy, "chìa khóa" cho điều này là script async srcdường như. Hãy thử nó!
javadba

6

Hầu hết các giải pháp hoạt động nhưng chúng có vấn đề với jquery :

Vấn đề là $(document).ready(function () { alert($("#includedContent").text()); }không có cảnh báo mã nào thay vì cảnh báo nội dung được bao gồm.

Tôi viết mã dưới đây, trong giải pháp của tôi, bạn có thể truy cập vào nội dung được bao gồm trong $(document).readyhàm:

(Khóa đang tải nội dung bao gồm đồng bộ).

chỉ số.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>

bao gồm.inc :

<div id="test">
    There is no issue between this solution and jquery.
</div>

jquery bao gồm plugin trên github


Khi sử dụng cái này và sau đó xem nguồn trang từ trình duyệt, bạn chỉ thấy tập lệnh. Điều này không ảnh hưởng đến khả năng phân tích trang web của công cụ tìm kiếm, cuối cùng sẽ phá hủy mọi nỗ lực SEO?
hmcclungiii

Có, phương pháp này phá hủy mọi SEO :)
Amir Saniyan

Sau đó, một lần nữa, mọi phương thức dựa trên JavaScript đều làm như vậy.
wizzwizz4

5

Để chèn nội dung của tệp được đặt tên:

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

1
sử dụng dấu ngoặc góc cho []: [! - # bao gồm virtual = "include_omega.htm" -]
St.Eve

4

Câu trả lời của Athari (lần đầu tiên!) Là quá nhiều kết luận! Rất tốt!

Nhưng nếu bạn muốn chuyển tên của trang để được đưa vào làm tham số URL , bài đăng này có một giải pháp rất hay được sử dụng kết hợp với:

http://www.jquerybyexample.net/2012/06/get-url-parameter-USE-jquery.html

Vì vậy, nó trở thành một cái gì đó như thế này:

URL của bạn:

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

Các a.html mã bây giờ trở thành:

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

Nó làm việc rất tốt cho tôi! Tôi hy vọng đã giúp :)


Vấn đề bảo mật, vì bạn có thể gửi cho ai đó liên kết này: www.yoursite.com/a.html?p=htttp://www.linktovir.us/here.html
JoostS

4

html5rocks.com có một hướng dẫn rất tốt về công cụ này và điều này có thể hơi muộn, nhưng bản thân tôi không biết điều này tồn tại. w3schools cũng có một cách để làm điều này bằng thư viện mới của họ được gọi là w3.js. Vấn đề là, điều này đòi hỏi phải sử dụng máy chủ web và đối tượng HTTPRequest. Bạn thực sự không thể tải chúng cục bộ và kiểm tra chúng trên máy của bạn. Mặc dù vậy, những gì bạn có thể làm là sử dụng các polyfill được cung cấp trên liên kết html5rocks ở đầu hoặc làm theo hướng dẫn của họ. Với một chút phép thuật JS, bạn có thể làm một cái gì đó như thế này:

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

Điều này sẽ làm cho liên kết (Có thể thay đổi thành thành phần liên kết mong muốn nếu đã được đặt), đặt nhập (trừ khi bạn đã có nó), sau đó nối thêm nó. Sau đó, nó sẽ lấy tệp đó và phân tích tệp trong HTML, sau đó nối nó vào phần tử mong muốn dưới một div. Tất cả điều này có thể được thay đổi để phù hợp với nhu cầu của bạn từ yếu tố nối thêm vào liên kết bạn đang sử dụng. Tôi hy vọng điều này có ích, bây giờ nó có thể không liên quan nếu các cách mới hơn, nhanh hơn đã xuất hiện mà không sử dụng các thư viện và khung như jQuery hoặc W3.js.

CẬP NHẬT: Điều này sẽ đưa ra một lỗi cho biết rằng nhập nội bộ đã bị chặn bởi chính sách CORS. Có thể cần truy cập vào web sâu để có thể sử dụng điều này vì các thuộc tính của web sâu. (Có nghĩa là không sử dụng thực tế)


4

Đây là cách tiếp cận của tôi bằng cách sử dụng hàm Fetch API và async

<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

Hiện tại không có giải pháp HTML trực tiếp cho nhiệm vụ. Ngay cả Nhập khẩu HTML ( dự thảo vĩnh viễn ) sẽ không thực hiện được điều đó, bởi vì Nhập! = Bao gồm và một số phép thuật JS sẽ được yêu cầu bằng mọi cách.
Gần đây tôi đã viết một kịch bản VanillaJS chỉ để đưa HTML vào HTML, không có bất kỳ sự phức tạp nào.

Chỉ cần đặt trong của bạn a.html

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

Đó là open-sourcevà có thể đưa ra một ý tưởng (tôi hy vọng)


3

Bạn có thể làm điều đó với thư viện jQuery của jQuery như thế này:

HTML:

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

JS:

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

Xin lưu ý rằng banner.htmlphải được đặt trong cùng một tên miền mà các trang khác của bạn nằm trong nếu không các trang web của bạn sẽ từ chối banner.htmltệp do Chia sẻ tài nguyên nguồn gốc chéo chính sách .

Ngoài ra, xin lưu ý rằng nếu bạn tải nội dung của mình bằng JavaScript, Google sẽ không thể lập chỉ mục cho nó để nó không chính xác là một phương pháp tốt cho lý do SEO.


2

Bạn đã thử tiêm iFrame chưa?

Nó tiêm iFrame trong tài liệu và xóa chính nó (được cho là sau đó trong DOM DOM)

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

Trân trọng


1

Tôi đến chủ đề này để tìm kiếm một cái gì đó tương tự, nhưng một chút khác biệt với vấn đề được đặt ra bởi lolo. Tôi muốn xây dựng một trang HTML chứa một menu chữ cái liên kết đến các trang khác và mỗi trang khác có thể tồn tại hoặc không tồn tại, và thứ tự chúng được tạo có thể không phải là bảng chữ cái (thậm chí là số). Ngoài ra, giống như Tafkadasoh, tôi không muốn làm mờ trang web bằng jQuery. Sau khi nghiên cứu vấn đề và thử nghiệm trong vài giờ, đây là những gì làm việc cho tôi, với những nhận xét liên quan được thêm vào:

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

Đây là một bài viết tuyệt vời , Bạn có thể triển khai thư viện chung và chỉ cần sử dụng mã bên dưới để nhập bất kỳ tệp HTML nào trong một dòng.

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

Bạn cũng có thể dùng thử Google Polymer


6
"Chỉ sử dụng mã dưới đây để nhập bất kỳ tệp HTML nào trong một dòng" là không rõ ràng. Sau đó, bạn phải viết một số JS để sử dụng bất kỳ nội dung nào bạn đã nhập, vì vậy nó kết thúc theo cách nhiều hơn "một dòng".
skybondsor

1

Sử dụng backticks ES6 ``: mẫu chữ !

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>

Bằng cách này, chúng tôi có thể bao gồm html mà không cần trích dẫn mã hóa, bao gồm các biến từ DOM, v.v.

Nó là một công cụ tạo khuôn mẫu mạnh mẽ, chúng ta có thể sử dụng các tệp js riêng biệt và sử dụng các sự kiện để tải nội dung tại chỗ hoặc thậm chí tách mọi thứ trong khối và gọi theo yêu cầu:

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

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


1
Ví dụ hay - tại sao không có upvote (cho đến bây giờ)?
javadba

Này, bạn đã đúng, năm 2018 ở trên là một dấu hiệu rõ ràng về một RTFM thực sự tốt;) Tôi đã phá vỡ javascripthuy hiệu đó như một lập trình viên sở thích cho đến lúc đó.
NVRM

1

Để giải pháp hoạt động, bạn cần bao gồm tệp csi.min.js, bạn có thể định vị ở đây .

Theo ví dụ được hiển thị trên GitHub, để sử dụng thư viện này, bạn phải bao gồm tệp csi.js trong tiêu đề trang của mình, sau đó bạn cần thêm thuộc tính bao gồm dữ liệu với giá trị được đặt vào tệp bạn muốn đưa vào trong vùng chứa thành phần.

Ẩn mã sao chép

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

... hy vọng nó giúp.


0

PHP là một ngôn ngữ kịch bản cấp máy chủ. Nó có thể làm nhiều việc, nhưng một cách sử dụng phổ biến là bao gồm các tài liệu HTML bên trong các trang của bạn, giống như SSI. Giống như SSI, đây là một công nghệ cấp máy chủ. Nếu bạn không chắc chắn nếu bạn có chức năng PHP trên trang web của bạn, hãy liên hệ với nhà cung cấp dịch vụ lưu trữ của bạn.

Đây là một đoạn mã PHP đơn giản mà bạn có thể sử dụng để bao gồm một đoạn mã HTML trên bất kỳ trang web hỗ trợ PHP nào:

Lưu HTML cho các thành phần phổ biến của trang web của bạn để tách các tệp. Ví dụ: phần điều hướng của bạn có thể được lưu dưới dạng navigation.html hoặc navigation.php. Sử dụng mã PHP sau để đưa HTML đó vào mỗi trang.

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

Sử dụng cùng mã đó trên mỗi trang mà bạn muốn bao gồm tệp. Đảm bảo thay đổi tên tệp higlighted thành tên và đường dẫn đến tệp đính kèm của bạn.


0

Nếu bạn sử dụng một số khung như django / bootle, họ thường gửi một số công cụ mẫu. Giả sử bạn sử dụng chai và công cụ mẫu mặc định là Công cụ SimpleTemplate . Và dưới đây là tệp html thuần túy

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

Bạn có thể bao gồm footer.tpl trong tệp chính của mình, như:

$ cat dashboard.tpl
%include footer

Bên cạnh đó, bạn cũng có thể truyền tham số cho dashborard.tpl của mình.


0

Dựa trên câu trả lời của https://stackoverflow.com/a/31837264/4360308 Tôi đã triển khai chức năng này với Nodejs (+ express + cheio) như sau:

HTML (index.html)

<div class="include" data-include="componentX" data-method="append"></div>
<div class="include" data-include="componentX" data-method="replace"></div>

Mã não

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

chắp thêm -> bao gồm nội dung vào div

thay thế -> thay thế div

bạn có thể dễ dàng thêm nhiều hành vi theo cùng một thiết kế

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.