Convert Figma logo to code with AI

devote logoHTML5-History-API

HTML5 History API expansion for browsers not supporting pushState, replaceState

1,007
181
1,007
18

Top Related Projects

25,667

Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser.

History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.

8,332

Manage session history with JavaScript

Turbolinks makes navigating your web application faster

8,619

HTML Standard

Quick Overview

The HTML5-History-API is a JavaScript library that provides a polyfill for the HTML5 History API. It enables developers to use the History API in browsers that don't natively support it, allowing for the creation of single-page applications with proper URL handling and browser navigation support.

Pros

  • Enables HTML5 History API functionality in older browsers
  • Simplifies the creation of single-page applications
  • Lightweight and easy to integrate
  • Well-documented with examples

Cons

  • May not be necessary for projects targeting only modern browsers
  • Requires additional JavaScript to be loaded and executed
  • Potential for conflicts with other history manipulation libraries
  • Limited maintenance and updates in recent years

Code Examples

  1. Pushing a new state:
history.pushState({ page: 2 }, "Page 2", "/page2");
  1. Replacing the current state:
history.replaceState({ page: 3 }, "Page 3", "/page3");
  1. Handling popstate events:
window.addEventListener("popstate", function(event) {
  console.log("Current state:", event.state);
});
  1. Navigating through history:
history.back();  // Go back one step
history.forward();  // Go forward one step
history.go(-2);  // Go back two steps

Getting Started

  1. Include the HTML5-History-API script in your HTML file:
<script src="https://cdn.jsdelivr.net/npm/html5-history-api@4.2.10/history.min.js"></script>
  1. Use the History API methods as you would normally:
// Push a new state
history.pushState({ page: 1 }, "Page 1", "/page1");

// Handle popstate events
window.addEventListener("popstate", function(event) {
  if (event.state) {
    console.log("Navigated to page:", event.state.page);
    // Update your application state here
  }
});
  1. Ensure your server is configured to handle HTML5 pushState URLs by serving your main HTML file for all routes.

Competitor Comparisons

25,667

Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser.

Pros of Modernizr

  • Broader feature detection capabilities, covering a wide range of HTML5 and CSS3 features
  • Active community and regular updates
  • Extensive documentation and examples

Cons of Modernizr

  • Larger file size, which may impact page load times
  • More complex setup and configuration
  • Potential overhead for projects that only need specific feature detection

Code Comparison

HTML5-History-API:

history.pushState({page: 1}, "title 1", "?page=1");
history.replaceState({page: 2}, "title 2", "?page=2");

Modernizr:

if (Modernizr.history) {
  // Use HTML5 History API
} else {
  // Fallback for older browsers
}

HTML5-History-API focuses specifically on providing a consistent History API across browsers, while Modernizr offers a comprehensive feature detection solution for various HTML5 and CSS3 features. HTML5-History-API is more lightweight and targeted, making it ideal for projects that only need History API support. Modernizr, on the other hand, provides a broader range of feature detection capabilities, making it suitable for projects that require extensive browser compatibility checks across multiple features.

History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.

Pros of history.js

  • More comprehensive cross-browser support, including older browsers
  • Offers a simpler API for common use cases
  • Provides additional features like state management and HTML4 fallback

Cons of history.js

  • Larger file size due to broader compatibility and feature set
  • Less actively maintained, with fewer recent updates
  • May include unnecessary code for modern web applications

Code Comparison

HTML5-History-API:

history.pushState({page: 1}, "Title 1", "?page=1");
history.replaceState({page: 2}, "Title 2", "?page=2");

history.js:

History.pushState({state:1}, "State 1", "?state=1");
History.replaceState({state:2}, "State 2", "?state=2");

Both libraries provide similar functionality for manipulating browser history, but history.js uses a capitalized History object, while HTML5-History-API uses the native history object.

HTML5-History-API focuses on providing a polyfill for the HTML5 History API, making it more lightweight and suitable for modern web applications. It closely mimics the native API, making it easier to transition to native support when available.

history.js, on the other hand, offers a more feature-rich solution with broader browser support, including older versions. It provides additional utilities and a slightly different API, which may be beneficial for projects requiring extensive backwards compatibility.

8,332

Manage session history with JavaScript

Pros of history

  • More actively maintained with frequent updates
  • Broader browser support, including older versions
  • Extensive documentation and examples

Cons of history

  • Larger package size
  • Steeper learning curve for beginners
  • Less focus on pure HTML5 History API implementation

Code Comparison

HTML5-History-API:

history.pushState({page: 1}, "Title 1", "?page=1");
history.replaceState({page: 2}, "Title 2", "?page=2");

history:

import { createBrowserHistory } from 'history';

const history = createBrowserHistory();
history.push('/home', { some: 'state' });
history.replace('/about', { more: 'state' });

Key Differences

  • HTML5-History-API focuses on polyfilling the native History API, while history provides a more abstracted and feature-rich approach.
  • history offers additional utilities like location parsing and memory history for non-DOM environments.
  • HTML5-History-API aims for a smaller footprint and closer adherence to the native API.

Use Cases

  • Choose HTML5-History-API for lightweight projects requiring basic history manipulation and broad compatibility.
  • Opt for history in larger applications, especially those using React Router or similar frameworks, for more advanced routing capabilities.

Turbolinks makes navigating your web application faster

Pros of Turbolinks

  • Faster page loads by replacing only the <body> content
  • Automatic handling of browser history and URL updates
  • Seamless integration with Rails applications

Cons of Turbolinks

  • Potential conflicts with JavaScript-heavy applications
  • Learning curve for developers unfamiliar with the Turbolinks lifecycle
  • May require additional configuration for certain third-party libraries

Code Comparison

HTML5-History-API:

history.pushState({page: 1}, "title 1", "?page=1");
window.addEventListener("popstate", function(e) {
    console.log("popstate event", e.state);
});

Turbolinks:

document.addEventListener("turbolinks:load", function() {
    console.log("Page loaded with Turbolinks");
});
Turbolinks.visit("/new-page");

Key Differences

  • HTML5-History-API focuses on providing a consistent API for manipulating browser history across different browsers
  • Turbolinks is a higher-level solution that aims to speed up page loads in web applications
  • HTML5-History-API requires more manual implementation of navigation behavior
  • Turbolinks automatically handles most navigation scenarios out of the box

Use Cases

  • HTML5-History-API is suitable for developers who need fine-grained control over browser history manipulation
  • Turbolinks is ideal for Ruby on Rails applications or projects seeking to improve perceived page load times with minimal configuration
8,619

HTML Standard

Pros of html

  • Comprehensive documentation of the entire HTML specification
  • Actively maintained by the WHATWG community
  • Includes detailed explanations and examples for all HTML elements and APIs

Cons of html

  • Large and complex repository, potentially overwhelming for beginners
  • Focuses on the entire HTML spec, not specifically on the History API
  • May contain more technical and formal language

Code comparison

HTML5-History-API:

history.pushState({page: 1}, "title 1", "?page=1");
history.replaceState({page: 2}, "title 2", "?page=2");

html:

<a href="?page=1" onclick="history.pushState({page: 1}, 'title 1', '?page=1'); return false;">
  Go to page 1
</a>

Summary

HTML5-History-API is a focused library for working with the HTML5 History API, providing cross-browser support and additional features. It's ideal for developers specifically interested in manipulating browser history and state.

html is the official HTML specification repository, offering comprehensive documentation on all aspects of HTML, including the History API. It's best suited for those seeking in-depth understanding of HTML standards and implementations.

Choose HTML5-History-API for a targeted solution to History API manipulation, or html for a complete reference to HTML specifications and standards.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

ENGLISH

This Javascript library provides an emulation of HTML5 History API for older browsers.

The library operates according to W3C specification, adding no new or incompatible methods. The library can be used exactly as described, for example, in Dive Into HTML5 book (http://diveintohtml5.info/history.html) or in the History API Specification (http://www.w3.org/TR/html5/browsers.html#the-history-interface).

You may install this plugin with this command:

npm install html5-history-api

Browser Support:

history.js - IE8+ and other browsers

history.ielte7.js - IE6+ and other browsers

For library developers:

To enable support for HTML5-History-API polyfill in your library, you need to add one line of code:

var location = window.history.location || window.location;

code of library looks like this:

(function(){
  // To enable support for HTML5-History-API polyfill in your library
  var location = window.history.location || window.location;

  // you library code here
  // ....
  // ....
  // ....
})();

AMD Support:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="/require.js"></script>
    <script type="text/javascript">
      requirejs(['/history'], function() {
        if (history.emulate) {
          console.log('In your browser is emulated HTML5-History-API');
        } else {
          console.log('In your browser is natively support HTML5-History-API');
        }
      });
    </script>
  </head>
  <body>
  </body>
</html>

Example of using the library in the pure JS context:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="history.js"></script>
    <script type="text/javascript">
      (function(eventInfo) {
        // we get a normal Location object

        /*
         * Note, this is the only difference when using this library,
         * because the object window.location cannot be overriden,
         * so library the returns generated "location" object within
         * an object window.history, so get it out of "history.location".
         * For browsers supporting "history.pushState" get generated
         * object "location" with the usual "window.location".
         */
        var location = window.history.location || window.location;

        // hang on the event, all references in this document
        document[eventInfo[0]](eventInfo[1] + 'click', function(event) {
          event = event || window.event;
          var target = event.target || event.srcElement;
          // looking for all the links with 'ajax' class found
          if (target && target.nodeName === 'A' &&
             (' ' + target.className + ' ').indexOf(' ajax ') >= 0)
          {
            // keep the link in the browser history
            history.pushState(null, null, target.href);

            // here can cause data loading, etc.

            // do not give a default action
            if (event.preventDefault) {
              event.preventDefault();
            } else {
              event.returnValue = false;
            }
          }
        }, false);

        // hang on popstate event triggered by pressing back/forward in browser
        window[eventInfo[0]](eventInfo[1] + 'popstate', function(event) {

          // here can cause data loading, etc.

          // just post
          alert("We returned to the page with a link: " + location.href);
        }, false);
      })(window.addEventListener ? ['addEventListener', ''] : ['attachEvent', 'on']);
    </script>
  </head>
  <body>
    <a class="ajax" href="/mylink.html">My Link</a>
    <a class="ajax" href="/otherlink.html">Other Link</a>
  </body>
</html>

Example of using the library along with JQuery:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="history.js"></script>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
      $(function() {
        // we get a normal Location object

        /*
         * Note, this is the only difference when using this library,
         * because the object window.location cannot be overriden,
         * so library the returns generated "location" object within
         * an object window.history, so get it out of "history.location".
         * For browsers supporting "history.pushState" get generated
         * object "location" with the usual "window.location".
         */
        var location = window.history.location || window.location;

        // looking for all the links and hang on the event, all references in this document
        $(document).on('click', 'a.ajax', function() {
          // keep the link in the browser history
          history.pushState(null, null, this.href);

          // here can cause data loading, etc.

          // do not give a default action
          return false;
        });

        // hang on popstate event triggered by pressing back/forward in browser
        $(window).on('popstate', function(e) {

          // here can cause data loading, etc.

          // just post
          alert("We returned to the page with a link: " + location.href);
        });
      });
    </script>
  </head>
  <body>
    <a class="ajax" href="/mylink.html">My Link</a>
    <a class="ajax" href="/otherlink.html">Other Link</a>
  </body>
</html>

Advanced library configuration:

history.js?basepath=/pathtosite/ - the base path to the site; defaults to the root "/".
history.js?redirect=true - enable link translation.
history.js?type=/ - substitute the string after the anchor; by default "/".

You can also combine options:

history.js?type=/&redirect=true&basepath=/pathtosite/ - the order of options does not matter.

Or execute special method in JavaScript:

history.redirect(/* type = */ '/', /* basepath = */ '/pathtosite/');

Demo Site: http://history.spb-piksel.ru/ or http://devote.github.io/demos/history/

Follow me on Twitter: https://twitter.com/DimaPakhtinov


РУССКИЙ (Russian)

Библиотека эмулирует HTML5 History API в старых браузерах.

Библиотека, которая не добавляет ненужные методы, заставляя их изучать, а оперирует по спецификации w3c, по интерфейсу History.

Для примера могу привести короткий код как с ней работать.

По принципу мы работаем с HTML5 History API так как описано, например, тут http://htmlbook.ru/html5/history или по спецификации http://www.w3.org/TR/html5/history.html#the-history-interface

Вы можете установить плагин с помощью команды:

npm install html5-history-api

Поддержка браузеров:

history.js - IE8+ и другие браузеры

history.ielte7.js - IE6+ и другие браузеры

Для разработчиков библиотек:

Для включения поддержки плагина HTML5-History-API polyfill в своих библиотеках, добавьте строку кода:

var location = window.history.location || window.location;

код будет выглядеть примерно так:

(function(){
  // Включает поддержку плагина HTML5-History-API polyfill
  var location = window.history.location || window.location;

  // код вашей библиотеки
  // ....
  // ....
  // ....
})();

Поддержка AMD:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="/require.js"></script>
    <script type="text/javascript">
      requirejs(['/history'], function() {
        if (history.emulate) {
          console.log('В вашем браузере эмулируется HTML5-History-API');
        } else {
          console.log('В вашем браузере есть поддержка HTML5-History-API');
        }
      });
    </script>
  </head>
  <body>
  </body>
</html>

Коротенький пример на чистом JS:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="history.js"></script>
    <script type="text/javascript">
      (function(eventInfo) {
        // получаем нормальный объект Location

        /*
         * заметьте, это единственная разница при работе с данной библиотекой,
         * так как объект window.location нельзя перезагрузить, поэтому
         * библиотека history возвращает сформированный "location" объект внутри
         * объекта window.history, поэтому получаем его из "history.location".
         * Для браузеров поддерживающих "history.pushState" получаем
         * сформированный объект "location" с обычного "window.location".
         */
        var location = window.history.location || window.location;

        // вешаем события на все ссылки в нашем документе
        document[eventInfo[0]](eventInfo[1] + 'click', function(event) {
          event = event || window.event;
          var target = event.target || event.srcElement;
          // ищем все ссылки с классом 'ajax'
          if (target && target.nodeName === 'A' &&
             (' ' + target.className + ' ').indexOf('ajax') >= 0)
          {
            // заносим ссылку в историю
            history.pushState(null, null, target.href);

            // тут можете вызвать подгрузку данных и т.п.

            // не даем выполнить действие по умолчанию
            if (event.preventDefault) {
              event.preventDefault();
            } else {
              event.returnValue = false;
            }
          }
        }, false);

        // вешаем событие на popstate которое срабатывает при нажатии back/forward в браузере
        window[eventInfo[0]](eventInfo[1] + 'popstate', function(event) {

          // тут можете вызвать подгрузку данных и т.п.

          // просто сообщение
          alert("We returned to the page with a link: " + location.href);
        }, false);
      })(window.addEventListener ? ['addEventListener', ''] : ['attachEvent', 'on']);
    </script>
  </head>
  <body>
    <a class="ajax" href="/mylink.html">My Link</a>
    <a class="ajax" href="/otherlink.html">Other Link</a>
  </body>
</html>

А теперь показываю пример в связке с jQuery:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="history.js"></script>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
      $(function() {
        // получаем нормальный объект Location

        /*
         * заметьте, это единственная разница при работе с данной библиотекой,
         * так как объект window.location нельзя перезагрузить, поэтому
         * библиотека history возвращает сформированный "location" объект внутри
         * объекта window.history, поэтому получаем его из "history.location".
         * Для браузеров поддерживающих "history.pushState" получаем
         * сформированный объект "location" с обычного "window.location".
         */
        var location = window.history.location || window.location;

        // ищем все ссылки и вешаем события на все ссылки в нашем документе
        $(document).on('click', 'a.ajax', function() {
          // заносим ссылку в историю
          history.pushState(null, null, this.href);

          // тут можете вызвать подгрузку данных и т.п.

          // не даем выполнить действие по умолчанию
          return false;
        });

        // вешаем событие на popstate которое срабатывает при нажатии back/forward в браузере
        $(window).on('popstate', function(e) {

          // тут можете вызвать подгрузку данных и т.п.

          // просто сообщение
          alert("Мы вернулись на страницу со ссылкой: " + location.href);
        });
      });
    </script>
  </head>
  <body>
    <a class="ajax" href="/mylink.html">My Link</a>
    <a class="ajax" href="/otherlink.html">Other Link</a>
  </body>
</html>

Вы можете использовать дополнительные параметры конфигурации библиотеки:

history.js?basepath=/pathtosite/ - базовый путь к сайту, по умолчанию имеет значение корня "/".
history.js?redirect=true - включить преобразование ссылок.
history.js?type=/ - подставлять подстроку после якоря, по умолчанию имеет символ "/".

Также вы можете комбинировать опции:

history.js?type=/&redirect=true&basepath=/pathtosite/ - порядок опций не имеет значение.

Или выполнить специальный метод в JavaScript:

history.redirect(/* type = */ '/', /* basepath = */ '/pathtosite/');

Демо-сайт: http://history.spb-piksel.ru/ или http://devote.github.io/demos/history/

Я в Twitter: https://twitter.com/DimaPakhtinov

NPM DownloadsLast 30 Days