我使用获取语句检索我的 HTML 页脚并将其包含在每个页面上,但页脚中的 Date().getFullYear 脚本从未执行
I use a fetch statement to retrieve my HTML footer and include it on every page but the Date().getFullYear script in the footer never gets executed
我的 HTML 页面使用以下方法动态加载我的页眉菜单和页脚。
# in my page-includes.js file
fetch("nav-menu.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("nav").innerHTML = data;
});
fetch("footer.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("footer").innerHTML = data;
})
# code i tried at the bottom of my main page
<script>
document.getElementsByClassName("copyright-year")[0].innerHTML = "28 BC";
var spanTags = document.getElementsByClassName("copyright-year");
spanTags[0].text("13 BC");
spanTags[1].innetHTML = "28 BC";
setYear();
function setYear(){
if (document.readyState === 'interactive') {
let curYr = new Date().getFullYear();
for (i=0; i<span.length; i++) {
spanTags[i].innerHTML = curYr;
}
}
/* though I really don't know JQuery I tried this first */
/* $(".copyright-year").text(new Date().getFullYear()); */
</script>
<mainpage>
<nav class="navbar" id="sectionsNav">
</nav>
<footer class="footer footer-default">
</footer>
</mainpage>
<included-footer-html>
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="copyright float-left">
©
<span class="copyright-year">
<script defer>document.write(new Date().getFullYear());</script>
</span>
Kopacz, LLC
</div>
<div class="float-right">
All Rights Reserved
<sub><i class="material-icons">public</i></sub> Worldwide
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="copyright float-none">
Astronomy Photographs ©
<span class="copyright-year">
<script defer>document.write(new Date().getFullYear());</script>
</span>
David Kopacz
</div>
</div>
</div>
</div>
</included-footer-html>
问题是我是在 included.js 加载的 footer.html 中包含日期函数,还是只是嵌入一个简单的 span 标签,然后在页面加载后尝试修改它的文本, 日期永远不会放在页面上。
如果我用脚本将页脚 HTML 复制并粘贴到任何网页的底部,年份会完美显示,但是当通过此 Fetch 函数包含时,什么也不会显示。
最值得注意的是,当我查看我网站上任何网页的源代码时,我只会看到 Fetch 用来定位和放置导航和页脚的标签 HTML。实际的导航菜单和页脚 HTML 从未出现在源代码中,只有它们的容器标签和 .
可以在浏览器中使用 Inspect 查看包含的 HTML。
那么,如何在日期函数中访问这些“半隐藏”HTML 元素和脚本?
这是我几年前提出的一些东西,它将以动态加载的方式执行脚本 HTML
诀窍是在代码中复制脚本标签并替换它们 in-place - 等等 - 脚本 运行
const loadHtml = ((text, dest, replace = false) => {
if (typeof dest == 'string') {
dest = document.querySelector(dest);
}
const p = new DOMParser();
const doc = p.parseFromString(text, 'text/html');
const frag = document.createDocumentFragment();
while (doc.body.firstChild) {
frag.appendChild(doc.body.firstChild);
}
// handle script tags
const ret = Promise.all(Array.from(frag.querySelectorAll('script'), script => new Promise(resolve => {
const scriptParent = script.parentNode || frag;
const newScript = document.createElement('script');
if (script.src) {
newScript.addEventListener('load', e => resolve({ src: script.src, loaded: true }));
newScript.addEventListener('error', e => resolve({ src: script.src, loaded: false}));
newScript.src = script.src;
} else {
newScript.textContent = script.textContent;
resolve({ src: false, loaded: true });
}
scriptParent.replaceChild(newScript, script);
})));
if (replace) {
dest.innerHTML = '';
}
dest.appendChild(frag);
return ret;
});
在您的代码中使用它,例如
fetch("footer.html")
.then(response => response.text())
.then(data => loadHtml(data, "footer"))
// this last line isn't really needed, just logs failed scripts
.then(r => r.filter(({loaded}) => !loaded).forEach(({src}) => console.log(`failed to load ${src}`));
但是...您使用 document.write
会导致评论中提到的意外副作用 - 不要使用 document.write
使用 DOM 操作
例如
<div class="copyright float-left">
©
<span class="copyright-year">
<script>
var span = document.createElement('span');
span.innerHTML = new Date().getFullYear();
document.querySelector(".copyright-year").appendChild(span);
</script>
</span>
</div>
我的 HTML 页面使用以下方法动态加载我的页眉菜单和页脚。
# in my page-includes.js file
fetch("nav-menu.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("nav").innerHTML = data;
});
fetch("footer.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("footer").innerHTML = data;
})
# code i tried at the bottom of my main page
<script>
document.getElementsByClassName("copyright-year")[0].innerHTML = "28 BC";
var spanTags = document.getElementsByClassName("copyright-year");
spanTags[0].text("13 BC");
spanTags[1].innetHTML = "28 BC";
setYear();
function setYear(){
if (document.readyState === 'interactive') {
let curYr = new Date().getFullYear();
for (i=0; i<span.length; i++) {
spanTags[i].innerHTML = curYr;
}
}
/* though I really don't know JQuery I tried this first */
/* $(".copyright-year").text(new Date().getFullYear()); */
</script>
<mainpage>
<nav class="navbar" id="sectionsNav">
</nav>
<footer class="footer footer-default">
</footer>
</mainpage>
<included-footer-html>
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="copyright float-left">
©
<span class="copyright-year">
<script defer>document.write(new Date().getFullYear());</script>
</span>
Kopacz, LLC
</div>
<div class="float-right">
All Rights Reserved
<sub><i class="material-icons">public</i></sub> Worldwide
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="copyright float-none">
Astronomy Photographs ©
<span class="copyright-year">
<script defer>document.write(new Date().getFullYear());</script>
</span>
David Kopacz
</div>
</div>
</div>
</div>
</included-footer-html>
问题是我是在 included.js 加载的 footer.html 中包含日期函数,还是只是嵌入一个简单的 span 标签,然后在页面加载后尝试修改它的文本, 日期永远不会放在页面上。
如果我用脚本将页脚 HTML 复制并粘贴到任何网页的底部,年份会完美显示,但是当通过此 Fetch 函数包含时,什么也不会显示。
最值得注意的是,当我查看我网站上任何网页的源代码时,我只会看到 Fetch 用来定位和放置导航和页脚的标签 HTML。实际的导航菜单和页脚 HTML 从未出现在源代码中,只有它们的容器标签和 .
可以在浏览器中使用 Inspect 查看包含的 HTML。
那么,如何在日期函数中访问这些“半隐藏”HTML 元素和脚本?
这是我几年前提出的一些东西,它将以动态加载的方式执行脚本 HTML
诀窍是在代码中复制脚本标签并替换它们 in-place - 等等 - 脚本 运行
const loadHtml = ((text, dest, replace = false) => {
if (typeof dest == 'string') {
dest = document.querySelector(dest);
}
const p = new DOMParser();
const doc = p.parseFromString(text, 'text/html');
const frag = document.createDocumentFragment();
while (doc.body.firstChild) {
frag.appendChild(doc.body.firstChild);
}
// handle script tags
const ret = Promise.all(Array.from(frag.querySelectorAll('script'), script => new Promise(resolve => {
const scriptParent = script.parentNode || frag;
const newScript = document.createElement('script');
if (script.src) {
newScript.addEventListener('load', e => resolve({ src: script.src, loaded: true }));
newScript.addEventListener('error', e => resolve({ src: script.src, loaded: false}));
newScript.src = script.src;
} else {
newScript.textContent = script.textContent;
resolve({ src: false, loaded: true });
}
scriptParent.replaceChild(newScript, script);
})));
if (replace) {
dest.innerHTML = '';
}
dest.appendChild(frag);
return ret;
});
在您的代码中使用它,例如
fetch("footer.html")
.then(response => response.text())
.then(data => loadHtml(data, "footer"))
// this last line isn't really needed, just logs failed scripts
.then(r => r.filter(({loaded}) => !loaded).forEach(({src}) => console.log(`failed to load ${src}`));
但是...您使用 document.write
会导致评论中提到的意外副作用 - 不要使用 document.write
使用 DOM 操作
例如
<div class="copyright float-left">
©
<span class="copyright-year">
<script>
var span = document.createElement('span');
span.innerHTML = new Date().getFullYear();
document.querySelector(".copyright-year").appendChild(span);
</script>
</span>
</div>