我正在构建一个完全由jquery驱动的网站,因此我使用ajax动态加载所有页面,以实现页面之间的奇特转换并最大化用户体验。 这是我的javascript代码:
$(function() {
var path = _.compact(location.pathname.split("/"));
if(path.length<2){
path = 'home'
}else{
path = path[path.length-1];
}
activepage = path;
$('.nav a').click(function(e) {
href = $(this).attr("href");
loadContent(href);
// HISTORY.PUSHSTATE
window.history.pushState('', 'New URL: '+href, href);
e.preventDefault();
});
// THIS EVENT MAKES SURE THAT THE BACK/FORWARD BUTTONS WORK AS WELL
window.onpopstate = function(event) {
var path = _.compact(location.pathname.split("/"));
if(path.length<2){
path = 'home'
}else{
path = path[path.length-1];
}
loadContent(path);
};
});
function loadContent(url){
// USES JQUERY TO LOAD THE CONTENT
var adresa = absurl + "ajax/get_content";
$.ajax({
url: adresa,
contentType: 'application/json',
data: { url: url },
success: function(data) {
switch(url)
{
case "projects": $.projects({ data : data }); $.projects.init();
break;
case "home": $.homePage({ data : data }); $.homePage.init();
break;
default: console.log("nista");
}
}
});
}
Ajax函数返回以json格式构建页面所需的所有数据,然后我初始化我的自定义插件,该插件使用该json数据构建页面。
正如您在LIVE EXAMPLE上看到的那样,所有这些都非常正常,包括浏览器历史记录(后退和前进)。 但这是我的问题...当页面完全加载时,当我查看页面的源时,主容器仍然是空的。当我尝试将页面作为谷歌机器人获取时,它也是空的,我很确定这两个是相关的。
正如您在this example上看到的那样,我的代码几乎完全相同,当您点击链接时,源代码也会被更改,它也会更改页面内容,但不会重新加载页面。 我的问题是,我在这里缺少什么以及如何达到同样的效果?我错过了一些PHP代码或什么?在过去的几天里,我正在努力解决这个问题,我已经尝试了一切,但我无法使其发挥作用。
注意:目前只有家庭和项目链接正在运作...
非常感谢所有回复!
答案 0 :(得分:1)
pushState
允许您在使用Ajax更新页面内容时更改URI的本地部分。
对于您以这种方式创建的每个URI,允许服务器构建相同的页面而不依赖于JavaScript。
这将:
答案 1 :(得分:0)
补充@ Quentin的答案,您需要在PHP中识别是否通过ajax加载内容。 如果不是,则必须显示所请求页面的完整内容,包括页眉,页脚和页面内容。