当使用pjax时,页面在哪里初始化javascript?

当使用pjax时,页面在哪里初始化javascript?,javascript,pjax,Javascript,Pjax,大多数情况下,我会在$(文档)中放入一些javascript代码。准备好在页面上执行一些初始化操作,如事件绑定等 但是现在我想对我的一些页面使用pjax 使用pjax,因为只有部分页面被刷新,$(document.ready将不会再次被调用 我可以在eventpjax:end上手动触发初始化脚本,但我也想知道是否有更好的解决方案 谢谢。我认为您最好的选择可能就是按照您所说的去做,并将特定于页面的init代码连接到“pjax:end”事件。这样一来,它将基本上完成与以前相同的工作,并针对加载到DO

大多数情况下,我会在
$(文档)中放入一些javascript代码。准备好在页面上执行一些初始化操作,如事件绑定等

但是现在我想对我的一些页面使用
pjax

使用pjax,因为只有部分页面被刷新,
$(document.ready
将不会再次被调用

我可以在event
pjax:end
上手动触发初始化脚本,但我也想知道是否有更好的解决方案


谢谢。

我认为您最好的选择可能就是按照您所说的去做,并将特定于页面的init代码连接到“pjax:end”事件。这样一来,它将基本上完成与以前相同的工作,并针对加载到DOM中的任何html运行。

您可以轻松地将所有现有代码链接到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
});

我想出了这个巧妙的解决办法。首先在全局范围内为绑定创建名称空间:

// 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
  }
});

当PJAX失败或不支持时,你也应该考虑一个可行的干后退,比如通过检查“代码”>窗口,在JavaScript中的位置< /代码>,或者在你的应用程序的视图中硬编码,启动第一个页面上的正确的init函数。< /p>如果每个页面的初始化代码不同,我能做什么?太棒了!!非常感谢。@Adrian Macneil-如果每个页面的初始化代码不同,我该怎么办?@Vonfry我使用位置页面
window.location.pathname