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

IT技术 javascript html dom include
2020-12-17 16:31:18

我有 2 个 HTML 文件,假设a.htmlb.html. a.html我想包括b.html.

在 JSF 中,我可以这样做:

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

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

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

6个回答

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

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

从上面扩展 lolo 的答案,如果您必须包含大量文件,这里有更多的自动化。使用这个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并在包含的文件中检索它?
2021-02-22 16:31:18
@ArtemBernatskyi 当您运行本地服务器时,它有帮助吗?这是一个简单的教程:developer.mozilla.org/en-US/docs/Learn/Common_questions/...
2021-02-24 16:31:18
不适用于带有本地文件的 chrome“仅协议方案支持跨源请求:htt”
2021-02-28 16:31:18
@chris 您可以使用 GET 参数,例如 $("#postdiv").load('posts.php?name=Test&age=25');
2021-03-01 16:31:18

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

一个.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.htmlb.jshttps : //gist.github.com/Tafkadasoh/334881e18cbb7fc2a5c033bfa03f6ee6

感谢Greg Minshall改进了 sed 命令,该命令还可以转义反斜杠和单引号,而我原来的 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>

`);
您可以使用反引号`- 然后您可以插入表达式,例如${var}- 然后您只需要转义\`\$
2021-02-08 16:31:18
哦,天哪,这很丑 - 不,谢谢。我宁愿将我的 html 写成 html。我不在乎是否可以在命令行上使用 sed - 我不想在每次更改模板内容时都依赖它。
2021-02-19 16:31:18
@TrevorHickey 是的,你说得对,这是我的解决方案的缺点,而且不是很优雅。但是,因为您可以在每行末尾插入一个带有简单正则表达式的 '\',这对我来说效果最好。嗯......也许我应该在我的答案中添加如何通过正则表达式进行插入......
2021-03-07 16:31:18
@Goodra 它应该适用于任何没有'标记的HTML 如果您只是执行查找 / 替换来替换` with \` 然后查找 / 替换以替换'\'和新行替换为``new-lines 它将正常工作。
2021-03-07 16:31:18
@wizzwizz4:感谢 Greg,sed 命令现在也可以转义单引号和反斜杠。此外,我还添加了一个 bash 脚本,可以为您完成所有工作。:-)
2021-03-07 16:31:18

通过 Html5rocks 教程聚合物项目检查 HTML5 导入

例如:

<head>
  <link rel="import" href="/path/to/imports/stuff.html">
</head>
HTML 导入并不意味着将内容直接包含在页面中。此答案中的代码仅stuff.html可用作父页面中的模板,但您必须使用脚本在父页面中创建其 DOM 的克隆,以便用户可以看到它们。
2021-02-07 16:31:18
html5rocks.com 上关于将一个 HTML 页面的内容插入到另一个页面的说明在许多浏览器中似乎并不适用,但是。我在 Opera 12.16 和 Superbird Version 32.0.1700.7 (233448) 中尝试过,但没有效果(在 Xubuntu 15.04 上)。不过,我听说它在 Firefox 中不起作用(由于一个希望已修复的错误)或许多版本的 Chrome。因此,虽然它看起来可能是未来的理想解决方案,但它不是跨浏览器的解决方案。
2021-02-18 16:31:18
2018 年末更新:由于某种原因, HTML 导入显然已被弃用
2021-02-18 16:31:18
HTML 导入已弃用,并于 2020 年 2 月从 Chrome 中删除。
2021-02-18 16:31:18
Firefox 将不支持它。要启用它,请尝试设置“dom.webcomponents.enabled”。它仅适用于 Chrome 和 Opera,Android 具有可更新的网络视图(startng 4.4.3)。苹果浏览器不支持。对于 web 组件来说,这看起来是一个不错的主意,但尚未广泛实施。
2021-02-28 16:31:18

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

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

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

上面的内容将/path/to/include.html取而代之div

感谢这项工作,它包括 HTML/CSS 但不包括源文件中的 Javascript。您只需要在任何使用<div data-include="/path/to/include.html"></div>. 此工具可以更轻松地以干净的方式制作简单的无插件多页模型。
2021-02-16 16:31:18
杰出的!!!!你的似乎是唯一的解决方案,它取代了用作插入位置标记的 div 标签。以后我要仔细研究源码!!:-)
2021-02-19 16:31:18
如果 include.html 嵌入了 JavaScript,这会评估 JavaScript 吗?
2021-02-21 16:31:18
我可以在任何应用程序中使用这个库吗?我的意思是如何相信作者?W3School 有类似的解决方案,唯一不同的是你的代码也迎合了窗口加载的递归调用...... w3schools.com/howto/tryit.asp?filename=tryhow_html_include_1
2021-02-22 16:31:18
@Seth 似乎没有。我将使用 src 看看我是否可以做到这一点。感谢迈克尔·马尔
2021-03-07 16:31:18