Хороший учебник по использованию HTML5 History API (Pushstate?) [Закрыто]

160

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

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

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

http://html5demos.com/history

Теги:
html5-history
pushstate

9 ответов

172
Лучший ответ

Для большого учебного пособия доступна страница Mozilla Developer Network по этой функции: 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 Hashes VS API HTML5 History API см. здесь: https://github.com/browserstate/history.js/wiki/Intelligent-State-Handling

  • 25
    Бесстыдная самостоятельная вилка. Отличный пост и плагин, хотя. :)
32

Я много выиграл от "Dive to HTML 5". Объяснение и демонстрация проще и точнее. Глава истории - http://diveintohtml5.info/history.html и демо-версия истории - http://diveintohtml5.info/examples/history/fer.html

  • 1
    Отличный учебник действительно. Тем временем URL стал diveintohtml5.info ; возможно, захотите обновить ответ.
27

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

Apache (в вашем vhost, если вы используете его):

<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
    Это реальный ответ. Этого нигде нет в вики / руководствах Balupton's History.js и т. Д. На самом деле History.js не использует хеш, поэтому вам нужно использовать перенаправление .htaccess!
  • 13
    В идеале ваш сервер / приложение должно отвечать на маршрут соответствующим образом без необходимости перезаписи.
Показать ещё 2 комментария
4

история HTML5 - это изворотливость.

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);
4

Вот отличный скриншот на тему Райана Бейтса из railscasts. В конце он просто отключает функцию ajax, если метод history.pushState недоступен:

http://railscasts.com/episodes/246-ajax-history-state

4

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

2

Я написал очень простую абстракцию маршрутизатора поверх History.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 на Mac. Выдает ошибку. (Uncaught ReferenceError: staterouter не определен)
  • 0
    @DrewT Спасибо, скрипка сломалась из-за изменений на github.com, но я обошел ее.
Показать ещё 1 комментарий
2

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

  • 0
    Снова, это решение, кажется, терпит неудачу, когда JS выключен. Я думаю, что API истории может работать совместно с modrewrite, так что ссылки всегда обрабатываются сервером в первую очередь, без необходимости перенаправления со слоя JS.
  • 0
    Вы находитесь на правильном пути с Modrewrite. Решение об управлении API истории и обработке, когда у пользователя нет JS, на самом деле две разные вещи. Если у вас нет JS, вы должны обрабатывать пользователя с помощью стандартных ссылок и ответов сервера. API истории можно построить как «приятно иметь», если браузер пользователя поддерживает его.
Показать ещё 3 комментария
1

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

  • 0
    Похоже, что это не с JS выключен.
  • 0
    это, вероятно, правда - не смотрел на это. Я думаю, что у вас возникнет такая проблема со всеми подходами на основе js-библиотек. Они основаны на манипулировании хэш-частью URL.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню