我想创建包含在几个 html 页面中的通用页眉和页脚页面。
我想使用javascript。有没有办法只使用 html 和 JavaScript 来做到这一点?
我想在另一个 html 页面中加载页眉和页脚页面。
我想创建包含在几个 html 页面中的通用页眉和页脚页面。
我想使用javascript。有没有办法只使用 html 和 JavaScript 来做到这一点?
我想在另一个 html 页面中加载页眉和页脚页面。
您可以使用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>
并将此代码放入header.html
andfooter.html
中,与index.html
<a href="http://www.google.com">click here for google</a>
现在,当您访问 时index.html
,您应该可以单击链接标签。
我使用Server Side Includes添加公共部分作为页眉和页脚。不需要 HTML 和 JavaScript。相反,网络服务器会在执行任何其他操作之前自动添加包含的代码。
只需在要包含文件的位置添加以下行:
<!--#include file="include_head.html" -->
必须在 JavaScript 中使用 html 文件结构吗?您是否考虑过使用 PHP,以便可以使用简单的 PHP 包含对象?
如果您将 .html 页面的文件名转换为 .php - 然后在每个 .php 页面的顶部,您可以使用一行代码来包含 header.php 中的内容
<?php include('header.php'); ?>
在每个页面的页脚中执行相同的操作以包含来自您的 footer.php 文件的内容
<?php include('footer.php'); ?>
不需要 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]
你也可以放:(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 © " + 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>";
<!--HTML-->
<header id="myHead"></header>
<nav id="myNav"></nav>
Content
<footer id="myFooter"></footer>
<script src="load_essentials.js"></script>
我试过这个:像这样创建一个文件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>
现在在您的 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>
工作得很好。
我一直在使用 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();
};
获取内容
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;
}
);
索引.html
<!-- This element will be replaced with #new-header -->
<div id="header"></div>
意见/header.html
<!-- This element will replace #header -->
<header id="new-header"></header>
源不是我自己的,我只是引用它,因为它是 OP 的一个很好的 vanilla javascript 解决方案。原始代码在这里: http: //gomakethings.com/ditching-jquery#get-html-from-another-page
我认为,这个问题的答案太旧了......目前一些桌面和移动浏览器支持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>
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>
styles.css
#template-content {
color: red;
}
.template-container {
background-color: yellow;
color: blue;
}
您可以在这篇HTML5 Rocks 帖子中获得更多示例
2018 年的阿罗哈。不幸的是,我没有任何酷炫或未来主义的东西可以与您分享。
然而,我确实想向那些评论说 jQueryload()
方法目前不起作用的人指出,他们可能正在尝试在不运行本地 Web 服务器的情况下将该方法用于本地文件。这样做会抛出上面提到的“跨源”错误,它指定了诸如 load 方法发出的跨源请求仅支持 , 或 等http
协议data
方案 https
。(我假设您没有发出实际的跨域请求,即 header.html 文件实际上与您请求它的页面位于同一域中)
因此,如果上面接受的答案不适合您,请确保您正在运行 Web 服务器。如果您赶时间(并且使用预装了 Python 的 Mac),那么最快和最简单的方法是启动一个简单的 Python http 服务器。您可以在这里看到做到这一点是多么容易。
我希望这有帮助!
也可以将脚本和链接加载到标题中。我将在上面的示例之一中添加它...
<!--load_essentials.js-->
document.write('<link rel="stylesheet" type="text/css" href="css/style.css" />');
document.write('<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />');
document.write('<script src="js/jquery.js" type="text/javascript"></script>');
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 © " + 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>";
<!--HTML-->
<header id="myHead"></header>
<nav id="myNav"></nav>
Content
<footer id="myFooter"></footer>
<script src="load_essentials.js"></script>
为了使用纯 javascript 进行快速设置,并且由于尚未得到答复,您还可以使用.js
文件将 HTML 的冗余部分(模板)存储 在变量中,并将其插入到innerHTML
.
反引号在这里是这个答案的简单部分。
(如果您阅读并测试该答案,您还需要关注反引号 SO Q/A 上的链接)。
在每个页面上保持相同的导航栏的示例:
<nav role="navigation">
<a href="/" class="here"><img src="image.png" alt="Home"/></a>
<a href="/about.html" >About</a>
<a href="/services.html" >Services</a>
<a href="/pricing.html" >Pricing</a>
<a href="/contact.html" >Contact Us</a>
</nav>
您可以保留在您的 HTML 中:
<nav role="navigation"></nav>
并将 nav.js
文件的内容设置<nav>
为反引号之间的变量:
const nav= `
<a href="/" class="here"><img src="image.png" alt="Home"/></a>
<a href="/about.html" >About</a>
<a href="/services.html" >Services</a>
<a href="/pricing.html" >Pricing</a>
<a href="/contact.html" >Contact Us</a>
` ;
现在您有一个小文件,您可以从中检索包含 HTML 的变量。它看起来与 include.php 非常相似,并且可以轻松更新而不会弄乱它(反引号内的内容)。
您现在可以像链接任何其他 javascript 文件一样链接该文件,并通过 innerHTML 链接内部nav
的var<nav role="navigation"></nav>
let barnav = document.querySelector('nav[role="navigation"]');
barnav.innerHTML = nav;
如果您添加或删除页面,您只需更新一次nav.js
基本的 HTML 页面可以是:
// code standing inside nav.js for easy edit
const nav = `
<a href="/" class="here"><img src="image.png" alt="Home"/></a>
<a href="/about.html" >About</a>
<a href="/services.html" >Services</a>
<a href="/pricing.html" >Pricing</a>
<a href="/contact.html" >Contact Us</a>
`;
nav[role="navigation"] {
display: flex;
justify-content: space-around;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Home</title>
<!-- update title if not home page -->
<meta name="description" content=" HTML5 ">
<meta name="author" content="MasterOfMyComputer">
<script src="nav.js"></script>
<!-- load an html template through a variable -->
<link rel="stylesheet" href="css/styles.css?v=1.0">
</head>
<body>
<nav role="navigation">
<!-- it will be loaded here -->
</nav>
<h1>Home</h1>
<!-- update h1 if not home page -->
<script>
// this part can also be part of nav.js
window.addEventListener('DOMContentLoaded', () => {
let barnav = document.querySelector('nav[role="navigation"]');
barnav.innerHTML = nav;
});
</script>
</body>
</html>
这个快速示例有效并且可以复制/粘贴然后编辑以更改变量名称和变量 HTML 内容。
该问题询问仅使用 HTML 和 JavaScript。问题是您的 JavaScript 对服务器的第二个请求(请求header.html
“稍后”)是:
减缓!
因此,这在生产环境中是不可接受的。可行的方法是只导入一个文件并仅使用这个 .js 文件来.js
提供您的 HTML 模板。因此,在您的 HTML 中,您可以拥有:
<script defer src="header.js"></script>
<header id="app-header"></header>
然后,在您header.js
的模板中。对此 HTML 字符串使用反引号:
let appHeader = `
<nav>
/*navigation or other html content here*/
</nav>
`;
document.getElementById("app-header").innerHTML = appHeader;
这还有一个好处,即您可以根据需要动态更改模板的内容!(如果您希望代码干净,我的建议是不要在此header.js
文件中包含任何其他代码。)
关于速度的解释
在 HTTP/2 世界中,Web 服务器“不知道”应该与特定的 .css、.js 等一起发送哪些附加文件.html
,并在初始响应中将它们一起发送。但是,如果在您的“原始文件”中.html
您没有header.html
导入此文件(因为您打算稍后使用脚本调用它),则最初不会发送它。因此,当您的 JavaScript/jQuery 请求它时(这将在很久以后发生,当 HTML 和您的 JavaScript 将被“解释”时),您的浏览器将向服务器发送第二个请求,等待答案,然后执行它的工作。 ..这就是为什么这很慢。您可以使用任何浏览器的开发人员工具来验证这一点,并在header.html
以后观看。
因此,作为一般建议(当然有很多例外),如果您关心速度,请将所有附加文件导入原始.html
(或)文件中。需要时php
使用。以后不要使用 JavaScript 导入任何文件。defer
自从第一次提出这个问题以来,另一种可用的方法是使用 reactrb-express(请参阅http://reactrb.org)这将让您在客户端使用 ruby 编写脚本,用用 ruby 编写的 react 组件替换您的 html 代码。
使用 ajax
main.js
fetch("./includes/header.html")
.then(response => {
return response.text();
})
.then(data => {
document.querySelector("header").innerHTML = data;
});
fetch("./includes/footer.html")
.then(response => {
return response.text();
})
.then(data => {
document.querySelector("footer").innerHTML = data;
});
索引.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Liks</title>
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<header></header>
<main></main>
<footer></footer>
<script src="/js/main.js"></script>
</body>
</html>
您可以在不使用 JavaScript 的情况下使用 HTML 的对象标记。
<object data="header.html" type="text/html" height="auto"></object>
学分:W3 学校如何包含 HTML
保存要包含在 .html 文件中的 HTML:
内容.html
<a href="howto_google_maps.asp">Google Maps</a><br>
<a href="howto_css_animate_buttons.asp">Animated Buttons</a><br>
<a href="howto_css_modals.asp">Modal Boxes</a><br>
<a href="howto_js_animate.asp">Animations</a><br>
<a href="howto_js_progressbar.asp">Progress Bars</a><br>
<a href="howto_css_dropdown.asp">Hover Dropdowns</a><br>
<a href="howto_js_dropdown.asp">Click Dropdowns</a><br>
<a href="howto_css_table_responsive.asp">Responsive Tables</a><br>
包括 HTML
包含 HTML 是通过使用w3-include-html属性完成的:
例子
<div w3-include-html="content.html"></div>
添加 JavaScript
HTML 包含由 JavaScript 完成。
<script>
function includeHTML() {
var z, i, elmnt, file, xhttp;
/*loop through a collection of all HTML elements:*/
z = document.getElementsByTagName("*");
for (i = 0; i < z.length; i++) {
elmnt = z[i];
/*search for elements with a certain atrribute:*/
file = elmnt.getAttribute("w3-include-html");
if (file) {
/*make an HTTP request using the attribute value as the file name:*/
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4) {
if (this.status == 200) {elmnt.innerHTML = this.responseText;}
if (this.status == 404) {elmnt.innerHTML = "Page not found.";}
/*remove the attribute, and call this function once more:*/
elmnt.removeAttribute("w3-include-html");
includeHTML();
}
}
xhttp.open("GET", file, true);
xhttp.send();
/*exit the function:*/
return;
}
}
}
</script>
在页面底部调用 includeHTML():
例子
<!DOCTYPE html>
<html>
<script>
function includeHTML() {
var z, i, elmnt, file, xhttp;
/*loop through a collection of all HTML elements:*/
z = document.getElementsByTagName("*");
for (i = 0; i < z.length; i++) {
elmnt = z[i];
/*search for elements with a certain atrribute:*/
file = elmnt.getAttribute("w3-include-html");
if (file) {
/*make an HTTP request using the attribute value as the file name:*/
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4) {
if (this.status == 200) {elmnt.innerHTML = this.responseText;}
if (this.status == 404) {elmnt.innerHTML = "Page not found.";}
/*remove the attribute, and call this function once more:*/
elmnt.removeAttribute("w3-include-html");
includeHTML();
}
}
xhttp.open("GET", file, true);
xhttp.send();
/*exit the function:*/
return;
}
}
};
</script>
<body>
<div w3-include-html="h1.html"></div>
<div w3-include-html="content.html"></div>
<script>
includeHTML();
</script>
</body>
</html>