2010-10-25 4 views
168

Я изучаю API-интерфейс истории HTML5 для решения проблем с глубоким связыванием с загруженным контентом AJAX, но я изо всех сил стараюсь сойти с ума. Кто-нибудь знает о хороших ресурсах?Хороший учебник по использованию API истории HTML5 (Pushstate?)

Я хочу использовать это, поскольку это, по-видимому, отличный способ разрешить возможность отправки этих ссылок, возможно, не включил JS. Многие решения терпят неудачу, когда кто-то с JS отправляет ссылку кому-то без.

Мои первоначальные исследования, похоже, указывают на API истории в JS и метод pushState.

http://html5demos.com/history

ответ

179

Для большого учебника сетевого разработчика страницы Mozilla на этой функции все, что вам нужно: https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history

К сожалению, API истории HTML5 реализован по-разному во всех браузерах HTML5 (что делает его непоследовательным и багги) и не имеет резервов для браузеров HTML4. К счастью, History.js обеспечивает кросс-совместимость для браузеров HTML5 (гарантируя, что все браузеры HTML5 работают так, как ожидалось) и необязательно предоставляет хеш-резерв для браузеров HTML4 (включая поддерживаемую поддержку данных, заголовков, функций pushState и replaceState).

Вы можете прочитать больше о History.js здесь: https://github.com/browserstate/history.js

Для статьи о Hashbangs VS хэши VS История HTML5 API, смотрите здесь: https://github.com/browserstate/history.js/wiki/Intelligent-State-Handling

+25

Бесстыдная самозарядка. Отличная почта и плагин. :) – Purag

2

Вы можете взглянуть на этот плагин JQuery. У них есть много примеров на их сайте. http://www.asual.com/jquery/address/

+0

Опять же, это решение кажется неудачным, когда JS выключен. Я думаю, что API истории имеет право работать вместе с modrewrite, так что ссылки всегда обрабатываются сервером первым, без необходимости перенаправления с уровня JS. –

+0

Вы на правильном пути с помощью modrewrite. Решение управления API-интерфейсом истории и обработки, когда пользователь не имеет JS, действительно является двумя отдельными вещами. Если у вас нет JS, вы должны обрабатывать пользователя со стандартными ответами hrefs и server. API истории может быть создан как «хороший, чтобы иметь», если браузер пользователя поддерживает его. –

+0

Оба экземпляра Express и State, которые отправляются с jQuery Address 1.3, работают достаточно хорошо, когда JavaScript отключен. Второй использует PHP с mod_rewrite. – Rostislav

1

если JQuery доступен, вы можете использовать jQuery BBQ

+0

Кажется, что сбой JS отключен. –

+0

это, вероятно, правда - не просмотрел его. Я бы подумал, что у вас будет эта проблема со всеми подходами на основе js-library. Они основаны на манипулировании хэш-частью URL-адреса. – sprugman

+1

, что является точкой API истории HTML5 - он ничего не сломал (https://github.com/balupton/history.js/wiki/Intelligent-State-Handling) – balupton

4

Вы можете попробовать Davis.js, это дает вам маршрутизации в вашем JavaScript, используя pushState, когда он доступен, и без JavaScript, он позволяет вашему серверному коду обрабатывать запросы.

33

Мне очень понравилось «Погружение в HTML 5». Объяснение и демонстрация проще и точнее. История глава - http://diveintohtml5.info/history.html и история демо - http://diveintohtml5.info/examples/history/fer.html

+1

Отличный учебник. URL стал http://diveintohtml5.info тем временем; может потребоваться обновить ответ. –

24

Имейте в виду, при использовании HTML5 PushState если а пользователь копирует или закладки глубокая связь и посещения его снова, то что будет прямым ударом сервера, который будет 404, поэтому вам нужно быть готовым к этому, и даже библиотека jstststststst не поможет. Самым простым решением является добавление правила перезаписи к серверу Nginx или Apache так:

Apache (в вашем случае виртуальный хост вы используете один):

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/
    RewriteRule ^index\.html$ - [L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . /index.html [L] 
</IfModule> 

Nginx

rewrite ^(.+)$ /index.html last; 
+0

Это реальный ответ. Это нигде не содержится в wiki/учебниках Balupton's History.js и т. Д. На самом деле, History.js не используют хэш, поэтому вам нужно использовать перенаправление .htaccess! – Grsmto

+13

В идеале ваш сервер/приложение должно отвечать на маршрут соответствующим образом без необходимости перезаписи. – sholsinger

+0

Согласовано, за исключением многих современных фреймворков JavaScript, таких как Backbone.js, Spine, Ember и т. Д. Это все приложения «одна страница» JavaScript. Можно было бы разработать решение для обслуживания шаблона записи для SEO, ect, но в то же время это было бы необходимо. –

2

Я написал очень простую абстракцию маршрутизатора поверх истории.js, называемый StateRouter.js. Он находится на очень ранних этапах разработки, но я использую его как решение для маршрутизации в одностраничном приложении, которое я пишу. Как и вы, я обнаружил, что History.js очень сложно понять, тем более, что я совершенно новичок в JavaScript, пока не понял, что вам действительно нужна (или должна иметь) абстракция маршрутизации поверх нее, поскольку она решает проблему низкого уровня проблема.

Этот простой пример кода должен показать, как он используется:

var router = new staterouter.Router(); 
// Configure routes 
router 
    .route('/', getHome) 
    .route('/persons', getPersons) 
    .route('/persons/:id', getPerson); 
// Perform routing of the current state 
router.perform(); 

Вот немного fiddle я придумана для того, чтобы продемонстрировать его использование.

+1

Эта скрипка не работает для меня в Chrome on макинтош Это вызывает ошибку. (Uncaught ReferenceError: staterouter не определен) – DrewT

+0

@DrewT Спасибо, скрипка была сломана из-за изменения на github.com, но я работал вокруг нее. – aknuds1

+0

Yup, теперь работаю за быстрый ответ. – DrewT

4

HTML5 history spec является изворотливым.

history.pushState() не отправляет сообщение popstate или загружает новую страницу самостоятельно. Это предназначалось только для того, чтобы подтолкнуть государство к истории. Это функция отмены для одностраничных приложений. Вам необходимо вручную отправить событие popstate или использовать history.go(), чтобы перейти в новое состояние. Идея заключается в том, что маршрутизатор может прослушивать popstate событий и делать навигацию для вас.

Некоторые вещи, чтобы отметить:

  • history.pushState() и history.replaceState() не отправлять popstate события.
  • history.back(), history.forward(), а кнопки назад и вперед браузера отправляют popstate событий.
  • history.go() и history.go(0) сделать полную перезагрузку страницы и не отправлять popstate события.
  • history.go(-1) (назад 1 страница) и history.go(1) (вперед 1 страница) делать отправка popstate события.

Вы можете использовать API истории, как это, чтобы нажать новое состояние и отправить всплывающее событие.

history.pushState({message:'New State!'}, 'New Title', '/link'); window.dispatchEvent(new PopStateEvent('popstate', { bubbles: false, cancelable: false, state: history.state }));

Тогда слушайте popstate событий с маршрутизатором.

+1

Является ли это просто мной, или 'new PopStateEvent (...)' похоже, не работает в IE11? Есть ли обходной путь, о котором все знают? –

+0

Похоже, что IE 11 нуждается в чем-то вроде: 'var pop_state_event = document.createEvent ('Event'); pop_state_event.initEvent ('popstate', true, true); window.dispatchEvent (pop_state_event); ' –