# Pjax [![Build Status](https://img.shields.io/travis/MoOx/pjax.svg)](https://travis-ci.org/MoOx/pjax) > Easily enable fast AJAX navigation on any website (using pushState() + XHR) Pjax is **a standalone JavaScript module** that uses [AJAX](https://developer.mozilla.org/en-US/docs/Web/Guide/AJAX) (XmlHttpRequest) and [pushState()](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history) to deliver a fast browsing experience. _It allows you to completely transform the user experience of standard websites (server-side generated or static ones) to make users feel like they are browsing an app, especially for those with low bandwidth connections._ **No more full page reloads. No more multiple HTTP requests.** _Pjax does not rely on other libraries, like jQuery or similar. It is written entirely in vanilla JS._ ## Installation - You can link directly to the [bundle](https://cdn.jsdelivr.net/npm/pjax/pjax.js): ```html ``` - Or the [minified bundle](https://cdn.jsdelivr.net/npm/pjax/pjax.min.js): ```html ``` - You can also install Pjax from **npm**: ```shell npm install pjax ``` **Note**: If you use this option, you will need to do one of the following: - Link a script tag to either `pjax.js` or `pjax.min.js`. E.g.: ```html ``` - Use a bundler like Webpack. (`index.js` cannot be used in the browser without a bundler). - Or you can clone the repo and build the bundle from the source using npm: ```shell git clone https://github.com/MoOx/pjax.git cd pjax npm install npm run build ``` and then link a script tag to either `pjax.js` or `pjax.min.js`. E.g.: ```html ``` --- ## What Pjax Does _Under the hood, it's just ONE HTTP request with a `pushState()` call._ Pjax loads pages using AJAX and updates the browser's current URL using `pushState()` _without_ reloading your page's layout or any resources (JS, CSS), giving a fast page load. It works with all permalinks and can update all the parts of the page you want (including HTML metas, title, and navigation state). In the case of [browsers that don't support `history.pushState()`](http://caniuse.com/#search=pushstate), Pjax gracefully degrades and does not do anything at all. Additionally, Pjax: - Is not limited to one container, like jQuery-Pjax is. - Fully supports browser history (back and forward buttons). - Supports keyboard browsing. - Automatically falls back to standard navigation for external pages (thanks to Captain Obvious's help). - Automatically falls back to standard navigation for internal pages that do not have an appropriate DOM tree. - Allows for CSS transitions (animations) very easily. - Is only around 6kb (minified and gzipped). ## How Pjax Works - It listens to every click on links _you want_ (by default all of them). - When an internal link is clicked, Pjax fetches the page's HTML via AJAX. - Pjax renders the page's DOM tree (without loading any resources - images, CSS, JS, etc). - It checks that all defined parts can be replaced: - If the page doesn't meet the requirements, standard navigation is used. - If the page meets the requirements, Pjax does all defined DOM replacements. - Then it updates the browser's current URL using `pushState()`. ## Overview _Pjax is fully automatic_. You don't need to change anything about your existing HTML, you just need to designate which elements on your page that you want to be replaced when your site is navigated. Consider the following page. ```html My Cool Blog

My Cool Blog

Thanks for stopping by! Click Here to find out more about me.

``` We want Pjax to intercept the URL `/about`, and replace `.the-content` with the resulting content of the request. It would also be nice if we could replace the `