ChatGPT解决这个技术问题 Extra ChatGPT

在 HTML 文件中包含另一个 HTML 文件

我有 2 个 HTML 文件,假设 a.htmlb.html。在 a.html 中,我想包含 b.html

在 JSF 中,我可以这样做:

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

这意味着在 a.xhtml 文件中,我可以包含 b.xhtml

我们如何在 *.html 文件中做到这一点?


S
SharpC

在我看来,最好的解决方案是使用 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() 文档是 here


只做这个 ` 有什么区别?
@RodrigoRuiz $(function(){}) 只会在文档加载完成后执行。
如果包含的 HTML 文件附加了 CSS,它可能会弄乱您的页面样式。
我和你提到的完全一样。我正在使用引导程序并为 B.html 覆盖 css。当我在 A.html 中使用 B.html 以使其最终成为 A.html 的标头时,我可以看到 css 已失去其优先级并且具有不同的布局。有什么解决办法吗?
这确实需要服务器。在本地文件上使用它时:XMLHttpRequest cannot load file:///.../b.html. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
T
Trenton McKinney

展开 lolo's answer,如果您必须包含大量文件,这里会更加自动化。使用这个 JS 代码:

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

然后在 html 中包含一些内容:

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

其中将包括文件 views/header.htmlviews/footer.html


很有用。有没有办法通过另一个数据参数传递一个参数,比如 data-argument 并在包含的文件中检索它?
@chris 您可以使用 GET 参数,例如 $("#postdiv").load('posts.php?name=Test&age=25');
无法在带有本地文件的 chrome 上工作“跨源请求仅支持协议方案:htt”
@ArtemBernatskyi 当您运行本地服务器时,它有帮助吗?这是一个简单的教程:developer.mozilla.org/en-US/docs/Learn/Common_questions/…
C
Chris Magnuson

我的解决方案类似于上面的 lolo 之一。但是,我通过 JavaScript 的 document.write 插入 HTML 代码,而不是使用 jQuery:

一个.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 上发布的便捷 bash 脚本,它可以自动完成所有必要的工作,将 b.html 转换为 b.jshttps://gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6

归功于 Greg Minshall 改进的 sed 命令,它还转义了反斜杠和单引号,我原来的 sed 命令没有考虑这些。

或者,对于支持 template literals 的浏览器,以下内容也适用:

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>

`);

@TrevorHickey 是的,你是对的,这是我的解决方案的缺点,而且不是很优雅。但是,由于您可以在每行的末尾插入一个带有简单正则表达式的 '\',这对我来说效果最好。嗯...也许我应该在我的答案中添加如何通过正则表达式进行插入...
使用纯 JS 而没有 jQuery 来做 Ajax 是微不足道的。对于初学者,请参阅 stackoverflow.com/questions/8567114/…
哦,天哪,这很难看 - 不,谢谢。我宁愿把我的 html 写成 html。我不在乎是否可以在命令行上使用 sed - 我不想每次更改模板的内容时都依赖它。
@Goodra 它应该适用于其中没有 ' 标记的任何 HTML。如果您只是执行查找/替换以替换 ` with \` 那么查找/替换以将 ' 替换为 \' 并将新行替换为 ``new-lines 它将正常工作。
@wizzwizz4:感谢 Greg, sed 命令现在还可以转义单引号和反斜杠。此外,我添加了一个 bash 脚本,它可以为您完成所有工作。 :-)
S
Supersharp

签出 HTML5 导入 via Html5rocks tutorial polymer-project

例如:

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

HTML 导入并不意味着直接将内容包含在页面中。此答案中的代码仅使 stuff.html 在父页面中作为模板可用,但您必须使用脚本在父页面中创建其 DOM 的克隆页面,以便它们对用户可见。
html5rocks.com 上关于将一个 HTML 页面的内容插入另一个 HTML 页面的说明似乎还不适用于许多浏览器。我在 Opera 12.16 和 Superbird 版本 32.0.1700.7 (233448) 中尝试过,但没有效果(在 Xubuntu 15.04 上)。不过,我听说它在 Firefox(由于希望已修复的错误)或许多版本的 Chrome 中不起作用。因此,虽然它看起来可能是未来的理想解决方案,但它并不是一个跨浏览器的解决方案。
Firefox 将不支持它。要启用它,请尝试设置“dom.webcomponents.enabled”。它仅适用于 Chrome 和 Opera,具有可更新 Web 视图的 Android (startng 4.4.3)。苹果浏览器不支持。对于 Web 组件来说,这看起来是一个不错的想法,但尚未广泛实施。
2018 年末更新:HTML 导入显然是deprecated for some reason
HTML 导入已被弃用,并已于 2020 年 2 月从 Chrome 中删除。
M
Michael Marr

我写的一个库的无耻插件解决了这个问题。

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

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

以上将采用 /path/to/include.html 的内容并将 div 替换为它。


如果 include.html 嵌入了它,这会评估 JavaScript 吗?
@Seth 似乎没有。我将玩弄 src ,看看我是否可以做到这一点。感谢迈克尔-马尔
杰出的!!!!您的似乎唯一的解决方案是替换用作插入位置标记的 div 标签。以后我会仔细研究源码的!! :-)
感谢这项工作,它包括 HTML/CSS,但不包括源文件中的 Javascript。您只需在使用 <div data-include="/path/to/include.html"></div> 的任何位置再次包含它。该工具使以干净的方式制作简单的无插件多页模型变得更加容易。
我可以在任何应用程序中使用这个库吗?我的意思是如何相信作者? W3School 也有类似的解决方案,唯一不同的是您的代码也可以满足窗口加载时的递归调用......w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
b
bjb568

不需要脚本。无需在服务器端做任何花哨的事情(那可能是更好的选择)

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

由于旧浏览器不支持无缝,您应该添加一些 css 来修复它:

iframe[seamless] {
    border: none;
}

请记住,对于不支持无缝的浏览器,如果您单击 iframe 中的链接,它将使 frame 转到该 url,而不是整个窗口。一种解决方法是让所有链接都有 target="_parent",但浏览器支持“足够好”。


例如,它似乎没有从父页面应用 css 样式。
@兰迪所以?这可以算作一个加分项(尤其是对于用户生成的内容等)。无论如何,您都可以轻松地再次包含 css 文件,而无需再次发出请求,因为无论如何都会缓存。
回答了我对这个问题的答案的需求 - 如何在另一个 html 文件中包含一个 html 文件......
seamless 属性 来自它所来自的 HTML 草稿中的 removed。不要使用它。
太棒了,这也适用于 MarkDown。在 Typora 上测试。
b
bendecko

一个简单的服务器端包含指令包含在同一文件夹中找到的另一个文件,如下所示:

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

您也可以尝试:

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

您需要配置服务器以使用 SSI
以下是为您的服务器配置 SSI 的参考:httpd.apache.org/docs/2.4/howto/ssi.html#configuring
可能也值得尝试<!--#include file="a.html" -->
SSI 包含使 Web 服务器稍微慢一点(因此在绝对必要之前应避免使用)。
对于 IIS,这也是一个不错的解决方案。我必须在我的 {1 <handlers> 部分中的 } 文件
b
bjb568

very old solution 我当时确实满足了我的需求,但以下是符合标准的代码:

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

看起来 <object><embed><iframe> 都适用于此,但在所有三种情况下,它们都使用自己的样式和脚本上下文创建单独的文档(iframe 特别包括丑陋的边框和滚动条),例如任何链接默认情况下在它们中而不是在父页面上打开(尽管这可以用 target="_parent" 覆盖)。在所有这些中,iframe 是唯一有希望通过 HTML5 seamless 属性(bjb568 提到)变得更加集成的框架,但它还没有得到很好的支持:caniuse.com/#feat=iframe-seamless
iframe-seamless 已从 HTML 标准中删除:github.com/whatwg/html/issues/331。所以@waldyrious 评论不再正确(介意更新你的评论吗?)
感谢@TomášPospíšek 的提醒。我不能再编辑我的评论了,但希望你的回复能给读者提供必要的警告。需要明确的是,最后一句话(关于 seamless 属性)是唯一过时的部分——其余部分仍然适用。
C
CoolDude

如果需要包含来自某个文件的 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


像魅力一样工作,这是最干净的解决方案。这应该是公认的答案。
同意。请注意:不要尝试做一个自闭合的对象标签。之后的文本将被删除。
它似乎创建了一个新的“#document”,它自动包含新的嵌套 和 标签。这对我的目的不起作用;我的 .html 文件包含