精简版
content.php
本教程中引用 的文件有哪些内容?
http://moz.com/blog/create-crawlable-link-friendly-ajax-websites-using-pushstate
带研究的长版
上面的教程是我在实现pushState()
和popState()
通过 Ajax 加载内容但希望保留书签和浏览器来回导航功能的场景中遇到的最简洁的教程:
已设置演示页面作为概念证明:
源代码如下。
实现它需要几个中间步骤,但是我并不完全熟悉:
- 设置 JSON 格式的 PHP 内容文件
- 了解 JSON 格式
对这篇文章html5 pushstate 示例和 jquery 的 $.getJSON 的评论建议使用 Firebug 来查看 HTTP 请求响应,以便查看 JSON 格式。
加载 Firebug 并选择 Console > All 后,当我单击导航链接时,我会看到以下条目:
GET http://html5.gingerhost.com/content.php?cid=%2F&format=json 200 OK 869ms
GET http://html5.gingerhost.com/content.php?cid=%2Fseattle&format=json 200 OK 859ms
GET http://html5.gingerhost.com/content.php?cid=%2Fnew-york&format=json 200 OK 837ms
GET http://html5.gingerhost.com/content.php?cid=%2Flondon&format=json 200 OK 863ms
每个条目的“响应”选项卡中的相应内容采用 JSON 格式:
{"title":"Title value here","h1":"H1 value here","article #articletext":"<p>Lots of html here.<\/p><p>That includes escaped characters.<\/p>","#image":"<img class=\"thumbnail\" alt=\"\" src=\"and_an_image.jpg\">"}
所以经过一番研究,JSON格式似乎是:
{
"myArrayName": [
{ "Key1":"Value1" , "Key2":"Value2" }, // object one
{ "Key1":"Value3" , "Key2":"Value4" }, // object two
{ "Key1":"Value5" , "Key2":"Value6" }, // object three
]
}
添加一个“真实世界”的例子可以使它:
{
"myCDCollection": [
{ "Title":"Trash" , "Artist":"Alice Cooper" }, // object one
{ "Title":"Dr. Feelgood" , "Artist":"Motley Crue" }, // object two
{ "Title":"Cherry Pie" , "Artist":"Warrant" }, // object three
]
}
所以keys
在概念证明中似乎是:
title
h1
article #articletext
#image
所以我的问题是content.php
教程中引用的文件需要具备哪些内容?
是否只是复制和粘贴 JSON 对象的问题,用逗号分隔?
它们是否需要封装在数组中?
数组需要名字吗?
然后将哪个封装在花括号中?
PHP 文件是否需要指定 MIME 媒体类型,如果需要,在哪里以及如何指定?
这是来自概念证明的脚本:
<script>
// THIS IS WHERE THE MAGIC HAPPENS
$(function() {
$('nav a').click(function(e) {
$("#loading").show();
href = $(this).attr("href");
loadContent(href);
// HISTORY.PUSHSTATE
history.pushState('', 'New URL: '+href, href);
e.preventDefault();
});
// THIS EVENT MAKES SURE THAT THE BACK/FORWARD BUTTONS WORK AS WELL
window.onpopstate = function(event) {
$("#loading").show();
console.log("pathname: "+location.pathname);
loadContent(location.pathname);
};
});
function loadContent(url){
// USES JQUERY TO LOAD THE CONTENT
$.getJSON("content.php", {cid: url, format: 'json'}, function(json) {
// THIS LOOP PUTS ALL THE CONTENT INTO THE RIGHT PLACES
$.each(json, function(key, value){
$(key).html(value);
});
$("#loading").hide();
});
// THESE TWO LINES JUST MAKE SURE THAT THE NAV BAR REFLECTS THE CURRENT URL
$('li').removeClass('current');
$('a[href="'+url+'"]').parent().addClass('current');
}
</script>