One of the hardest things with a pushstate navigation is to handle and take care of all the Javascript states/events in the different pages.

Barba.js gives a nice helper that will help you to associate a Container with a View.

All the transitions need to extend the Barba.BaseView object.

To associate a View with a Container, it's enough to specify a common namespace:

<div class="barba-container" data-namespace="homepage">
var Homepage = Barba.BaseView.extend({
                    namespace: 'homepage',
                    onEnter: function() {
                    // The new Container is ready and attached to the DOM.
                    onEnterCompleted: function() {
                    // The Transition has just finished.
                    onLeave: function() {
                    // A new Transition toward a new page has just started.
                    onLeaveCompleted: function() {
                    // The Container has just been removed from the DOM.
// Don't forget to init the view!

It's suggested to .init() the Views before calling Pjax.start() - In this way Pjax.start() will emit onEnter() and onEnterCompleted() for the current view.

If you don't like data-namespace you can change it, see the Dom API section.