รวมไฟล์ HTML อื่นในไฟล์ HTML


626

ฉันมี 2 ไฟล์ HTML, คิดและa.html b.htmlในฉันต้องการที่จะรวมa.htmlb.html

ใน JSF ฉันสามารถทำได้เช่นนั้น:

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

มันหมายความว่าภายในว่าไฟล์ที่ฉันสามารถรวมa.xhtmlb.xhtml

เราจะทำมันใน*.htmlไฟล์ได้อย่างไร?


5
อาจเป็นไปได้ซ้ำกับ Equivalent of include () ใน HTML
Wesley Murch

32
NO! มันต่างกัน 2 อย่าง!
lolo

ที่เกี่ยวข้อง แต่สำหรับlocalhost: stackoverflow.com/questions/7542872/…
cregox

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

ดูโมดูล HTML github.com/w3c/webcomponents/blob/gh-pages/proposals/ …และgroups.google.com/a/chromium.org/forum/#!msg/blink-dev/และgithub.com/w3c / webcomponents / blob / gh-pages / ข้อเสนอ / ...และการอภิปรายเบื้องหลังที่github.com/w3c/webcomponents/issues/645และการอภิปรายปัญหาบางอย่างที่github.com/w3c/webcomponents/issues/783
sideshowbarker

คำตอบ:


687

ในความคิดของฉันทางออกที่ดีที่สุดใช้ 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>

วิธีนี้เป็นวิธีที่ง่ายและสะอาดในการแก้ไขปัญหาของฉัน

jQuery .load()เอกสารที่นี่


5
อะไรคือความแตกต่างของการทำเพียงแค่ `<script> $ (" # includedContent "). load (" b.html "); </script>?
Rodrigo Ruiz

10
@RodrigoRuiz $(function(){})จะดำเนินการหลังจากที่เอกสารเสร็จสิ้นการโหลด
ProfK

8
หากไฟล์ HTML ที่รวมมานั้นมี CSS ติดอยู่อาจทำให้รูปแบบหน้าเว็บของคุณยุ่งเหยิง
Omar Jaafor

6
ฉันเหมือนกับที่คุณพูดถึง ฉันใช้ bootstrap และมีการเขียนทับ css สำหรับ B.html เมื่อฉันใช้ B.html ใน A.html เพื่อให้มันกลายเป็นส่วนหัวของ A.html ฉันจะเห็นว่า css สูญเสียความสำคัญและมีเค้าโครงที่แตกต่างกัน ทางออกใดบ้างในเรื่องนี้?
Pavan Dittakavi

37
นี้ไม่จำเป็นต้องเซิร์ฟเวอร์ เมื่อใช้งานบนไฟล์โลคอล: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

ขยายคำตอบของโลโลจากด้านบนนี่คือระบบอัตโนมัติที่น้อยกว่าถ้าคุณต้องรวมไฟล์จำนวนมาก:

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

จากนั้นให้รวมบางสิ่งใน html:

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

ซึ่งจะรวมถึงมุมมองไฟล์ / header.html และ views / footer.html


มีประโยชน์มาก. มีวิธีการโต้แย้งผ่านพารามิเตอร์ข้อมูลอื่นเช่นdata-argumentและดึงมันในไฟล์รวม?
Chris

@chris คุณสามารถใช้ GET params ได้เช่น$("#postdiv").load('posts.php?name=Test&age=25');
Nam G VU

5
ข้อเสนอแนะเล็ก ๆ - คุณไม่จำเป็นต้องclass="include"ทำเพียงเลือก jQuery ของคุณvar includes = $('[data-include]');
jbyrd

ไม่ทำงานกับโครมที่มีไฟล์ในตัวเครื่อง "การร้องขอข้ามที่มารองรับเฉพาะกับโครงร่างโปรโตคอล: htt"
Artem Bernatskyi

2
@ArtemBernatskyi มันช่วยได้ไหมเมื่อคุณเรียกใช้เซิร์ฟเวอร์ในพื้นที่แทน นี่คือบทแนะนำง่ายๆ: developer.mozilla.org/en-US/docs/Learn/Common_questions/
......

146

ทางออกของฉันคล้ายกับหนึ่งในโลโลด้านบน อย่างไรก็ตามฉันใส่รหัส HTML ผ่าน JavaScript ของ document.write แทนที่จะใช้ 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>\
\
');

เหตุผลที่ฉันต่อต้านการใช้ jQuery ก็คือ jQuery.js มีขนาด ~ 90kb และฉันต้องการรักษาปริมาณข้อมูลที่จะโหลดให้มีขนาดเล็กที่สุดเท่าที่จะทำได้

เพื่อให้ได้ไฟล์ JavaScript ที่ใช้งานได้อย่างถูกต้องคุณสามารถใช้คำสั่ง sed ต่อไปนี้:

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

หรือเพียงแค่ใช้สคริปต์ทุบตีที่มีประโยชน์ต่อไปนี้เผยแพร่เป็น Gist ใน Github ซึ่งจะทำงานที่จำเป็นทั้งหมดโดยอัตโนมัติโดยแปลงb.htmlเป็นb.js: https://gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6

ให้เครดิตกับGreg Minshallสำหรับคำสั่ง sed ที่ได้รับการปรับปรุงซึ่งยังสามารถหลบหลีก slashes และเครื่องหมายคำพูดเดี่ยวซึ่งคำสั่ง sed ดั้งเดิมของฉันไม่ได้พิจารณาด้วย

อีกทางเลือกหนึ่งสำหรับเบราว์เซอร์ที่รองรับเทมเพลตตัวอักษรต่อไปนี้ใช้งานได้:

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
@ เทรเวอร์มิกกี้ใช่คุณพูดถูกนั่นคือข้อเสียของโซลูชันของฉันและนั่นก็ไม่ได้ดูดีมาก อย่างไรก็ตามในขณะที่คุณสามารถแทรก '\' ด้วย regex ง่าย ๆ ที่ตอนท้ายของแต่ละบรรทัดมันใช้งานได้ดีที่สุดสำหรับฉัน อืม ... บางทีฉันควรเพิ่มคำตอบของฉันวิธีการทำแทรกผ่าน regex ...
Tafkadasoh

2
โอ้เชเชว่ามันน่าเกลียด - ไม่ขอบคุณ ฉันควรเขียน html ของฉันเป็น html ฉันไม่สนใจว่าฉันสามารถใช้ sed บนบรรทัดคำสั่งได้หรือไม่ - ฉันไม่ต้องการที่จะเชื่อใจในทุกครั้งที่ฉันเปลี่ยนเนื้อหาของเทมเพลต
jbyrd

1
@Goodra มันควรทำงานกับ HTML ใด ๆ โดยไม่ต้องมี'เครื่องหมาย หากคุณเพิ่งค้นหา / แทนที่เพื่อแทนที่` with \ 'จากนั้นหา / แทนที่เพื่อแทนที่'ด้วย\'และขึ้นบรรทัดใหม่ด้วยบรรทัดใหม่' `มันจะทำงานได้ดี
wizzwizz4

1
@ wizzwizz4: ขอบคุณ Greg คำสั่ง sed ในขณะนี้ก็สามารถหลีกเลี่ยงการเสนอราคาและแบ็กสแลชเดี่ยว นอกจากนี้ฉันได้เพิ่มสคริปต์ทุบตีที่ทำงานทั้งหมดให้คุณ :-)
Tafkadasoh

1
คุณสามารถใช้ backticks `- จากนั้นคุณสามารถแทรกการแสดงออกเช่น${var}- จากนั้นคุณจะต้องหลบหนี\`และ\$
inetphantom

85

ชำระเงินการนำเข้า HTML5 ผ่านบทช่วยสอน Html5rocks และที่โครงการโพลิเมอร์

ตัวอย่างเช่น:

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

27
การนำเข้า HTML ไม่ได้หมายถึงการรวมเนื้อหาในหน้าโดยตรง รหัสในคำตอบนี้stuff.htmlให้บริการเป็นเทมเพลตในหน้าหลักเท่านั้น แต่คุณต้องใช้สคริปต์เพื่อสร้างโคลนของ DOM ในหน้าหลักเพื่อให้ผู้ใช้สามารถมองเห็นได้
waldyrious

1
คำแนะนำที่ html5rocks.com สำหรับการแทรกเนื้อหาของหน้า HTML หนึ่งไปยังอีกหน้าหนึ่งดูเหมือนจะไม่สามารถใช้งานได้ในเบราว์เซอร์จำนวนมาก ฉันลองใน Opera 12.16 และ Superbird เวอร์ชัน 32.0.1700.7 (233448) โดยไม่มีผลกระทบ (บน Xubuntu 15.04) ฉันได้ยินมาว่ามันใช้งานไม่ได้ใน Firefox (เนื่องจากข้อผิดพลาดที่หวังว่าจะได้รับการแก้ไข) หรือ Chrome จำนวนมาก ดังนั้นในขณะที่ดูเหมือนว่ามันอาจเป็นทางออกที่ดีที่สุดในอนาคต แต่ก็ไม่ใช่โซลูชันข้ามเบราว์เซอร์
Brōtsyorfuzthrāx

1
เห็นได้ชัดว่ายังไม่พร้อม ณ สิ้นปี 2559 ใน FireFox (45.5.1 ESR) JS TypeError: ... .import is undefinedคอนโซลพูดว่า: MDNกล่าวว่า "คุณลักษณะนี้ไม่ได้ใช้งานในเบราว์เซอร์ใด ๆ ในตอนนี้" ใครบ้างรู้ว่ามันเป็นไปได้ที่จะสร้าง FF ด้วยคุณสมบัตินี้หรือไม่?
sphakka

3
Firefox จะไม่รองรับ หากต้องการเปิดใช้งานให้ลองตั้งค่า "dom.webcomponents.enabled" มันจะทำงานเฉพาะใน Chrome และ Opera, Android ที่มีมุมมองเว็บที่อัปเดตได้ (startng 4.4.3) เบราว์เซอร์ของ Apple ไม่รองรับ ดูเหมือนว่าเป็นความคิดที่ดีสำหรับองค์ประกอบของเว็บ แต่ยังไม่มีการนำไปใช้อย่างกว้างขวาง
Maxim

9
อัปเดตช่วงปลายปี 2018: การนำเข้า HTML ดูเหมือนจะถูกคัดค้านด้วยเหตุผลบางอย่าง
V. Rubinetti

60

เสียบห้องสมุดที่ไร้ยางอายที่ฉันเขียนแก้ปัญหานี้

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

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

ด้านบนจะใช้เนื้อหาของ/path/to/include.htmlและแทนที่divด้วย


4
สิ่งนี้จะประเมินผล JavaScript หรือไม่หาก include.html ฝังไว้
เซท

1
@ มันดูเหมือนจะไม่ ฉันจะเล่นกับ src และดูว่าฉันสามารถทำมันได้หรือไม่ ขอบคุณ michael-marr
xandout

2
ยอดเยี่ยม !!!! ของคุณดูเหมือนจะเป็นทางออกเดียวที่จะแทนที่แท็ก div ที่ใช้เป็นโทเค็นสำหรับการแทรก ฉันจะศึกษาแหล่งที่มาอย่างระมัดระวังในภายหลัง !! :-)
kpollock

1
ขอบคุณมันใช้งานได้รวมถึง HTML / CSS แต่ไม่ใช่ Javascript จากไฟล์ต้นฉบับ <div data-include="/path/to/include.html"></div>คุณเพียงแค่ต้องรวมไว้อีกครั้งเมื่อใดก็ตามที่คุณใช้ เครื่องมือนี้ทำให้ง่ายขึ้นในการสร้าง mockup ที่ไม่มีปลั๊กอินหลายตัวในวิธีที่สะอาด
Vincent Tang

1
ฉันสามารถใช้ lib นี้ในแอปพลิเคชันใด ๆ ได้หรือไม่ ฉันหมายถึงเครดิตของผู้เขียนได้อย่างไร? W3School มีวิธีการแก้ปัญหาที่คล้ายกันแตกต่างกันเพียง แต่ที่สำคัญรหัสของคุณโทร recursive ในการโหลดหน้าต่างเช่นกัน .... w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
yeppe

43

ฝั่งเซิร์ฟเวอร์อย่างง่ายรวมถึงคำสั่งเพื่อรวมไฟล์อื่นที่พบในโฟลเดอร์เดียวกันมีลักษณะดังนี้:

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

21
คุณต้องกำหนดค่าเซิร์ฟเวอร์ของคุณเพื่อใช้ SSI
lolo

7
นี่คือข้อมูลอ้างอิงสำหรับการกำหนดค่า SSI สำหรับเซิร์ฟเวอร์ของคุณ: httpd.apache.org/docs/2.4/howto/ssi.html#configuring
shasi

อาจจะคุ้มค่าที่จะลอง<!--#include file="a.html" -->เช่นกัน
jimmyjudas

การรวม SSI ทำให้เว็บเซิร์ฟเวอร์ช้าลง (ดังนั้นควรหลีกเลี่ยงจนกว่าจะมีความจำเป็นอย่างยิ่ง)
Amit Verma

36

ไม่จำเป็นต้องใช้สคริปต์ ไม่จำเป็นต้องทำสิ่งที่เซิร์ฟเวอร์แฟนซี (ที่อาจเป็นตัวเลือกที่ดีกว่า)

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

เนื่องจากเบราว์เซอร์รุ่นเก่าไม่รองรับการทำงานที่ราบรื่นคุณควรเพิ่ม css เพื่อแก้ไข:

iframe[seamless] {
    border: none;
}

โปรดทราบว่าสำหรับเบราว์เซอร์ที่ไม่รองรับการทำงานที่ราบรื่นหากคุณคลิกที่ลิงก์ใน iframe จะทำให้เฟรมไปที่ URL นั้นไม่ใช่ทั้งหน้าต่าง วิธีที่จะหลีกเลี่ยงปัญหานี้ก็คือการมีลิงก์ทั้งหมดtarget="_parent"ดังนั้นการสนับสนุนเบราว์เซอร์ก็คือ "ดีพอ"


7
ดูเหมือนว่าจะไม่ใช้สไตล์ CSS จากหน้าหลักเช่น
แรนดี้

5
@ แรนดี้เหรอ? สิ่งนี้อาจนับได้ว่าเป็นข้อดี (โดยเฉพาะอย่างยิ่งสำหรับเนื้อหาที่ผู้ใช้สร้างขึ้นและไม่ชอบ) คุณสามารถรวมไฟล์ css ได้อย่างง่ายดายอีกครั้งโดยไม่ต้องทำการร้องขออื่นเนื่องจากการแคชอยู่ดี
bjb568

ตอบความต้องการของฉันคำตอบสำหรับคำถามนี้ - วิธีการรวมไฟล์ HTML ในไฟล์ html อื่น ...
Grimxn

2
นั่นเป็นคำตอบที่ดีที่สุดโดยไม่มี JQuery หรือสคริปต์ ขอขอบคุณ bjb568!
DBS

12
seamlessแอตทริบิวต์ได้รับการถอดออกจากร่างของ HTML มันมาจาก อย่าใช้มัน
Mitja

33

แก้ปัญหาเก่ามากผมไม่ได้พบกับความต้องการของฉันกลับมาแล้ว แต่นี่เป็นวิธีที่จะทำตามมาตรฐานรหัส:

<!--[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
ปรากฏว่า<object>, <embed>และ<iframe>การทำงานทั้งหมดนี้ แต่ในทั้งสามกรณีที่พวกเขาสร้างเอกสารแบบแยกต่างหากที่ตัวเองจัดแต่งทรงผมและการเขียนสคริปต์บริบทของพวกเขา (iframe โดยเฉพาะอย่างยิ่งรวมถึงพรมแดนน่าเกลียดและเลื่อน) และสำหรับตัวอย่างเช่นการเชื่อมโยงใด ๆ โดยการเปิดเริ่มต้นภายในพวกเขามากกว่าใน เพจระดับบน (แม้ว่าจะสามารถแทนที่ได้ด้วย target = "_ parent") จากสิ่งเหล่านี้ iframe เป็นสิ่งเดียวที่หวังว่าจะรวมเข้ากับseamlessแอตทริบิวต์HTML5 (กล่าวถึงโดย bjb568) แต่ก็ยังไม่ได้รับการสนับสนุนอย่างดี: caniuse.com/#feat=iframe-se Seamless
waldyrious

2
iframe ได้อย่างราบรื่นได้รับลดลงจากมาตรฐาน HTML นี้: github.com/whatwg/html/issues/331 ดังนั้นความคิดเห็น @waldyrious ไม่ถูกต้องอีกต่อไป (โปรดอัปเดตความคิดเห็นของคุณหรือไม่)
TomášPospíšek

1
ขอบคุณสำหรับ heads-up, @ TomášPospíšek ฉันไม่สามารถแก้ไขความคิดเห็นของฉันได้อีก แต่หวังว่าคำตอบของคุณจะให้ข้อแม้ที่จำเป็นแก่ผู้อ่าน เพื่อให้ชัดเจนประโยคสุดท้าย (เกี่ยวกับseamlessคุณลักษณะ) เป็นเพียงส่วนที่ล้าสมัย - ส่วนที่เหลือยังคงใช้
วาลดีเรี

17

หากคุณเข้าถึงไฟล์. htaccess บนเซิร์ฟเวอร์ของคุณคุณสามารถเพิ่มคำสั่งง่ายๆที่จะช่วยให้ php สามารถตีความไฟล์ที่ลงท้ายด้วยนามสกุล. html

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

ตอนนี้คุณสามารถใช้สคริปต์ php เพื่อรวมไฟล์อื่น ๆ เช่น:

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

28
ใช่นั่นเป็นคำแนะนำที่แย่มาก ไฟล์ Html นั้นคงที่และให้บริการโดย apache อย่างรวดเร็ว หากคุณเพิ่มไฟล์ html ทั้งหมดลงในตัวแยกวิเคราะห์ php เพียงเพื่อ inlcude ไฟล์คุณจะมีปัญหาด้านประสิทธิภาพการทำงานจำนวนมากบนเซิร์ฟเวอร์ของคุณ วิธี javascript (jQuery หรือ JS ธรรมดา) ไม่ใช่วิธีแก้ปัญหาที่ดีมาก แต่ก็ยังมีประสิทธิภาพและอันตรายน้อยกว่าวิธีนี้
Gfra54

@ Gfra54 คุณหมายถึงว่าเราจะมีปัญหาด้านประสิทธิภาพหากเราใช้ Apache สำหรับสิ่งนี้เท่านั้นและเราจะไม่ทำงาน php ใด ๆ กับเว็บไซต์หรือไม่ หรือจะช้าลงถ้าฉันใช้ PHP และสิ่งนี้ด้วยกัน?
user3459110

1
ข้อควรระวัง: การเพิ่มบรรทัดเหล่านี้.htaccessอาจทำให้htmlหน้าพยายามดาวน์โหลดเป็นไฟล์แทนที่จะดูในเบราว์เซอร์ ทดสอบก่อน คำเตือน: นั่นเพิ่งเกิดขึ้นกับฉันเมื่อฉันพยายามแก้ปัญหาข้างต้น ฉัน.htaccessว่างเปล่ายกเว้นด้านบนสองบรรทัด ข้อควรระวัง ลองใช้loloโซลูชัน jQuery (ด้านล่าง) แทน
cssyphus

ผู้ชายฉันกำลังยุ่งอยู่กับตัวเองแม้ว่าฉันจะเคยทำมาก่อน ขอบคุณสำหรับการเตือน สำหรับวัตถุประสงค์ที่ฉันต้องการมันไม่ได้ส่งผลกระทบต่อประสิทธิภาพการทำงานดังนั้นฉันจึงเจ๋ง
Gman

ฮ่าคำตอบที่เน้นประสิทธิภาพนี้เป็นตัวอย่างที่ยอดเยี่ยมของการคิดนอกกรอบ ฉันจะไม่แนะนำ แต่อาจช่วยชีวิตเมื่อคุณต้องการบิตของค้อนขนาดใหญ่ php :-)
moodboom

14

การติดตามใช้งานได้หากจำเป็นต้องรวมเนื้อหา HTML จากไฟล์บางไฟล์: ตัวอย่างเช่นบรรทัดต่อไปนี้จะรวมเนื้อหาของ piece_to_include.html ที่ตำแหน่งที่คำนิยาม OBJECT เกิดขึ้น

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

การอ้างอิง: http://www.w3.org/TR/WD-html40-970708/struct/includes.html#h-7.7.4


2
ใช้งานได้อย่างมีเสน่ห์และเป็นทางออกที่สะอาดที่สุด นี่ควรเป็นคำตอบที่ยอมรับได้
vbocan

ตกลง. เพียงบันทึกย่อเดียว: อย่าพยายามทำแท็กวัตถุปิดตัวเอง ข้อความหลังจากนั้นจะถูกลบ
Sridhar Sarnobat

ดูเหมือนว่าจะสร้าง "#document" ใหม่ซึ่งมีแท็ก <html> และ <body> ใหม่ที่ซ้อนกันโดยอัตโนมัติ สิ่งนี้ไม่ได้ผลสำหรับจุดประสงค์ของฉัน ไฟล์. html ของฉันมีแท็ก <script src = "... " type = "text / javascript"> แต่ JS มีข้อผิดพลาดในการอ้างอิงใหม่
IAM_AL_X

12

นี่คือวิธีการแก้ปัญหาในสถานที่ของฉัน:

(() => {
    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
ว้าวมันง่ายกว่านี้อีกแล้ว
Arian saputra

ทางออกที่ดีและเรียบง่ายจริงๆขอบคุณ ^^
Remling

11

ใน w3.js รวมถึงงานเช่นนี้:

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

สำหรับคำอธิบายที่เหมาะสมดูได้ที่: https://www.w3schools.com/howto/howto_html_include.asp


หากคุณต้องการทราบว่าเมื่อใดที่มีการโหลดเอกสารคุณสามารถวางไว้ที่ท้ายเอกสาร: <img src = "thisimagedoesnotexist.dmy" onerror = 'initDocument ()' style = 'display: none;'> เคล็ดลับที่ฉลาด เอ๊ะ
Kaj Risberg

2
ไม่ทำงานกับ google chrome
deepcell

9

นี่คือสิ่งที่ช่วยฉัน สำหรับการเพิ่มบล็อกของรหัส html จากb.htmlลงa.htmlในควรไปที่headแท็กของa.html:

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

จากนั้นในแท็กเนื้อหาภาชนะจะถูกสร้างขึ้นด้วย id ที่ไม่ซ้ำกันและบล็อก javascript เพื่อโหลดb.htmlลงในภาชนะดังต่อไปนี้:

<div id="b-placeholder">

</div>

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

6
คำตอบนี้แตกต่างจากคำตอบที่ยอมรับของคำถามนี้อย่างไร
Mohammad Usman

2
@MohammadUsman ที่นี่รหัสคอนเทนเนอร์และจาวาสคริปต์อยู่ในแท็กเนื้อหาในขณะที่คำตอบที่ยอมรับจะวางไว้ในแท็กส่วนหัวและออกจากคอนเทนเนอร์ในแท็กเนื้อหาเท่านั้น
Ramtin

นี่ไม่คุ้มกับคำตอบใหม่ ... มันเป็นความเห็น
Kennet Celeste

8

ฉันรู้ว่านี่เป็นโพสต์เก่ามากดังนั้นวิธีการบางอย่างก็ไม่สามารถใช้ได้ในขณะนั้น แต่นี่คือสิ่งที่ฉันทำได้ง่ายๆ (ตามคำตอบของโลโล)

มันขึ้นอยู่กับคุณลักษณะของ data-* HTML5 และดังนั้นจึงเป็นเรื่องทั่วไปมากในที่ใช้ jQuery สำหรับแต่ละฟังก์ชั่นที่จะได้รับทุก. class ที่ตรงกัน "load-html" และใช้แอตทริบิวต์ 'data-source' ที่เกี่ยวข้องเพื่อโหลดเนื้อหา:

<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

คุณสามารถใช้ polyfill ของ HTML Imports ( https://www.html5rocks.com/en/tutorials/webcomponents/imports/ ) หรือโซลูชันที่ทำให้เข้าใจง่าย https://github.com/dsheiko/html-import

ตัวอย่างเช่นในหน้าคุณนำเข้าบล็อก HTML เช่นนั้น:

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

บล็อกอาจมีการนำเข้าของตนเอง:

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

ผู้นำเข้าแทนที่คำสั่งด้วย HTML ที่โหลดค่อนข้างคล้ายกับ SSI

คำสั่งเหล่านี้จะให้บริการโดยอัตโนมัติทันทีที่คุณโหลด JavaScript ขนาดเล็ก:

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

มันจะประมวลผลการนำเข้าเมื่อ DOM พร้อมโดยอัตโนมัติ นอกจากนี้ยังแสดง API ที่คุณสามารถใช้เพื่อเรียกใช้ด้วยตนเองเพื่อรับบันทึกและอื่น ๆ สนุก :)


บรรทัดสคริปต์ควรอยู่ที่ไหนในไฟล์ html
Andrew Truckle

ทุกที่ภายในร่างกาย สามารถวางซ้ำในเนื้อหาของไฟล์ที่รวม
Dmitry Sheiko

คุณทดสอบสิ่งนี้หรือไม่?
Bhikkhu Subhuti

แน่นอนฉันทำ ฉันใช้มันมาหลายปีแล้ว ถามทำไม? มีปัญหาอะไรบ้าง?
Dmitry Sheiko

ดังนั้น "กุญแจ" ของเรื่องนี้ก็คือscript async srcดูเหมือนว่า ลอง!
javadba

6

การแก้ปัญหาส่วนใหญ่ใช้งานได้ แต่มีปัญหากับjQuery :

ปัญหาคือการติดตามรหัส$(document).ready(function () { alert($("#includedContent").text()); }ไม่มีอะไรเลยแทนที่จะแจ้งเตือนเนื้อหาที่รวมอยู่

ฉันเขียนโค้ดด้านล่างในโซลูชันของฉันคุณสามารถเข้าถึงเนื้อหาที่รวมอยู่ใน $(document).readyฟังก์ชั่น:

(กุญแจกำลังโหลดเนื้อหารวมพร้อมกัน)

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>

รวมถึง inc :

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

jquery รวมถึงปลั๊กอินบน github


เมื่อใช้สิ่งนี้แล้วดูแหล่งที่มาของหน้าเว็บจากเบราว์เซอร์คุณจะเห็นเฉพาะสคริปต์ สิ่งนี้ไม่ส่งผลกระทบต่อความสามารถของเครื่องมือค้นหาในการแยกวิเคราะห์ไซต์ของคุณทำลายความพยายาม SEO ใด ๆ ในท้ายที่สุด
hmcclungiii

ใช่วิธีนี้ทำลาย SEO :)
Amir Saniyan

จากนั้นอีกครั้งทุกวิธีที่ใช้ JavaScript จะทำเช่นนั้น
wizzwizz4

5

ในการแทรกเนื้อหาของไฟล์ที่มีชื่อ:

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

1
ใช้วงเล็บเหลี่ยมสำหรับ []: [! - # include virtual = "include_omega.htm" -]
St.Eve

4

คำตอบของ Athari (ตอนแรก!) เป็นข้อสรุปที่มากเกินไป! ดีมาก!

แต่ถ้าคุณต้องการส่งชื่อของหน้าเพื่อรวมเป็นพารามิเตอร์ URLโพสต์นี้มีทางออกที่ดีมากที่จะใช้ร่วมกับ:

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

ดังนั้นมันจะเป็นแบบนี้:

URL ของคุณ:

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

a.htmlรหัสตอนนี้กลายเป็น:

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

มันทำงานได้ดีมากสำหรับฉัน! ฉันหวังว่าจะช่วย :)


ปัญหาด้านความปลอดภัยเพราะคุณสามารถส่งลิงค์นี้ให้ใครก็ได้: www.yoursite.com/a.html?p=htttp://www.linktovir.us/here.html
JoostS

4

html5rocks.comมีบทช่วยสอนที่ดีมากเกี่ยวกับสิ่งนี้และมันอาจจะช้าไปนิดหน่อย แต่ฉันเองก็ไม่รู้ว่ามันมีอยู่จริง w3schools ยังมีวิธีการทำสิ่งนี้โดยใช้ห้องสมุดใหม่ของพวกเขาที่เรียกว่า w3.js สิ่งนี้ต้องใช้เว็บเซิร์ฟเวอร์และวัตถุ HTTPRequest คุณไม่สามารถโหลดสิ่งเหล่านี้ในพื้นที่และทดสอบกับเครื่องของคุณ สิ่งที่คุณสามารถทำได้คือใช้ polyfills ที่มีให้ในลิงก์ html5rocks ที่ด้านบนหรือทำตามบทช่วยสอนของพวกเขา ด้วยเวทมนต์ JS เล็กน้อยคุณสามารถทำสิ่งนี้:

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

สิ่งนี้จะทำให้ลิงก์ (สามารถเปลี่ยนเป็นองค์ประกอบลิงก์ที่ต้องการหากตั้งค่าไว้แล้ว) ตั้งค่าการนำเข้า (เว้นแต่คุณมีอยู่แล้ว) และต่อท้าย จากนั้นจะใช้เวลานั้นและแยกไฟล์ใน HTML แล้วผนวกเข้ากับองค์ประกอบที่ต้องการภายใต้ div ทั้งหมดนี้สามารถเปลี่ยนแปลงได้เพื่อให้เหมาะกับความต้องการของคุณจากองค์ประกอบต่อท้ายไปยังลิงก์ที่คุณใช้ ฉันหวังว่าสิ่งนี้จะช่วยได้ แต่ตอนนี้อาจไม่เกี่ยวข้องเลยหากวิธีการใหม่ที่เร็วกว่าออกมาโดยไม่ต้องใช้ไลบรารีและกรอบงานเช่น jQuery หรือ W3.js

UPDATE:สิ่งนี้จะทำให้เกิดข้อผิดพลาดที่แจ้งว่าการนำเข้าภายในถูกบล็อกโดยนโยบาย CORS อาจจำเป็นต้องเข้าถึงเว็บลึกเพื่อที่จะสามารถใช้สิ่งนี้ได้เนื่องจากคุณสมบัติของเว็บลึก (ความหมายไม่มีการใช้งานจริง)


4

นี่คือวิธีการของฉันโดยใช้ Fetch API และฟังก์ชัน 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

ไม่มีโซลูชัน HTML โดยตรงสำหรับภารกิจในตอนนี้ แม้แต่ การนำเข้า HTML (ซึ่งเป็นแบบร่างถาวร) จะไม่ทำสิ่งนี้เพราะนำเข้า! = รวมแล้วต้องใช้เวทมนต์ของ JS อยู่ดี
ฉันเพิ่งเขียน VanillaJSสคริปต์ที่เป็นเพียงสำหรับการรวม HTML เป็น HTML โดยไม่มีภาวะแทรกซ้อนใด ๆ

เพียงแค่ใส่ในของคุณ a.html

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

มันเป็นopen-sourceและอาจให้ความคิด (ฉันหวังว่า)


3

คุณสามารถทำได้ด้วย jQuery ของไลบรารี่เช่นนี้:

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.htmlควรอยู่ภายใต้โดเมนเดียวกันหน้าอื่น ๆ ของคุณอยู่ในมิฉะนั้นหน้าเว็บของคุณจะปฏิเสธbanner.htmlไฟล์เนื่องจากนโยบายการแบ่งปันทรัพยากรข้ามแหล่งที่มา

นอกจากนี้โปรดทราบว่าหากคุณโหลดเนื้อหาด้วย JavaScript Google จะไม่สามารถจัดทำดัชนีได้ดังนั้นจึงไม่ใช่วิธีที่ดีในการทำ SEO


2

คุณลองใช้การฉีด iFrame หรือไม่?

มันฉีด iFrame ในเอกสารและลบตัวเอง (มันควรจะเป็นใน HTML DOM)

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

ความนับถือ


1

ฉันมาที่หัวข้อนี้เพื่อค้นหาสิ่งที่คล้ายกัน แต่แตกต่างจากปัญหาที่เกิดจากโลโล ฉันต้องการสร้างหน้า HTML ที่มีเมนูเรียงตามตัวอักษรของลิงก์ไปยังหน้าอื่น ๆ และหน้าอื่น ๆ แต่ละหน้าอาจมีหรือไม่มีอยู่และลำดับที่สร้างขึ้นอาจไม่เป็นตัวอักษร (หรือแม้แต่ตัวเลข) นอกจากนี้เช่น Tafkadasoh ฉันไม่ต้องการขยายหน้าเว็บด้วย jQuery หลังจากค้นคว้าปัญหาและทดลองเป็นเวลาหลายชั่วโมงต่อไปนี้เป็นสิ่งที่ใช้ได้ผลสำหรับฉันโดยมีข้อสังเกตเพิ่มเติมที่เกี่ยวข้อง:

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

นี่เป็นบทความที่ยอดเยี่ยมคุณสามารถใช้ไลบรารีทั่วไปและใช้โค้ดด้านล่างเพื่อนำเข้าไฟล์ HTML ใด ๆ ในบรรทัดเดียว

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

คุณสามารถลองใช้ Google โพลิเมอร์ได้เช่นกัน


6
"เพียงใช้รหัสด้านล่างเพื่อนำเข้าไฟล์ HTML ใด ๆ ในหนึ่งบรรทัด" นั้นไม่สวย คุณต้องเขียน JS เพื่อใช้ประโยชน์จากเนื้อหาใด ๆ ที่คุณนำเข้าดังนั้นมันจึงกลายเป็นมากกว่า "หนึ่งบรรทัด"
skybondsor

1

ใช้backticks ES6 ``: ตัวอักษรแม่แบบ !

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>

วิธีนี้เราสามารถรวม html โดยไม่ต้องเข้ารหัสคำพูดรวมตัวแปรจาก DOM และอื่น ๆ

มันเป็นเอ็นจิ้น templating อันทรงพลังเราสามารถใช้ไฟล์ js แยกต่างหากและใช้กิจกรรมเพื่อโหลดเนื้อหาเข้าที่หรือแม้กระทั่งแยกทุกอย่างเป็นชิ้น ๆ และโทรตามความต้องการ:

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

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


1
ตัวอย่างที่ดี - ทำไมไม่มี upvotes (จนถึงตอนนี้)
javadba

เฮ้คุณถูกต้องในปี 2018 ข้างต้นเป็นสัญญาณที่ชัดเจนของ RTFM ที่ดีจริง ๆ ;) ฉันส่วนใหญ่ทุบjavascriptป้ายที่เป็นโปรแกรมเมอร์งานอดิเรกจนถึงตอนนี้
NVRM

1

ในการทำให้ Solution ทำงานคุณต้องรวมไฟล์ csi.min.js ซึ่งคุณสามารถหาได้ที่นี่ที่นี่

ตามตัวอย่างที่แสดงบน GitHub เพื่อใช้ไลบรารีนี้คุณต้องรวมไฟล์ csi.js ในส่วนหัวของหน้าของคุณจากนั้นคุณต้องเพิ่มแอตทริบิวต์ data-include ด้วยค่าที่ตั้งเป็นไฟล์ที่คุณต้องการรวมไว้ในคอนเทนเนอร์ ธาตุ.

ซ่อนรหัสคัดลอก

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

... หวังว่ามันจะช่วยได้


0

PHP เป็นภาษาสคริปต์ระดับเซิร์ฟเวอร์ มันสามารถทำอะไรได้หลายอย่าง แต่การใช้งานที่ได้รับความนิยมอย่างหนึ่งคือการรวมเอกสาร HTML ไว้ในหน้าเว็บของคุณเหมือนกับ SSI เช่นเดียวกับ SSI นี่เป็นเทคโนโลยีระดับเซิร์ฟเวอร์ หากคุณไม่แน่ใจว่าคุณมีฟังก์ชั่น PHP ในเว็บไซต์ของคุณหรือไม่โปรดติดต่อผู้ให้บริการโฮสติ้งของคุณ

นี่คือสคริปต์ PHP แบบง่ายที่คุณสามารถใช้เพื่อรวมตัวอย่างของ HTML บนหน้าเว็บที่เปิดใช้งาน PHP:

บันทึก HTML สำหรับองค์ประกอบทั่วไปของเว็บไซต์ของคุณเพื่อแยกไฟล์ ตัวอย่างเช่นส่วนการนำทางของคุณอาจถูกบันทึกเป็น navigation.html หรือ navigation.php ใช้รหัส PHP ต่อไปนี้เพื่อรวม HTML นั้นไว้ในแต่ละหน้า

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

ใช้รหัสเดียวกันนั้นในทุกหน้าที่คุณต้องการรวมไฟล์ ตรวจสอบให้แน่ใจว่าเปลี่ยนชื่อไฟล์ higlighted เป็นชื่อและพา ธ เป็นไฟล์รวมของคุณ


0

หากคุณใช้เฟรมเวิร์กบางอย่างเช่น django / bootle พวกเขามักจะจัดส่งเอ็นจินเทมเพลต สมมติว่าคุณใช้ขวดและแม่แบบเครื่องยนต์เริ่มต้นคือSimpleTemplate เครื่องยนต์ และด้านล่างเป็นไฟล์ html บริสุทธิ์

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

คุณสามารถรวม footer.tpl ในไฟล์หลักของคุณเช่น:

$ cat dashboard.tpl
%include footer

นอกจากนั้นคุณยังสามารถส่งพารามิเตอร์ไปที่ dashborard.tpl ของคุณ


0

อ้างอิงคำตอบของhttps://stackoverflow.com/a/31837264/4360308 ฉันได้ใช้งานฟังก์ชันนี้กับ Nodejs (+ express + cheerio) ดังนี้:

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

ผนวก -> รวมเนื้อหาไว้ใน div

แทนที่ -> แทนที่ div

คุณสามารถเพิ่มพฤติกรรมเพิ่มเติมได้อย่างง่ายดายตามการออกแบบเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.