HTML 파일에 다른 HTML 파일 포함


625

내가 가진 2 개 HTML 파일, 가정 a.htmlb.html . 에 a.html나는 포함 할 b.html.

JSF에서는 다음과 같이 할 수 있습니다.

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

그것은 내부를 의미 a.xhtml파일 포함 할 수b.xhtml .

*.html파일로 어떻게 할 수 있습니까?



32
아니! 두 가지 다른 것들!
lolo

관련 localhost: 그러나 : stackoverflow.com/questions/7542872/…
cregox

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

답변:


686

제 생각에는 최고의 솔루션은 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
나는 당신이 언급 한 것과 정확히 같습니다. 부트 스트랩을 사용하고 있으며 B.html에 CSS를 덮어 씁니다. A.html에서 B.html을 사용하여 A.html의 헤더로 끝날 때 CSS의 우선 순위가 떨어지고 레이아웃이 다른 것을 알 수 있습니다. 이것에 대한 해결책?
Pavan Dittakavi

36
서버가 필요합니다 . 로컬 파일에서 사용하는 경우 :XMLHttpRequest cannot load file:///.../b.html. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
Basj

155

위에서 lolo의 답변을 확장하면 많은 파일을 포함 해야하는 경우 약간의 자동화가 있습니다.

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

views / header.html 및 views / footer.html 파일이 포함됩니다


매우 유용한. data-argument포함 된 파일에서 다른 데이터 매개 변수를 통해 인수를 전달 하고 검색하는 방법이 있습니까?
chris

@ chris GET 매개 변수를 사용할 수 있습니다.$("#postdiv").load('posts.php?name=Test&age=25');
Nam G VU

5
작은 제안 - 당신은 필요하지 않습니다 class="include"- 당신의 jQuery를 선택하게var includes = $('[data-include]');
jbyrd

로컬 파일로 크롬에서 작동하지 않는 '크로스 원산지 요청은 프로토콜 체계에 대해 지원됩니다 HTT를 "
아르 템 Bernatskyi

2
@ArtemBernatskyi 로컬 서버를 대신 실행할 때 도움이됩니까? 다음은 쉬운 튜토리얼입니다. developer.mozilla.org/en-US/docs/Learn/Common_questions/…
mhanisch

146

내 솔루션은 위 의 lolo 와 유사합니다 . 그러나 jQuery를 사용하는 대신 JavaScript의 document.write를 통해 HTML 코드를 삽입합니다.

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

또는 Github에서 Gist로 게시 된 다음과 같은 편리한 bash 스크립트를 사용하면 필요한 모든 작업을 자동화 b.html하여 b.js다음으로 변환 할 수 있습니다 . https://gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6를

크레딧 그렉 Minshall 내 원래 나오지도 명령은 고려하지 않았다 또한 다시 슬래시와 따옴표를 이스케이프 개선 나오지 명령합니다.

또는 템플릿 리터럴 을 지원하는 브라우저의 경우 경우 다음도 작동합니다.

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 네, 그렇습니다. 제 솔루션의 단점이며 매우 우아하지 않습니다. 그러나 각 줄 끝에 간단한 정규 표현식으로 '\'를 삽입 할 수 있으므로 가장 효과적입니다. 흠 ... 아마 정규식을 통해 삽입을 수행하는 방법에 대한 답변을 추가해야합니다 ...
Tafkadasoh

2
으아 아, 그게 못 생겼어-고마워. 차라리 html로 HTML을 작성하고 싶습니다. 커맨드 라인에서 sed를 사용할 수 있는지 상관하지 않습니다. 템플릿의 내용을 변경할 때마다 그에 의존하고 싶지 않습니다.
jbyrd

1
@Goodra '마크 없이 HTML에서 작동 합니다. 당신은 단지 발견 할 경우 / 교체 교체 ` with THEN '\ 찾기 / 교체 교체 '\'그것을 잘 작동합니다``새 라인에 새로운 라인.
wizzwizz4

1
@ wizzwizz4 : Greg 덕분에 sed 명령은 작은 따옴표와 백 슬래시도 이스케이프 처리합니다. 또한 모든 작업을 수행하는 bash 스크립트를 추가했습니다. :-)
Tafkadasoh

1
당신은 역 따옴표를 사용할 수 있습니다 `- 다음과 같은 식을 삽입 할 수있는 ${var}당신 만 탈출해야 - \`\$
inetphantom

85

HTML5rocks 튜토리얼폴리머 프로젝트 를 통한 HTML5 가져 오기 체크 아웃

예를 들면 다음과 같습니다.

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

27
HTML 가져 오기는 실제로 페이지에 내용을 직접 포함하기위한 것이 아닙니다. 이 답변의 코드 는 상위 페이지 내에서 템플릿으로stuff.html사용할 수 있지만 사용자가 볼 수 있도록 스크립팅을 사용 하여 상위 페이지에서 DOM의 복제본 을 만들어야 합니다.
waldyrious

1
한 HTML 페이지의 내용을 다른 HTML 페이지에 삽입하기위한 html5rocks.com의 지침은 아직 많은 브라우저에서 작동하지 않는 것 같습니다. Opera 12.16 및 Superbird Version 32.0.1700.7 (233448)에서 효과가 없었습니다 (Xubuntu 15.04에서). Firefox (희망적으로 수정 된 버그로 인해) 또는 많은 Chrome 버전에서 작동하지 않는다고 들었습니다. 따라서 향후 이상적인 솔루션 인 것처럼 보이지만 크로스 브라우저 솔루션은 아닙니다.
Brōtsyorfuzthrāx

1
FireFox (45.5.1 ESR)에서 2016 년 말 기준으로는 아직 준비되지 않았습니다. JS 콘솔의 말 : TypeError: ... .import is undefined. MDN 은 " 현재이 기능은 기본적으로 어떤 브라우저에서도 구현되지 않습니다"라고 말합니다. 이 기능으로 FF를 만들 수 있는지 아는 사람이 있습니까?
sphakka

3
Firefox는이를 지원하지 않습니다. 활성화하려면 "dom.webcomponents.enabled"를 설정하십시오. 업데이트 가능한 웹보기 (startng 4.4.3)가있는 Android 및 Chrome 및 Opera에서만 작동합니다. Apple 브라우저는이를 지원하지 않습니다. 웹 구성 요소에는 좋은 아이디어처럼 보이지만 아직 널리 구현되지는 않았습니다.
Maxim

9
2018 년 후반 업데이트 : 어떤 이유로
않을

60

내가 작성한 라이브러리의 뻔뻔한 플러그가 이것을 해결합니다.

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

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

위의 내용을 가져 와서 /path/to/include.html대체합니다 div.


4
include.html에 JavaScript가 포함되어 있으면 JavaScript가 평가됩니까?
세스

1
@ Seth 것 같지 않습니다. 나는 src를 가지고 놀아서 그것을 할 수 있는지 봅니다. michael-marr에게 감사
xandout

2
훌륭한!!!! 귀하의 삽입 위치에 대한 토큰으로 사용 된 div 태그를 대체하는 유일한 솔루션 인 것 같습니다. 나중에 소스를주의 깊게 연구하겠습니다 !! :-)
kpollock

1
이 기능 덕분에 HTML / CSS는 포함되지만 소스 파일의 Javascript는 포함되지 않습니다. 를 사용할 때마다 다시 포함시켜야합니다 <div data-include="/path/to/include.html"></div>. 이 도구를 사용하면 간단한 비 플러그인 멀티 페이지 모형을 깔끔하게 만들 수 있습니다.
Vincent Tang

1
이 응용 프로그램을 모든 응용 프로그램에서 사용할 수 있습니까? 저자를 어떻게 신용 할 수 있습니까? W3School 유사한 솔루션 만 차이가 그것 그 재귀 아니라 윈도우 부하에 전화 .... 당신의 코드를 충족시켜 w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
yeppe

43

동일한 폴더에있는 다른 파일을 포함하는 간단한 서버 측 include 지시문은 다음과 같습니다.

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

21
SSI를 사용하도록 서버를 구성해야합니다
lolo

7
다음은 서버의 SSI 구성에 대한 참조입니다. httpd.apache.org/docs/2.4/howto/ssi.html#configuring
shasi kanth

시도 가치가있을 수도 있습니다 <!--#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은 HTML5 seamless속성 (bjb568에 의해 언급 됨)을 통해보다 통합 될 수있는 유일한 희망 이지만, 아직 잘 지원되지는 않습니다 : caniuse.com/#feat=iframe-seamless
waldyrious

2
iframe-seamless는 github.com/whatwg/html/issues/331 HTML 표준에서 삭제되었습니다 . 그래서 @waldyrious 코멘트가 더 이상 정확하지 않습니다 (댓글을 갱신 하시겠습니까?)
Tomáš Pospíšek

1
@ TomášPospíšek에게 감사드립니다. 더 이상 내 의견을 편집 할 수 없지만 독자의 답변이 독자에게 필요한 경고를 제공하기를 바랍니다. 분명히 말하면, 마지막 문장 ( seamless속성 에 관한 )은 유일한 오래된 부분입니다. 나머지는 여전히 적용됩니다.
waldyrious

17

또는 서버의 .htaccess 파일에 액세스 할 수있는 경우 .html 확장자로 끝나는 파일에서 php를 해석 할 수있는 간단한 지시문을 추가 할 수 있습니다.

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

이제 간단한 PHP 스크립트를 사용하여 다음과 같은 다른 파일을 포함 할 수 있습니다.

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

28
네, 그것은 매우 나쁜 조언입니다. HTML 파일은 정적이며 아파치에서 매우 빠르게 제공됩니다. 파일을 포함하기 위해 모든 HTML 파일을 PHP 파서에 추가하면 서버에서 많은 성능 문제가 발생합니다. 자바 스크립트 방식 (jQuery 또는 일반 JS)은 그리 좋은 솔루션은 아니지만 여전히이 방법보다 훨씬 효율적이고 덜 위험합니다.
Gfra54

@ Gfra54 아파치를이 용도로만 사용하면 성능 문제가 발생하고 사이트에서 PHP 작업을하지 않습니까? 아니면 PHP 와이 것을 함께 사용하면 속도가 느려 집니까?
user3459110 2016 년

1
주의 :이 행을 추가 .htaccess하면 html페이지가 브라우저에서 보지 않고 파일로 다운로드 될 수 있습니다 . 먼저 테스트하십시오. 면책 조항 : 위의 해결책을 시도했을 때 지금 막 나에게 일어났습니다. 내는 .htaccess위의 두 줄을 제외하고 비어 있었다. 주의를 기울여야합니다. lolo대신의 jQuery 솔루션 (아래)을 사용해보십시오 .
cssyphus

남자는 내가 전에 그것을 했더라도 나 자신을 복잡하게하고 있었다. 알림 주셔서 감사합니다. 내가 필요한 목적은 실제로 성능에 영향을 미치지 않으므로 시원합니다.
Gman

이 성능 저하 답변은 즉시 사용 가능한 사고의 훌륭한 예입니다. 나는 그것을 제안하지 않을 것이지만, PHP sledgehammer가 필요할 때 생명의 은인이 될 수도 있습니다. :-)
moodboom 2009 년

14

일부 파일의 html 컨텐츠를 포함해야하는 경우 다음이 작동합니다. 예를 들어, 다음 행은 OBJECT 정의가 발생하는 위치에 piece_to_include.html의 컨텐츠를 포함합니다.

...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에서

중첩 된 새 <html> 및 <body> 태그를 자동으로 포함하는 새 "#document"를 만드는 것 같습니다. 이것은 내 목적으로는 효과가 없었다. 내 .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에서 include는 다음과 같이 작동합니다.

<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 크롬과 작동하지 않습니다.
deepcell

9

이것이 나를 도왔습니다. 에서 HTML 코드 블록을 추가하려면 b.htmla.html이은에 가야 head의 태그 a.html:

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

그런 다음 body 태그에서 컨테이너는 다음과 같이 고유 한 id와 javascript 블록 b.html으로 만들어 컨테이너 에로드 됩니다.

<div id="b-placeholder">

</div>

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

6
이 답변이이 질문에 대한 답변과 어떻게 다릅니 까?
Mohammad Usman

2
@MohammadUsman 여기에서 컨테이너와 자바 스크립트 코드는 body 태그에 있고 승인 된 답변은 head 태그에 배치하고 컨테이너는 body 태그에만 둡니다.
Ramtin

이것은 새로운 답변의 가치가 없습니다 ... 그것은 의견입니다
Kennet Celeste

8

나는 이것이 매우 오래된 게시물임을 알고 있으므로 당시에는 일부 방법을 사용할 수 없었습니다. 그러나 여기에 매우 간단한 테이크가 있습니다 (Lolo의 답변을 기반으로 함).

HTML5 data- * 속성에 의존하므로 jQuery의 for-each 함수를 사용하여 "load-html"과 일치하는 모든 .class를 가져오고 각각의 '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

HTML 가져 오기 ( 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" >

임포터는 지시어를 SSI와 거의 비슷하게로드 된 HTML로 바꿉니다.

이 지시문은이 작은 JavaScript를로드하자마자 자동으로 제공됩니다.

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

DOM이 자동으로 준비되면 가져 오기를 처리합니다. 또한 수동으로 실행하고 로그를 얻는 데 사용할 수있는 API를 제공합니다. 즐겨 :)


스크립트 줄은 html 파일에서 어디로 가야합니까?
Andrew Truckle

BODY 내의 어느 곳. 포함 된 파일의 내용에 재귀 적으로 배치 가능
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>

include.inc :

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

github의 jquery include 플러그인


이것을 사용하고 브라우저에서 페이지 소스를 볼 때 스크립트 만 표시됩니다. 검색 엔진이 사이트를 파싱하여 SEO 노력을 중단시키는 데 영향을 미치지 않습니까?
hmcclungiii

예,이 방법은 모든 SEO를 파괴합니다 :)
Amir Saniyan

다시 말하지만, 모든 JavaScript 기반 메소드는 그렇게합니다.
wizzwizz4

5

명명 된 파일의 내용을 삽입하려면

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

1
[] : [!-# include virtual = "include_omega.htm"-]에 꺾쇠 괄호 사용
St.Eve

4

아타리의 대답 (첫 번째!)은 너무 결정적이었습니다! 아주 좋아요!

그러나 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 객체를 사용해야한다는 것입니다. 실제로 로컬에로드하여 컴퓨터에서 테스트 할 수는 없습니다. 당신이 할 수있는 일은 상단의 html5rocks 링크에 제공된 polyfill을 사용하거나 자습서를 따르는 것입니다. 약간의 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와 같은 라이브러리와 프레임 워크를 사용하지 않고 더 빠르고 새로운 방법이 나오면 이것이 도움이되기를 바랍니다.

업데이트 : CORS 정책에 의해 로컬 가져 오기가 차단되었다는 오류가 발생합니다. 딥 웹의 속성으로 인해 딥 웹에 액세스하려면 딥 웹에 액세스해야 할 수도 있습니다. (실용 없음을 의미)


4

Fetch API 및 비동기 함수를 사용하는 접근 방식은 다음과 같습니다.

<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 솔루션은 없습니다. Import! = Include 및 일부 JS 마술이 필요하기 때문에 HTML Imports (임시 로 초안 인 ) 조차도 작동 하지 않습니다.
최근에 HTML에 HTML을 포함시키기위한 VanillaJS 스크립트 를 작성 했습니다 .

당신의 장소에 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

JavaScript 라이브러리 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로 인해 파일을 간 리소스 공유의 정책.

또한 자바 스크립트를 사용하여 콘텐츠를로드하는 경우 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

나는이 주제와 비슷한 것을 찾았지만 lolo가 제기 한 문제와 약간 다릅니다. 다른 페이지에 대한 알파벳순 링크 메뉴를 포함하는 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 Polymer를 사용해 볼 수도 있습니다


6
"한 줄에 HTML 파일을 가져 오려면 아래 코드 만 사용하십시오"는 매우 명확하지 않습니다. 가져온 컨텐츠를 사용하려면 JS를 작성해야하므로 결국 "한 줄"이상이됩니다.
skybondsor

1

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의 변수를 포함하는 등을 할 수 있습니다.

강력한 템플릿 엔진입니다. 별도의 js 파일을 사용하고 이벤트를 사용하여 콘텐츠를 제자리에로드하거나 청크로 모든 것을 분리하고 필요에 따라 호출 할 수 있습니다.

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

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


1
좋은 예-왜 공감대가 없습니까 (지금까지)?
javadba

야, 당신은 옳습니다 .2018 년에는 위의 실제 RTFM의 명백한 징후였습니다.) javascript그때까지 취미 프로그래머로 그 배지를 크게 파괴했습니다 .
NVRM

1

솔루션이 작동하게하려면 csi.min.js 파일을 포함시켜야합니다. 여기에서 찾을 수 있습니다. .

GitHub에 표시된 예제에 따라이 라이브러리를 사용하려면 페이지 헤더에 csi.js 파일을 포함시켜야합니다. 그런 다음 데이터 포함 속성을 값이 설정된 컨테이너에 포함하려는 파일에 추가해야합니다. 요소.

복사 코드 숨기기

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

도움이 되길 바랍니다.


0

PHP는 서버 수준의 스크립팅 언어입니다. 많은 작업을 수행 할 수 있지만 SSI와 매우 유사한 HTML 문서를 페이지에 포함시키는 것이 많이 사용됩니다. SSI와 마찬가지로 이것은 서버 수준의 기술입니다. 웹 사이트에 PHP 기능이 있는지 확실하지 않으면 호스팅 제공 업체에 문의하십시오.

다음은 모든 PHP 지원 웹 페이지에 HTML 스 니펫을 포함시키는 데 사용할 수있는 간단한 PHP 스크립트입니다.

사이트의 공통 요소에 대한 HTML을 파일로 분리하십시오. 예를 들어, 탐색 섹션은 navigation.html 또는 navigation.php로 저장 될 수 있습니다. 다음 PHP 코드를 사용하여 각 페이지에 해당 HTML을 포함 시키십시오.

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

파일을 포함시키려는 모든 페이지에서 동일한 코드를 사용하십시오. 강조 표시된 파일 이름을 포함 파일의 이름 및 경로로 변경하십시오.


0

django / bootle과 같은 프레임 워크를 사용하는 경우 종종 템플릿 엔진이 제공됩니다. bottle을 사용하고 기본 템플릿 엔진이 SimpleTemplate Engine이라고 가정 합니다. 아래는 순수한 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에 내용을 포함

replace-> div를 대체합니다

동일한 디자인에 따라 더 많은 동작을 쉽게 추가 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.