您可能想查看HTML5 History API。有很多关于如何开始使用它的教程,但基本要点是,当你用 jQuery 加载一个新的“页面”时,你将它推送到历史堆栈中:
// After loading the new page...
window.history.pushState({}, '', 'newpage.html');
这将使用户代理显示yoursite.com/newpage.html
在 URL 栏中,即使该页面从未加载过。
Caniuse 报告说历史 API 支持相当好。通常的嫌疑人(IE 7 和 8)没有支持,但有polyfills 可用。
History API 的唯一警告(它是一个重要的)是:您作为第三个(可选)参数传递给的页面history.pushState
必须存在于您的服务器上。用户可以从 URL 栏中复制 URL 并共享它,因此页面名称必须与真实页面相对应。这样做的问题在于,它似乎并不适用于您的网站,因为您没有动态加载的单独页面。
在我看来,您的投资组合是一个连续的页面,因此我建议使用哈希 URL。也就是说,网址yoursite.com/#about
和yoursite.com/#contact
. 您可以在加载新页面时更新window.location
以包含哈希(并且浏览器不会重新加载页面)。
window.location = '#new-page-that-was-just-navigated-to';
或者你可以只更新window.location.hash
. 当您的网站使用此属性加载以确定应显示哪个页面时,您可以使用 javascript 检查哈希的内容。
$(document).ready(function() {
switch(window.location.hash) {
case 'home': // load home
case 'about': // load about
default: // load default page (index)
}
});
此外,您可以使用HashChange 事件(在MDN 文档页面上提供 polyfill )从 HTML 中抽象出 JS。而不是这样做:
<a href="javascript:void(0);" id="about">About</a>
<a href="javascript:void(0);" id="projects">Projects</a>
<a href="javascript:void(0);" id="contact">Contact</a>
<script>
document.getElementById('about').addEventListener('click', function() {
// navigate to about page
}, false);
document.getElementById('projects').addEventListener('click', function() {
// navigate to projects page
}, false);
//etc.
</script>
您可以改为这样做:
<a href="#about" id="about">About</a>
<a href="#projects" id="projects">Projects</a>
<a href="#contact" id="contact">Contact</a>
<script>
window.addEventListener('hashchange', function() {
switch(window.location.hash) {
case 'about': // load page
case 'projects': // load page
case 'contact': // load page
default: // not found
}
}, false);
</script>
这样做的好处是您的链接具有有意义的 href,并且您不必为站点上的每个链接添加事件侦听器。只需为它们分配一个哈希并监听hashchange
.
编辑
请注意,这也适用于 jQuery:
$(window).on('hashchange', function() {
switch(window.location.hash) {
case 'about': // load page
case 'projects': // load page
case 'contact': // load page
default: // not found
}
});