Как реализовать pushState() и popState() с ajaxed-контентом в формате JSON?

Краткая версия

Какое содержимое имеет файл content.php, на который ссылается это руководство?

http://moz.com/blog/create-crawlable-link-friendly-ajax-websites-using-pushstate

Полная версия с исследованиями

Приведенный выше учебник является наиболее кратким, с которым я столкнулся, для реализации pushState() и popState() в сценарии, когда вы загружаете контент через Ajax, но хотите сохранить функции закладок и навигации браузера назад и вперед:

Демонстрационная страница была настроена как доказательство концепции:

http://html5.gingerhost.com/

Где исходный код, как показано ниже.

Однако для его реализации необходимо несколько промежуточных шагов, с которыми я не совсем знаком:

  • Настройка файла содержимого PHP в формате JSON
  • Понимание форматирования 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>

person user1063287    schedule 30.08.2013    source источник
comment
Я тоже некоторое время ищу ответ на этот вопрос!   -  person Szymon    schedule 02.09.2014


Ответы (1)


Неважно, что содержит content.php, он просто должен возвращать некоторый контент, который затем обрабатывается javascript и загружается в DOM. Вы не можете точно определить, что содержит его content.php, но, учитывая ограниченный объем страницы, вот одна из возможностей:

<?php
    $page = $_GET['cid'];

    $pageData = array();
    switch ($page) {
        case '/':
            $pageData = array(
                'title' => 'Seattle - Part of a demo for #ProSEO',
                'h1' => 'Seattle',
                'article #articletext' => '<p>Seattle is the northernmost major city in the contiguous United States, and the largest city in the Pacific Northwest and the state of Washington. It is a major seaport situated on a narrow isthmus between Puget Sound (an arm of the Pacific Ocean) and Lake Washington, about 114 miles (183 km) south of the Canada - United States border, and it is named after Chief Sealth \"Seattle\", of the Duwamish and Suquamish native tribes. Seattle is the center of the Seattle-Tacoma-Bellevue metropolitan statistical area--the 15th largest metropolitan area in the United States, and the largest in the northwestern United States.<\/p><p>Seattle is the county seat of King County and is the major economic, cultural and educational center in the region. The 2010 census found that Seattle is home to 608,660 residents within a metropolitan area of some 3.4 million inhabitants. The Port of Seattle, which also operates Seattle-Tacoma International Airport, is a major gateway for trade with Asia and cruises to Alaska, and is the 8th largest port in the United States in terms of container capacity.<\/p>',
                '#image' => '<img class=\"thumbnail\" alt=\"\" src=\"seattle.jpg\">'
            );
            break;
        case '/new-york':
            $pageData = array(
                'title' => 'New York - Part of a demo for #ProSEO',
                'h1' => 'New York',
                'article #articletext' => '<p>New York is the most populous city in the United States and the center of the New York metropolitan area, which is one of the most populous metropolitan areas in the world. New York City exerts a significant impact upon global commerce, finance, media, culture, art, fashion, research, technology, education, and entertainment. As the home of the United Nations Headquarters, it is also an important center for international affairs. The city is often referred to as New York City or the City of New York, to distinguish it from the state of New York, of which it is a part.<\/p>',
                '#image' => '<img class=\"thumbnail\" alt=\"\" src=\"new-york.jpg\">'
            );
            break;
        case '/london':
            // similar code for london
            break;
        case '/seattle':
            // similar code for seattle
            break;
    }

    header('Content-Type: application/json');
    echo json_encode($pageData);
?>

На самом деле он, скорее всего, извлекает данные страницы из внешнего источника, такого как база данных.

Это просто копирование и вставка объектов JSON, разделенных запятыми? Нужно ли их инкапсулировать в массив?

Ничего не нужно инкапсулировать в массив - не имеет значения, как он туда попадает (вы можете сгенерировать JSON самостоятельно вручную), если это то, что получается на выходе (json-допустимый файл). И вы указываете MIMEtype ответа на application/json, используя метод header в PHP.

person sahbeewah    schedule 04.09.2014
comment
Я понимаю, но зачем я искал content.php, чтобы он работал. В любом случае, есть ли возможность заставить этот пример работать? На данный момент я действительно нуб, поэтому любая помощь будет очень признательна - person Szymon; 05.09.2014
comment
Например, я вставил индекс в заголовок ‹?php echo $pageData['title']?›, и он не работает, что я делаю неправильно? - person Szymon; 05.09.2014
comment
Я дал вам награду, но, пожалуйста, не могли бы вы воссоздать этот пример? Я могу дать несколько баллов о моем :) - person Szymon; 07.09.2014