使页眉和页脚文件包含在多个html页面中

Pra*_*A R 122 html javascript css jquery

我想创建包含在几个html页面上的常见页眉和页脚页面.

我想用javascript.有没有办法只使用HTML和JavaScript?

我想在另一个html页面中加载页眉和页脚页面.

Har*_*anx 170

你可以用jquery完成这个.

将此代码放入 index.html

<html>
<head>
<title></title>
<script
    src="https://code.jquery.com/jquery-3.3.1.js"
    integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
    crossorigin="anonymous">
</script>
<script> 
$(function(){
  $("#header").load("header.html"); 
  $("#footer").load("footer.html"); 
});
</script> 
</head>
<body>
<div id="header"></div>
<!--Remaining section-->
<div id="footer"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

并将此代码放在header.htmlfooter.html,在同一位置index.html

<a href="http://www.google.com">click here for google</a>
Run Code Online (Sandbox Code Playgroud)

现在,当您访问时index.html,您应该可以单击链接标记.

  • 导入或使用"本地文件"的加载或其他功能在新版Google Chrome或IE中无效,原因:安全性! (14认同)
  • 有时我想知道如果没有jQuery,人们甚至可以呼吸.或者是否已经有`.breathe(in)`和`.breathe(out)`了?任何脚本语言都是纯粹的矫枉过正. (6认同)
  • 我一直得到`当我在chrome中运行时,仅支持协议方案的交叉原始请求:http,数据,chrome,chrome-extension,https,chrome-extension-resource. (6认同)
  • 需要在服务器中运行代码。这意味着 url 需要像“http://.....”。 (2认同)

The*_*acy 31

我使用Server Side Includes添加公共部分作为页眉和页脚.不需要HTML和JavaScript.相反,Web服务器会在执行任何其他操作之前自动添加包含的代码.

只需在要包含文件的位置添加以下行:

<!--#include file="include_head.html" -->
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种老式的方式.事实上,使用脚本执行这样一个简单的操作似乎并没有很多好处. (6认同)
  • 实际上,使用脚本包含文件具有主要缺点:由于客户端需要下载主页,加载DOM,运行脚本然后才可以下载包含的文件,因此会妨碍性能,这需要每个包含的文件额外的服务器请求。使用“服务器端包含”包含文件可在第一个服务器请求期间提供所有元素,而无需客户端操作。 (3认同)
  • @TheConspiracy 我的意思是,也许你没有网络服务器,或者使用没有网络服务器的服务器 - 例如 github 页面 - 在这种情况下你就不走运了:P (2认同)

Sol*_*Sol 26

你必须使用JavaScript的HTML文件结构吗?您是否考虑过使用PHP,以便您可以使用简单的PHP包含对象?

如果您将.html页面的文件名转换为.php - 然后在每个.php页面的顶部,您可以使用一行代码来包含header.php中的内容

<?php include('header.php'); ?>
Run Code Online (Sandbox Code Playgroud)

在每个页面的页脚中执行相同操作以包含footer.php文件中的内容

<?php include('footer.php'); ?>
Run Code Online (Sandbox Code Playgroud)

不需要JavaScript/Jquery或其他包含的文件.

注意您还可以使用.htaccess文件中的以下内容将.html文件转换为.php文件

# re-write html to php
RewriteRule ^(.*)\.html$ $1.php [L]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]


# re-write no extension to .php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于运行服务器的情况. (3认同)
  • @ Justin808 - OP没有提及本地托管安装,所以我假设他在讨论基于服务器的文件. (2认同)
  • @Sol但是OP确实特别提到想要使用Javascript,所以你的答案是偏离主题的。全栈 Web 开发正在迅速不再使用 PHP,Node.js 提供了所有等效的功能,并且只需要使用 Javascript。TL;DR 请按要求回答问题。OP想要一个JS解决方案,所以给他一个PHP、Ruby、Python、C++或任何其他语言的解决方案是不合适的。 (2认同)

Dim*_*Vai 13

该问题询问仅使用 HTML 和 JavaScript。问题是使用 JavaScript 甚至 jQuery (请求额外的header.html“稍后”)向服务器发出的第二个请求是:

慢的!

因此,这在生产环境中是不可接受的。一种方法是仅包含一个文件并仅使用此 .js 文件.js来提供 HTML 模板。因此,第 1 步,在 HTML 中您可以:

<header id="app-header"></header>
<script async src="header.js"></script>  
Run Code Online (Sandbox Code Playgroud)

然后,第 2 步,将模板放入header.js. 对此 HTML 字符串使用反引号:

let appHeader = `
    <nav>
       /*navigation or other html content here*/
    </nav>
`;
document.getElementById("app-header").innerHTML = appHeader;
Run Code Online (Sandbox Code Playgroud)

这还有一个好处,您可以根据需要动态更改模板的内容,因为它是 JavaScript!另外,尝试defer(甚至不尝试)安装异步,但对用户来说可能看起来更慢 - 这取决于您的其他内容,所以只需尝试即可。只是,别忘了把 放在script后面header

关于速度的说明

在 HTTP/2 世界中,Web 服务器“理解”哪些附加文件(.css、.js 等)应与特定的 一起发送.html,并在初始响应中将它们一起发送。但是,如果在您的“原始”文件中.html没有header.html导入此文件(因为您打算稍后使用脚本调用它),则最初不会发送该文件。因此,当您的 JavaScript/jQuery 请求它时(这将在很久以后发生,当 HTML 和 JavaScript 被“解释”时),您的浏览器将向服务器发送第二个请求,等待答案,然后执行其操作。 ..这就是为什么这很慢的原因。您可以使用任何浏览器的开发人员工具来验证这一点,并header.html稍后观看即将发生的事情。

因此,作为一般建议(当然有很多例外),如果您关心速度,请将所有附加文件导入原始.html(或)文件中。如果需要,php请使用defer或。稍后不要使用 JavaScript 导入任何文件。async


小智 9

我试过这个:创建一个文件header.html之类的

<!-- Meta -->
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<!-- JS -->
<script type="text/javascript" src="js/lib/jquery-1.11.1.min.js" ></script>
<script type="text/javascript" src="js/lib/angular.min.js"></script>
<script type="text/javascript" src="js/lib/angular-resource.min.js"></script>
<script type="text/javascript" src="js/lib/angular-route.min.js"></script>
<link rel="stylesheet" href="css/bootstrap.min.css">

<title>Your application</title>
Run Code Online (Sandbox Code Playgroud)

现在在HTML页面中包含header.html,例如:

<head>
   <script type="text/javascript" src="js/lib/jquery-1.11.1.min.js" ></script>
   <script> 
     $(function(){ $("head").load("header.html") });
   </script>
</head>
Run Code Online (Sandbox Code Playgroud)

工作得很好.

  • 不错的解决方案,但我认为这会加载 jquery 框架两次,一次用于初始页面加载,其次是在 .load() 方法执行时 - 因为目标页面也包含 jquery。 (3认同)

小智 7

你也可以把:(load_essentials.js :)

document.getElementById("myHead").innerHTML =
	"<span id='headerText'>Title</span>"
	+ "<span id='headerSubtext'>Subtitle</span>";
document.getElementById("myNav").innerHTML =
	"<ul id='navLinks'>"
	+ "<li><a href='index.html'>Home</a></li>"
	+ "<li><a href='about.html'>About</a>"
	+ "<li><a href='donate.html'>Donate</a></li>"
	+ "</ul>";
document.getElementById("myFooter").innerHTML =
	"<p id='copyright'>Copyright &copy; " + new Date().getFullYear() + " You. All"
	+ " rights reserved.</p>"
	+ "<p id='credits'>Layout by You</p>"
	+ "<p id='contact'><a href='mailto:you@you.com'>Contact Us</a> / "
	+ "<a href='mailto:you@you.com'>Report a problem.</a></p>";
Run Code Online (Sandbox Code Playgroud)
<!--HTML-->
<header id="myHead"></header>
<nav id="myNav"></nav>
Content
<footer id="myFooter"></footer>

<script src="load_essentials.js"></script>
Run Code Online (Sandbox Code Playgroud)


Jav*_*tes 6

我认为,这个问题的答案太旧了......目前一些桌面和移动浏览器都支持HTML模板.

我建立了一个小例子:

在Chrome 61.0,Opera 48.0,Opera Neon 1.0,Android Browser 6.0,Chrome Mobile 61.0和Adblocker Browser 54.0中测试OK在Safari 10.1,Firefox 56.0,Edge 38.14和IE 11中
测试了KO

canisue.com中的更多兼容性信息

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML Template Example</title>

    <link rel="stylesheet" href="styles.css">
    <link rel="import" href="autoload-template.html">
</head>
<body>

<div class="template-container">1</div>
<div class="template-container">2</div>
<div class="template-container">3</div>
<div class="template-container">4</div>
<div class="template-container">5</div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

autoload-template.html

<span id="template-content">
    Template Hello World!
</span>

<script>
    var me = document.currentScript.ownerDocument;
    var post = me.querySelector( '#template-content' );

    var container = document.querySelectorAll( '.template-container' );

    //alert( container.length );
    for(i=0; i<container.length ; i++) {
        container[i].appendChild( post.cloneNode( true ) );
    }
</script>
Run Code Online (Sandbox Code Playgroud)

styles.css

#template-content {
    color: red;
}

.template-container {
    background-color: yellow;
    color: blue;
}
Run Code Online (Sandbox Code Playgroud)

您可以在此HTML5 Rocks帖子中获得更多示例

  • 现在不推荐使用HTML导入。 (3认同)

dar*_*her 5

我一直在C#/ Razor工作,因为我在家用笔记本电脑上没有IIS设置,所以我在为项目创建静态标记的过程中寻找加载视图的JavaScript解决方案.

我偶然发现了一个网站,解释了"放弃jquery"的方法,它演示了一个网站上的方法,正是你在普通的简javascript(帖子底部的参考链接)中所做的.如果您打算在生产中使用它,请务必调查任何安全漏洞和兼容性问题.我不是,所以我自己从未调查过.

JS功能

var getURL = function (url, success, error) {
    if (!window.XMLHttpRequest) return;
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === 4) {
            if (request.status !== 200) {
                if (error && typeof error === 'function') {
                    error(request.responseText, request);
                }
                return;
            }
            if (success && typeof success === 'function') {
                success(request.responseText, request);
            }
        }
    };
    request.open('GET', url);
    request.send();
};
Run Code Online (Sandbox Code Playgroud)

获取内容

getURL(
    '/views/header.html',
    function (data) {
        var el = document.createElement(el);
        el.innerHTML = data;
        var fetch = el.querySelector('#new-header');
        var embed = document.querySelector('#header');
        if (!fetch || !embed) return;
        embed.innerHTML = fetch.innerHTML;

    }
);
Run Code Online (Sandbox Code Playgroud)

的index.html

<!-- This element will be replaced with #new-header -->
<div id="header"></div>
Run Code Online (Sandbox Code Playgroud)

意见/ header.html中

<!-- This element will replace #header -->
<header id="new-header"></header>
Run Code Online (Sandbox Code Playgroud)

源代码不是我自己的,我只是引用它,因为它是OP的一个很好的vanilla javascript解决方案.原始代码存在于此处:http://gomakethings.com/ditching-jquery#get-html-from-another-page