Где разместить javascript для инициализации страницы при использовании pjax?

В большинстве случаев я добавляю некоторый код javascript в $(document).ready для выполнения некоторых действий по инициализации на странице, таких как привязка событий и т. д.

Но теперь я хотел бы использовать pjax https://github.com/defunkt/jquery-pjax для некоторых моих страниц.

С pjax, поскольку обновляется только часть страницы, $(document).ready больше не будет вызываться.

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

Спасибо.


person larryzhao    schedule 14.03.2012    source источник


Ответы (3)


Я думаю, что вам лучше всего, вероятно, просто сделать то, что вы сказали, и подключить код инициализации вашей страницы к событию «pjax: end». Таким образом, он, по сути, будет выполнять ту же работу, что и раньше, и работать с любым html, загруженным в DOM.

person Carl    schedule 19.03.2012

Вы можете легко связать весь свой существующий код с событиями document.ready и pjax:success, например:

До:

$(document).ready(function() {
    // page load stuff
});

После:

$(document).on('ready pjax:success', function() {
    // will fire on initial page load, and subsequent PJAX page loads
});
person Adrian Macneil    schedule 16.05.2012
comment
Что делать, если код инициализации для каждой страницы разный? - person shreyj; 10.11.2014
comment
Потрясающий!! Большое спасибо за это. - person Steve Bauman; 18.02.2016
comment
@Adrian Macneil - Что мне делать, если код инициализации отличается для каждой страницы? - person Юрий Светлов; 24.02.2016
comment
@Vonfry Я использую страницу местоположения window.location.pathname - person Юрий Светлов; 01.05.2017

Я придумал это изящное решение. Сначала вы начинаете с создания пространства имен для ваших привязок в глобальной области:

// Binder for PJAX init functions

$.fn.bindPJAX = {}; // Create namespace

function bindPJAX(functionName) {
  // Check function existence, then call it
  return $().bindPJAX[functionName] && $().bindPJAX[functionName]();
}

Затем привяжите обратный вызов к кликам PJAX:

$(document).ready(function(){
  if ($.support.pjax) {
    $('a[data-pjax]').on('click', function(event) {

      var container = '#main';
      var emptyRoute = 'feed'; // The function that will be called on domain's root

      // Store current href without domain
      var link = event.currentTarget.href.replace(/^.*\/\/[^\/]+\//, '');
      var target = link === "" ? emptyRoute : link;

      // Bind href-specific asynchronous initialization
      $(document).on('ready pjax:success', container, function() {
        bindPJAX(target); // Call initializers
        $(document).off('ready pjax:success', container); // Unbind initialization
      });

      // PJAX-load the new content
      $.pjax.click(event, {container: $(container)});

    })
  }
});

Когда это настроено, вы можете приступить к расширению объекта $.fn.bindPJAX, чтобы добавить функции, которые будут соответствовать имени вашего маршрута. Например, это в глобальной области видимости будет вызываться при доступе к http://www.yourdomain.com/admin через PJAX:

$.extend($.fn.bindPJAX, {
  admin: function(){
    // Initialization script for /admin route
  }
});

Вы также должны рассмотреть жизнеспособный запасной вариант DRY, когда PJAX не работает или не поддерживается, например, запуск правильной функции инициализации при первой загрузке страницы путем проверки window.location в javascript или, возможно, жесткого кодирования ее в представлениях вашего приложения.

person Christophe Marois    schedule 18.02.2013