Это всего лишь мокап, который я накидал за 20 минут "на коленке" и он требует доработки, но уже сейчас этот js-скрипт позволит простым сайтам работать без перезагрузки страниц.

Для примера, можно сёрфить по нодам в блоге или переходить из редактирования ноды в режим просмотра ноды. В большей степени, продолжают корректно работать ajax-ссылки, созданные, например, с помощью views.

Код

$('a:not(.use-ajax)').click(function () {
  var url = $(this).attr('href');
  if (url && url != '#') {
    $('html').load(url, {}, function (html, status, request) {
      if(status == 'success') {
        window.history.pushState("object or string", "Title", url);
      }
    });
    return false;
  }
});

Проблемы

Сейчас я нашел несколько проблем:

  1. Не работает "Admin menu" при кэшировании на клиенте

    admin-menu

  2. Главная проблема: весь приходящий html записывается в body, что не позволяет использовать метатеги и менять заголовок во вкладке.

То, что работает

  1. Работает загрузка страниц внутри одной темы
  2. Работает Drupal-ajax. В частности, проверял работу ссылок с использованием класса use-ajax.

P.S.

  1. Не стоит рассматривать этот скрипт как продакшн-версию. Но может быть с помощью прохожих и великой силы комментариев мы, таки сможем превратить это в рабочий скрипт.
  2. Существуют другие технологии делающие тоже самое:
    1. Модуль Ajax pages
    2. Пост Simple Drupal AJAX load with jQuery and delivery callback англ.
    3. Модуль RefreshLess (Drupal 8)
    4. Ruby on Rails имеет очень популярный гем Turbolinks , который отлично справляется с этой задачей

Другие посты